设置主机防火墙规则(iptables规则设置)

一、什么是firewalld防火墙?

firewalld防火墙在Linux主机里其实就是一道隔离工具,它只对进出主机的请求做判断处理。也就是说它只管进出,至于你进来后做了什么,就不在firewalld的管辖范围了。firewalld工作与网络的边缘,它根据我们事先指定好的规则判断请求报文在不在规则之内,在的话,允许通过,不在,拒之门外,这就是firewalld。

二、那么firewalld有哪些规则呢?怎么设置防火墙规则呢?

说起有哪些规则?emmmm……这就不好说了,因为规则都是人来设置的,你想设置什么规则,就有什么规则(当然是在功能的允许范围内啦)。可以指定协议、端口、报文类型等来设置拒绝访问规则,如:DROP、REJECT(两者有点小不同,后面会具体说);也可以通过设置关键字来判定允不允许报文通过,当然,这些都得你理解了才能操作。

在操作之前,你还得知道firewalld可以在哪里通过什么方式添加规则,也就是firewalld的四表五链啦,那么就先说下五链吧,因为五链是包含在四表之内的,所以我们学习就由内向外开始吧。

五链
1、PREROUTING
数据包进入路由表之前(用于目标地址转换(DNAT)。)
2、INPUT
通过路由表后目的地为本机
3、FORWORD
通过路由表后,目的地不为本机
4、OUTPUT
由本机产生,向外转发
5、POSTROUTING
发送到网卡接口之前。(用于源地址转换(SNAT))

看到上面每个链的作用是不是一脸懵逼,完全不懂这是什么?哈哈,不要着急,我刚看到时也是一脸懵逼,不过学完后,我就更加懵逼啦,这究竟是什么鬼?完全颠覆了我的IT观,因为我所理解的设置位置完全和实际的设置位置不一样所以呢,emmmm,希望你不要带着自己的主观思想去学习理解firewalld规则设置,不然会很吃力。

呐呐呐,五链说完了,先不用管它是什么,有个概念就可以了,下面来看看四表:

四表
表是由链组成,来完成不同的功能,iptables中默认有4个表,以及默认包含的链
1、filter:一般的过滤功能
  filter 是用于存放所有与防火墙相关操作的默认表。
    INPUT
    FORWARD
    OUTPUT
  filter表有两种规则模式
    目标IP为本机IP的,启动本机防火墙规则,只经过INPUT链和OUTPUT链。
    目标IP为外网IP的,启动网络防火墙规则,经过INPUT链、FORWARD链和OUTPUT链。
2、nat:用于nat功能(端口映射,地址映射等)
    PREROUTING
    INPUT
    OUTPUT
    POSTROUTING
3、mangle:用于对特定数据包的修改
    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING
4、raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
    INPUT
    OUTPUT
    FORWARD

可以看到,每个表中都包含相对应的链,我们要做的操作是在链上进行,但是要先指明是在那个表的链上操作,每个表的功能又不一样,所以呢,我们要做的就是先搞明白每个表都有什么功能?这个表有哪些链?这些链又可以进行哪些操作,都搞明白了,就可以操作了!

是不是很迫不及待的想去主机上操作一把iptables?NO!NO!NO!现在还不行,因为你还不知道iptables有哪些命令,都是干嘛的这些命令,所以呢,下面我们就来看下iptables的命令。(呀,我是不是还没有说为什么我们要学习的是firewalld,现在怎么再说iptables呀,其实这个很简单,firewalld是基于内核的一个网络隔离工具,它的规则是靠iptables来调用和设置的,就和食物在锅里,你要用碗盛来吃一个道理。)

iptables命令
  命令格式:
    iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
