设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

时间:2021-05-09 14:33:04

一、什么是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规则设置及其与firewalld的生死纠葛)

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

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

  可以看出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. 决定路由,看是交给本地主机还是转发给其它主机。

2019年11月更新:

前两天想到iptables和firewalld好像还有一个不兼容的情况,因为我来到公司使用的一直是iptables,没有开启过firewalld,所以在9月写这篇文章时没有写上,现在是11月了,补上哈。下面我们就来说说iptables和firewalld的生死纠葛:

我们知道firewalld是centos7默认的网络防火墙,7以前的系统好像都是iptables,我开始接触的就是7系统,所以要是说错了还请勿怪哈。那么要想在7上使用iptables的话就需要下载iptables-service了,注意,不是下载iptables,必须是iptables-service。

假设场景:现在firewalld是开启状态,我下载了iptables-service,使用命令如下:

  1,systemctl start firewalld

  2、yum install iptables-service

  3、systemctl start iptables

此时查看状态:

  1、systemctl  status  iptables

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

  2、再查看firewalld状态:systemctl  status firewalld

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

  3、我们再开启firewalld:systemctl restart firewalld

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

   4、再查看iptables状态:systemctl status iptables

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

通过上面的实验,已经证实,iptables和firewalld确实是一山不容二虎,那么具体firewalld和iptables的本质区别又是什么?我是用iptables和使用firewalld有什么区别呢?最理解不了是还是iptables还特么是管理firewalld的工具,看到这的你肯定很懵,没错,我也很懵,等到我啥时候搞清楚了再来更新这问题,有兴趣的小伙伴可以实验下,要是知道区别的大神还请留言指导下,一起学习,共同进步!

嗯!!!

经过差不多半小时的摸索,终于发现firewalld和iptables的区别之处,那么,下面我就分享下心得,希望对正在使用防火墙的小伙伴有所帮助:

先从firewalld开始说:iptables可以作为工具管理firewalld,也就是说我们在firewalld开启的状态下,可以同过iptables命令添加防火墙规则,但是一条命令,就是一个规则,玩firewalld的小伙伴应该清楚,给firewalld添加iptables规则,每一条命令都挺长的,选项还多,单词需要背,我就是很头疼这个。

另外我们在规则的保存方面,通常是使用命令:iptables-save > filename  将现在的防火墙规则导出来保存到一个文件里:

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

相当于把当前防火墙规则做了一次备份,当我们把防火墙规则搞得自己都不清楚有哪些规则时,就可以通过命令:iptables-restore < filename  恢复备份的防火墙规则。但是在添加和删除规则方面还是很费劲。那么有没有添加规则简单点的方式呢?之前可能不知道,现在可以告诉你,有的,下面我们来说说是什么方式可以做到。

那就是iptables-service,没错,就是它,下面我来详细说说它的强大之处:

  1、保存当前防火墙状态到指定文件,通过编辑文件来修改规则,退出编辑重启iptables生效。

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

  2、一样支持保存防火墙当前状态,作为备份和恢复

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

我想这两点足以说明iptables比firewalld的强大之处了,我最喜欢的还是那个编辑文件重启iptables生效,这个功能实在是太好了,结合部署脚本使用,只要用得好,比写一长串命令轻松太多了。嗯,那就说到这吧,希望能够对正在玩防火墙的小伙伴有所帮助,欢迎留言交流心得,开源、共享才能使技术进步,加油!!!