最全的防火墙(firewalld)
第1章 防火墙的介绍
1.1 防火墙的介绍
1.1.1 概念
- 动态管理防火墙服务(图形界面和linux界面都可以实现)
- 支持不同防火墙的区域信息
- 属于传输层次的防火墙
1.1.2 防火墙的默认规则
- 经过防火墙进入的流量默认是阻止的
- 经过防火墙流出的流量默认是允许的
1.2 防火墙常见的区域介绍
1.2.1 概念介绍
区域相当于防火墙配置好的策略模板信息,直接就可以使用
1.2.2 图示介绍
1.2.3 防火墙区域的应用规则
- 一个地址或者接口只能设置一个zone区域来进行匹配规则信息
- 不同的源地址可以对同一个区域进行不同的匹配规则信息
- 运行时(runtime):修改规则马上生效,但是临时生效
- 持久配置(permanent): 修改后需要重载才会生效
1.2.4 防火墙常见的9种区域
1.2.4.1 名词解释
只有传出网络连接可用 意思是只有服务器本身出去的流量,客户端接收到回应才可 以进来,如果不是回应的流量是进不来的
只接受被选择的网络连接 意思是客户端发送请求的时候,指定的服务我是允许通过的,没有 我指定的服务我是不允许的.
1.2.4.2 区域解释
- drop 输入的数据包默认经过防火墙会丢弃并且无回应,只有传出网络连接可用
- block 拒绝所有出入的数据包并且进行回应一条禁止主机ICMP的消息,只有传出网 络连接可用
- public 只接受被选择的网络连接,用于公共区域。
- extermal 去外部网络的时候会进行地址的伪装,只接受被选择的网络连接
- dmz 外部部分指定的地区访问内部网络,只接受被选择的网络连接
- work 处在工作区域内的计算机,只接受被选择的传入网络连接
- home 处在家庭区域的计算机,只接受被选择的传入网络连接
- internal 对于处在你内部网络的计算机,只接受被选择的传入网络连接
- trusted 所有网络连接都接受
1.3 firewalld常见的参数信息:
1.3.1 firewall-config
- firewall-config 图形界面
1.3.2 firewall-cmd
- --permanent 配置写入到配置文件,否则临时马上生效
- --reload 重载配置文件,永久生效
- zone=public 指定区域为public
- --get-default-zones 获取默认区域
- --set-default-zone=public 设置默认区域为public
- --get-zones 获取所有可用的区域
- --get-active-zones 获取当前激活(活跃)的区域
- --add-source= 添加地址,可以是主机或网段,遵循当前区域的 target
- --remove-source 移除地址,可以是主机或网段,遵循当前区域的 target
- --add-service= 添加服务,遵循当前区域的 target
- --remove-service= 移除服务,遵循当前区域的 target
- --list-services 显示指定区域内允许访问的所有服务
- --add-port= 添加端口,遵循当前区域的 target
- --remove-port= 移除端口,遵循当前区域的 target
- --list-ports 显示指定区域内允许访问的所有端口号
- --add-interface= --zone= 添加网卡到指定区域
- --change-interface= new-zone-name --改变网卡到指定区域
- --list-all 列出激活使用的区域的配置
- --list-all-zones 列出所有区域的配置
- --get-zone-of-interface= 获取指定接口所在的区域
- --list-icmp-blocks 显示指定区域内拒绝访问的所有 ICMP 类型
- --add-icmp-block= 为指定区域设置拒绝访问的某项 ICMP 类型
- --remove-icmp-block= 移除指定区域内拒绝访问某项的 ICMP 类型
1.3.2.1 常用的 ICMP 类型有
- #echo-request 类型 0,icmp 请求报文
- #echo-reply 类型 8,icmp 响应回复报文
- --list-protocols 列出在指定区域中允许通过的协议
- --add-protocol= 在指定区域中添加允许通过的协议
- --remove-protocol= 移除在指定区域中的某项协议
- --get-target 获取区域中的默认 target
- --set-target= 设置区域的 target
1.3.2.2 查看默认区域
- firewall-cmd --get-default-zone 查看所有可以使用的区域
- firewall-cmd --get-zones 修改当前的默认区为 work
- firewall-cmd --set-default-zone=work 在 work 区添加 http 服务并允许别人 访问
- firewall-cmd --add-service=http --zone=work 在 public 区绑定了该地址范围,只 有该范围的 IP 的数据包都会路由到该区,由该区的规则进行匹配决定是否放行
- firewall-cmd --add-source=172.25.0.10/32 --zone=public 查看活跃的区
- firewall-cmd --get-active-zones 把接口绑定到 public 区
- --change-interface= --new-zone-name 修改网卡所在的区域
- --add-interface= --zone= 添加网卡指定区域
- firewall-cmd --get-zone-of-interface=IFACE 查看区域配置信息
- firewall-cmd --list-all --zone=work 列出区域为work的详细信息
- firewall-cmd --list-all 列出所有区域的详细信息
- firewall-cmd --get-services 查看所有的服务信息
1.3.2.3 直接规则(直接规则主要用于使服务和应用程序能够增加规则)
- --direct 指定将要使用直接规则
- --get-all-chains 获取所有的链
- --get-chains {ipv4|ipv6|eb} <table> 获取表中的链
- --add-chain {ipv4|ipv6|eb} <table> <chain> 添加链到表中(自定义的)
- --remove-chain {ipv4|ipv6|eb} <table> <chain> 移除表中的某条链
- --query-chain {ipv4|ipv6|eb} <table> <chain> 返回链是否已被添加到表
- --get-all-rules 获取所有的策略规则
- --get-rules {ipv4|ipv6|eb} <table> <chain> 获取指定表中指定链中的规则
-
--add-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg> 在指定表中的指定
链添加规则
- --remove-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg> 优先从指定表中的指定链 删除规则条目
- --remove-rules {ipv4|ipv6|eb} <table> <chain> 从表中删除规则条目
-
--query-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg>... 返回是否优先的规
则已被添加到链表中
- --passthrough {ipv4|ipv6|eb} <arg>... 直接传递 iptables 的命令
- --get-all-passthroughs 获取所有直接传递的规则
- --get-passthroughs {ipv4|ipv6|eb} <arg>... 获取跟踪直通规则
- --add-passthrough {ipv4|ipv6|eb} <arg>... 添加一个直接规则
- --remove-passthrough {ipv4|ipv6|eb} <arg>... 移除一个直接规则
- --query-passthrough {ipv4|ipv6|eb} <arg>... 查询直接规则是否添加
1.3.2.3.1 添加一些直接规则以将某个 IP 范围列入黑名单(所有来自 192.168.0.0/24 网络 IP,单个 IP 每分钟最高连接并发是 1,超过并发的连接都丢弃)
[root@lb01 ~] # firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
[root@lb01 ~] # firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
[root@lb01 ~] # firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix blacklisted
[root@lb01 ~] # firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
[root@lb01 ~] # firewall-cmd --reload
[root@lb01 ~] # firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist 添加一条链规则为blacklist到raw表中
[root@lb01 ~] # firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist 在raw表中指定blacklist链添加规则
[root@lb01 ~] # firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix blacklisted 规则为单个IP每分钟并发量为1
[root@lb01 ~] # firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP 其他的都阻止
[root@lb01 ~] # firewall-cmd --reload 重新加载
[root@lb01 ~] # firewall-cmd --direct --get-all-rules
ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix blacklisted
ipv4 raw blacklist 1 -j DROP
[root@lb01 ~] #
[root@lb01 ~] # firewall-cmd --direct --get-all-rules 获取所有链上面的规则信息
ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix blacklisted
ipv4 raw blacklist 1 -j DROP
[root@lb01 ~] #
[root@lb01 ~] # firewall-cmd --permanent --direct --remove-rules ipv4 raw blacklist
[root@lb01 ~] # firewall-cmd --permanent --direct --remove-rules ipv4 raw PREROUTING
[root@lb01 ~] # firewall-cmd --direct --remove-rules ipv4 raw blacklist
[root@lb01 ~] # firewall-cmd --direct --remove-rules ipv4 raw PREROUTING
[root@lb01 ~] # firewall-cmd --direct --remove-chain ipv4 raw blacklist
[root@lb01 ~] # firewall-cmd --reload
[root@lb01 ~] # firewall-cmd --direct --get-all-rules
[root@lb01 ~] # firewall-cmd --permanent --direct --remove-rules ipv4 raw blacklist 永久表中删除链规则信息
[root@lb01 ~] # firewall-cmd --permanent --direct --remove-rules ipv4 raw PREROUTING 永久删除链上的规则信息
[root@lb01 ~] # firewall-cmd --direct --remove-rules ipv4 raw blacklist 删除链上的规则信息
[root@lb01 ~] # firewall-cmd --direct --remove-rules ipv4 raw PREROUTING 删除链上的规则信息
[root@lb01 ~] # firewall-cmd --direct --remove-chain ipv4 raw blacklist 删除链上的规则信息
[root@lb01 ~] # firewall-cmd --reload 重新加载配置信息
[root@lb01 ~] # firewall-cmd --direct --get-all-rules 查看链上的所有规则信息
1.3.2.3.2 利用 firewalld 直接规则来做 SNAT 和 MASQUERADE 实现内网共享上网
- 方法一
[root@lb01 ~] # firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 172.16.1.0/24
- 方法二
[root@lb01 ~] # firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j SNAT -s 172.16.1.0/24 --to-source 10.0.0.5
- 其他的一些操作
[root@lb01 ~] # firewall-cmd --direct --get-all-passthroughs 查看添加的直接规则
[root@lb01 ~] # firewall-cmd --permanent --direct --remove-passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 172.16.1.0/24 删除直接规则
[root@lb01 ~] # firewall-cmd --permanent --direct --remove-passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j SNAT -s 172.16.1.0/24 --to-source 10.0.0.5 删除直接规则
1.4 firewalld常见的文件
- /etc/firewalld/{services,zones}/*.xml 优先级最高,permanent 模式生效的策略会放到这 里
- /lib/firewalld/{services,zones}/*.xml 优先级要低些,是一些默认配置,可以当做模板使 用
1.5 firewalld的富规则配置
1.5.1 富规则常见的参数信息
1.5.1.1 firewall-cmd
- --list-rich-rules 列出富规则
- --add-rich-rule=<rule> 使用富规则语言添加富规则
- --remove-rich-rule=<rule> 移除富规则
- --query-rich-rule=<rule> 查询某条富规则是否存在
- --list-all 和 --list-all-zones 也能列出存在的富规则
1.5.1.2 富规则的常用语法
1.5.1.2.1 rule
- [source]
- [destination]
- service|port|protocol|icmp-block|masquerade|forward-port
- [log]
- [audit]
- [accept|reject|drop]
1.5.1.2.2 rule后面具体接的信息
- rule [family="ipv4|ipv6"]
- source address="address[/mask]" [invert="True"]
- destination address="address[/mask]" invert="True"
- service name="service name"
- port port="port value" protocol="tcp|udp"
- protocol value="protocol value"
- forward-port port="port value" protocol="tcp|udp" to-port="port value
- " to-addr="address"
- log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]
- accept | reject [type="reject type"] | drop
1.5.1.3 使用富规则进行日志记录和调试(--timeout=n秒,表示n秒之后规则失效)
1.5.1.3.1 使用富规则记录到 syslog 的基本语法为:
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]
- <PREFIX TEXT>可以是自己的日志前缀
-
<LOGLEVEL> 可以是 emerg 、 alert 、 crit 、 error 、 warning 、 notice 、 info 或
debug 之一
- <RATE/DURATION>" 可以是 s(表示秒)、m(表示分钟)、h(表示小时)或 d(表示天)之一
例如:limit value=3/m 会将日志消息限制为每分钟最多三条。
注意:limit value = 3/m 这里是有 BUG 的,常常时间控制会不精准。
- 调试(--timeout=n秒,表示n秒之后规则失效)
1.5.1.4 常用的富规则例子
1.5.1.4.1 批量添加多个端口信息(200-5000)
[root@lb01 ~] # firewall-cmd --permanent --zone=public --add-rich-rule='
> rule family=ipv4
> source address=192.168.1.31
> port port=200-5000
> protocol=tcp accept'
success
1.5.1.4.2 接受从 work 区域到 SSH 的新连接, 以 notice 级别且每分钟最多三条消息的方式将新连接记录到 syslog。
[root@lb01 ~] # firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh"
log prefix="ssh"
level="notice"
limit value="3/m" accept'
success
[root@lb01 ~] #
1.5.1.4.3 在接下来五分钟内, 将拒绝从默认区域中子网2001: db8: : /64到DNS的新IPv6连接,并且拒绝的连接将记录到audit系统,且每小时最多一条消息。
[root@lb01 ~] # firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300
success
[root@lb01 ~] #
1.5.1.4.4 用于调试,规则在 300 秒后失效,防止规则设定错误导致网络连接断开
[root@lb01 ~] # firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.1 service name=ssh drop' --timeout=300
success
[root@lb01 ~] #
1.5.1.4.5 只允许 172.16.1.0/24 访问,并且记录日志,日志级别为 notice,日志前缀为"NEW HTTP ",限制每秒最多 3 个并发 ,要求持久化生效
[root@lb01 ~] # firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=http log prefix="NEW HTTP" level=notice limit value="3/s" accept'
success
You have new mail in /var/spool/mail/root
[root@lb01 ~] #
1.6 firewalld的NAT和端口转发
1.6.1 网络地址转换(NAT)
firewalld 支持两种类型的网络地址转换(NAT) 伪装和端口转发。可以在基本级别使用常规
frewall-cmd 规则来同时配置这两者,更高级的转发配置可以使用富规则来完成。
这两种形式的 NAT 会在发送包之前修改包的某些方面如源或目标。
1.6.2 伪装(注意:伪装只能和 ipv4 一起用,ipv6 不行)
伪装是一种形式的网络地址转换(NAT)
内网地址想出去外网的时候,需要进行伪装成外网地址才可以出去访问
1.6.2.1 配置伪装的方式
1.6.2.1.1 普通的方式进行配置
[root@lb01 ~] # firewall-cmd --zone=public --add-masquerade
1.6.2.1.2 富规则的方式进行配置
[root@lb01 ~] # firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 masquerade'
1.6.3 端口转发
通过端口转发指向单个端口的流量将转发到不同的计算机不同端口上或者不同的计算机上
通常是一个隐藏的服务器在另外一个服务器后面
1.6.3.1 端口转发的一个重要点
注意:当端口转发配置为将包转发到不同计算机时,从该计算机的任何回复通常将直接从该计算机发送到原始客户端。这将在大部分配置上导致无效连接,因此转发到的计算机必须通过执行端口转发的防火墙来进行伪装。常见配置是将端口从防火墙计算机转发到已在防火墙
后面伪装的计算机,即这种通过目标端口转发的方式需要开启伪装(masquerade)
1.6.3.2 要使用常规fircwall-cmd命令配置端口转发,可以使用firewalld提供的端口转发语法:
firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
1.6.3.2.1 toport=和toaddr 两部分均可选,但需要至少指定这两者之一(对于来自public区域的客户端,以下命令会将防火墙上通过端口513/TCP传入的连接转发到IP地址为192.168.0.254的计算机上的端口132/TCP)
firewall-cmd --permanent --zone=public --add-forwardport=port=513:proto=tcp:toport=132:toaddr=192.168.0.254
1.6.3.3 要在更大程度上控制端口转发规则,可以将以下语法与富规则配合使用来实现端口转发,这也是我们推荐使用的方式
1.6.3.3.1 语法
forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
1.6.3.3.2 以下示例使用富规则将来自work区域中192.168.0.0/4且传入到端口80/TCP的流星转发到防火墙计算机自身上面的和端口8080/TCP:
firewall-cmd --permanent --zone=work --add-rich-rule='rule family=ipv4 source address=l92.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'
1.6.3.4 端口转发示例
1.6.3.4.1 把来自172.16.2.0/24并且访问的端口为tcp的443端口的数据包进行端口转发,转发到本机的tcp的22端口
[root@lb01 ~] # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.2.0/32 forward-port port=443 protocol=tcp to-port=22'
success
You have new mail in /var/spool/mail/root
[root@lb01 ~] #
1.6.3.4.2 实现172.16.2.10转发成172.16.5.10
[root@lb01 ~] # firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.2.10 forward-port port=80 to-port=80 protocol=tcp to-addr=172.16.5.10'
success
[root@lb01 ~] #
1.6.4 一键断网
[root@lb01 ~] # firewall-cmd --panic-on 打开一键断网
success
[root@lb01 ~] # firewall-cmd --panic-off 关闭一键断网
success
1.6.5 重新会加载内核中的防火墙模块和配置文件
[root@lb01 ~] # firewall-cmd --complete-reload
1.7 firewalld的自定义区域和服务信息
1.7.1 自定义的区域
- 参照/lib/firewalld/zones/public.xml文件,在/lib/firewalld/zones/下面新建你需要的区域名以.xml结尾,内容格式参照public.xml,trusted.xml等文件即可。
[root@lb01 ~] # cat /lib/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short> 修改成自己要设置的区域名称
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/> 允许什么流量的服务来进入防火墙
<service name="dhcpv6-client"/> 允许什么流量的服务来进入防火墙
</zone>
You have new mail in /var/spool/mail/root
[root@lb01 ~] #
1.7.2 自定义服务
- 参照/usr/lib/firewalld/services/ssh.xml,在/usr/lib/firewalld/services/下面新建你需要的服务名以.xml结尾,内容格式参照ssh.xml,samba.xml文件中的内容即可。
[root@lb01 ~] # cat /lib/firewalld/services/ntp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Network Time Protocol (NTP) Server</short> 服务的一个标题
<description>The Network Time Protocol (NTP) allows to synchronize computers to a time server. Enable this option, if you are providing a NTP server. You need the ntp or chrony package installed for this option to be useful.</description> 服务描述
<port protocol="udp" port="123"/> 配置服务下面的协议和端口信息
</service>
You have new mail in /var/spool/mail/root
[root@lb01 ~] #
1.8 firewalld常使用的一些配置总结
1.8.1 服务状态信息
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
systemctl status firewalld
firewall-cmd --state
1.8.2 配置文件
/etc/firewalld/{services,zones}/*.xml 优先级最高,permanent 模式生效的策略会放到这里
/lib/firewalld/{services,zones}/*.xml 优先级要低些,是一些默认配置,可以当做模板使用
1.8.3 查看防火墙的配置情况
[root@lb01 ~] # firewall-cmd --list-all
1.8.4 应急命令(一键断网)
[root@lb01 ~] # firewall-cmd --panic-off 应急模式关闭(远程ssh可以连接)
[root@lb01 ~] # firewall-cmd --query-panic 查看是否为应急模式(yes是,no不是)
[root@lb01 ~] # firewall-cmd --panic-on 应急模式开启(远程ssh不可以连接,只能本地可以登录)
1.8.5 添加服务和端口以及协议
- firewall-cmd --add-service=<service name> 添加服务
- firewall-cmd --remove-service=<service name> 移除服务
- firewall-cmd --add-port=<port>/<protocol> 添加端口/协议(TCP/UDP)
- firewall-cmd --remove-port=<port>/<protocol> 移除端口/协议(TCP/UDP)
- firewall-cmd --list-ports 查看开放的端口
- firewall-cmd --add-protocol=<protocol> 允许协议 (例:icmp)
- firewall-cmd --remove-protocol=<protocol> 取消协议
- firewall-cmd --list-protocols 查看允许的协议
1.8.6 表示允许来自 192.168.2.1 的所有流量
firewall-cmd --add-rich-rule="rule family="ipv4" source address="<ip/netmask>" accept"
例子
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" accept"
1.8.7 允许 192.168.2.208 主机的 icmp 协议,即允许 192.168.2.208 主机 ping
firewall-cmd --add-rich-rule="rule family="ipv4" source address="<ip>" protocol
value="<protocol>" accept"
例子
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol
value="icmp" accept"
1.8.8 允许 192.168.2.1 主机访问 22 端口
firewall-cmd --add-rich-rule="rule family="ipv4" source address="<ip>" port
protocol="<port protocol>" port="<port>" accept"
例子
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" port
protocol="tcp" port="22" accept"
1.8.9 禁止 192.168.2.0/24 网段的主机访问 22 端口。
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source
address="192.168.2.0/24" port protocol="tcp" port="22" reject"
1.8.10 本地端口转发
firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.2.10/32 forward-
port port=80 to-port=22 protocol=tcp accept'
1.8.11 目标地址转发
firewall-cmd --permanent --add-masquerade
firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.2.10/32 forward-
port port=80 to-port=80 protocol=tcp to-addr=172.17.0.254 accept'
1.8.12 映射成防火墙的IP
要在更大程度上控制要进行伪装的客户端,还可以使用富规则。
firewall-cmd --permanent --zone=<ZONE> --add-rich-rule='rule family=ipv4 source
address=192.168.1.7 masquerade'