选项含义
  链管理
    -N:new, 自定义一条新的规则链;
    -X: delete,删除自定义的规则链;删除需要同时满足下面三个条件
    1.引用计数为0
    2.没有规则的空链
    3.自定义的链
    -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
    ACCEPT:接受
    DROP:丢弃
    REJECT:拒绝
    -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
  查看
    -L:list, 列出指定鏈上的所有规则;下面是修饰L的几个选项,
    -n:numberic,以数字格式显示地址和端口号;
    -v:verbose,详细信息;
    -x:exactly,显示计数器结果的精确值;
    –line-numbers:显示规则的序号;
  规则管理
    -A:append,追加;
    -I:insert, 插入,要指明位置,省略时表示第一条;
    -D:delete,删除;
    (1) 指明规则序号;
    (2) 指明规则本身;
    -R:replace,替换指定链上的指定规则;
    -F:flush,清空指定的规则链;
    -Z:zero,置零;
  iptables的每条规则都有两个计数器:
    (1) 匹配到的报文的个数;
    (2) 匹配到的所有报文的大小之和;
  匹配条件
    基本匹配条件: 无需加载任何模块,由iptables/netfilter自行提供
    -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
    -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
    -p, --protocol protocol,指定协议,常用的有tcp,udp,icmp
    -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
    -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
  隐式扩展
    不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;--tcp
    --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
    --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
    --tcp-flags mask comp,其中mask是一个列表,可以是 SYN,ACK,FIN,RST,comp是mask列表中必须被设置为1的标志。例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,中SYN必须为1,余下的必须为0;
    --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
    不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;--udp
    --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
    --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
    不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;--icmp
    --icmp-type {type[/code]|typename}
  显式扩展
    必须使用-m选项指明要调用的扩展模块的扩展机制;
    multiport:以离散或连续的 方式定义多端口匹配条件,最多15个;这里最多15个指的是,比如20:25这样指定的话只算2个端口。而不是算6个端口。
    iprange:以连续地址块的方式来指明多IP地址匹配条件;
    --src-range from[-to]
    --dst-range from[-to]
    time:根据将报文到达的时间与指定的时间范围进行匹配,常用的选项
    --timestart hh:mm[:ss]
    --timestop hh:mm[:ss]
    --weekdays day[,day...]
    --monthdays day[,day...]
    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --kerneltz:使用内核配置的时区而非默认的UTC;
    --string:对报文中的应用层数据做字符串模式匹配检测
    --algo {bm|kmp}:字符串匹配检测算法;
    --string pattern:要检测的字符串模式;
    --hex-string pattern:要检测的字符串模式,16进制格式;
    connlimit :根据每客户端IP做并发连接数数量匹配;
    --connlimit-upto n:连接的数量小于等于n时匹配;
    --connlimit-above n:连接的数量大于n时匹配;
  limit: 基于收发报文的速率做匹配
    --limit rate[/second|/minute|/hour|/day] ##最大速率
    --limit-burst number ##表示最大能接受多少个请求
    state:根据”连接追踪机制“去检查连接的状态;
    --state STATE
    conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
     - NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
    - ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
    - RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
    - INVALID:无效的连接;
    - UNTRACKED:未进行追踪的连接;
  处理动作
    ACCEPT:接受
    DROP:丢弃
    REJECT:拒绝
    RETURN:返回调用链
    REDIRECT:端口重定向
    LOG:记录日志
    MARK:做防火墙标记
    DNAT:目标地址转换
    SNAT:源地址转换
    MASQUERADE:地址伪装

哇,是不是看到上面那么多命令和选项,顿时一个脑袋两个大啦,其实我刚看到时也是望而却步,这么多???是在逗老子吗?本来就不怎么聪明的我,怎么能记住这么多???其实呀,那么多命令超过80%都是不常用的,你可以选择性的是记忆和整理,我做的全一点是因为以后如果遇到那个命令了,我也方便找到它,知道它什么意思,鬼知道未来那个大佬会写一个很牛批的服务,冷不丁的就用到了这个命令,而我不知道也找不到,多尴尬呀是不?闲话说了很多,下面就开始实操咯!!(怎么觉得有点小兴奋呢???)

案例实操

filter表
  iptables -F:清空所有策略
  iptables -X:清空自定义链(此步骤之前一定要先清空)
  iptables -N old_forward:自定义一个链
  iptables -E old_forward new_forward:修改自定义链的名字
  iptables -P FORWARD DROP:把filter中forward链的默认策略打成drop
  iptables -L -n --line-number:查看filter表中的策略并且显示行数
  iptables -t filter -D FORWARD 9:删除filter表中forward链中的第9条策略
  iptables -t filter -A INPUT -s 0.0.0.0/0 -d 192.168.254.24 -p icmp -j REJECT:限制所有主机(0.0.0.0)拒绝ping本主机
  iptables -t filter -A INPUT -d 192.168.254.24 -i ens33 -p icmp -j REJECT:显示所有主机(0.0.0.0)拒绝通过ens33网卡ping本主机
实操:
  开始操作之前,先:iptables -t filter -F和iptables -t filter -X 清空filter表的所有规则。(firewalld要是开启状态哦,你也可以看下开启后的默认规则:iptables  -t filter -L -n)
  禁止本机ping通:iptables -t filter -A INPUT -s 0.0.0.0/0 -d 虚拟机IP -p icmp -j REJECT(使用REJECT会显示连接不到端口)

            iptables -t filter -A INPUT -d 虚拟机IP  -p icmp -j DROP(会显示请求超时)

   可以看出REJECT是你的数据包来了,我收到了,但是我拒绝回复你;而DROP是我收没收到都不会告诉你,直接将数据包丢弃。

nat表
  #源地址为192.168.250.0网段的ip地址经过防火墙都转换成192.168.31.100这个ip地址(SNAT:源地址转换)
  iptables -t nat -A POSTROUTING -s 192.168.250.0/24 ! -d 192.168.250.0/24 -j SNAT --to-source 192.168.31.100
  #访问目标地址为192.168.31.200这个机器并且是tcp协议80号端口的都转发给192.168.250.1(DNAT目标地址转换)
  iptables -t nat -A PREROUTING -d 192.168.31.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.250.1:80
  #访问目标地址为192.168.31.200这个机器并且是tcp协议80号端口的都转发给192.168.31.100的9999号端口(DNAT目标端口地址转换)
  iptables -t nat -A PREROUTING -d 192.168.31.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.31.100:9999
实操:
  开始操作之前,先:iptables -t nat -F iptables -t nat -X 清空nat表的所有规则。需要开三台虚拟机,分别为s1、s2、s3,其中s1是访问端,s2是防火墙端,s3是服务端。
  s1设置:IP 192.168.27.5/24 网关:192.168.27.1 网络防火墙关闭状态。
  s2设置:ens33 IP 192.168.27.1/24 ens37 IP 112.112.112.1/24 网关等都不要,网络防火墙开启。(两个网卡)
  s3设置:IP 112.112.112.10/24 网关 112.112.112.1 防火墙关闭状态。下载httpd服务,写入index.html文件内容。
  此时在s2:echo 1 > /proc/sys/net/ipv4/ip_forward 开启路由转发功能,此时在s1 ping s2可以ping通。
  在s1用:curl 112.112.112.10 可以看到在index.html写入的内容,在s3端:tailf /var/log/httpd/access_log 可以看到s1的IP成功访问。
  回到s2添加原地址转换规则:iptables -t nat -A POSTROUTING -s 192.168.27.5 -d 112.112.112.10 -j SNAT --to-source 112.112.112.1
  在s1用:curl 112.112.112.10 可以看到在index.html写入的内容,在s3端:tailf /var/log/httpd/access_log 可以看到112.112.112.1 IP成功访问。
  在s1端下载httpd服务并在/var/www/html下写入index.html文件。
  在s2添加目标地址转换规则:iptables -t nat -A PREROUTING -s 112.112.112.10 -d 112.112.112.1 -j DNAT --to-destination 192.168.27.5
  此时在s3:curl 112.112.112.1 可以看到s1 index.html的内容,查看s1的日志会发现是112.112.112.10成功访问。
  在s2添加端口转换规则:iptables -t nat -I PREROUTING -d 112.112.112.1 -p tcp --dport 80 -j DNAT --to-destination 112.112.112.10:80
  此时在s3查看日志会看到是192.168.27.5成功访问。(上一步的端口可以更换成别的没有别占用的,同样生效)

嗯!因为我们在实际工作过程中,用到raw表和mangle表的机会实在是太少了,包括我现在也没有遇到要在这两个表上设置规则的情况,所以我也没有研究怎么在这两个表上设置规则,等哪天我闲了,要就下再回来补上哈。另外我是在虚拟机上进行的实操实验,不敢再主机上搞呀,万一操作失误,那就是“切腹谢罪”的事情,所以也建议小伙伴在虚拟机上实验下,确定没问题了再拿去主机上执行,安全第一!

操作基本就那么多了,下面我们说点别的!
firewalld优先级
  策略应用优先级:raw, mangle, nat, filter
  策略常用优先级:filter,nat,mangle,raw

iptables数据包走向
  1. 数据包到达网络接口,比如 ens33。
  2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
  3. 如果进行了连接跟踪,在此处理。
  4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
  5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
  6. 决定路由,看是交给本地主机还是转发给其它主机。

嗯嗯,貌似关于firewalld的操作,我接触到的也就这么多了,后期要是还有内容我再补充,也希望小伙伴们看后有所心得,也欢迎留言交流!!!

猜你喜欢

转载自www.cnblogs.com/7758chongzi/p/11563560.html