https://zhuanlan.zhihu.com/p/165503681
之前几篇文章已经谈及了firewalld最常用的配置,之前的所有命令行只是firewalld实用程序对iptables/ntable的规则做了预封装处理,每个区域的底层都有预设规则来处理入站/出站的数据包,如果你需要实现更细粒度的数据包过滤操作/转发操作,那么你必须对iptables更深入的了解,而本章谈论到的direct规则,实际上就是iptables规则的外壳语法。
重要提醒:direct规则优于rich规则执行,二者不建议混用。因此我之前文章说过类似的原因:firewalld规则内部优先级重排列的问题。因此你选择direct规则作为firewalld部署防火墙安全策略的方案,建议清空rich规则。
实验拓扑
我们仍然通过下面的拓扑,通过direct规则将我们的Linux主机配置成一个路由器。
在开始前,我这里先给大家列出firewalld的初始状态。
external:ens33网络接口位于外部区域
internal:ens34网络接口位于内部区域
direct规则应用注意事项
注意以下示例仅适用于CentOS 7,7之前的内核还是以netfilter作为iptalbes的操作实体,我们可以使用lsmod命令查看CentOS Linux 7加载的模块来验证我们的想法
iptables在Linux 7中有好几个子模块,熟悉iptables的同学应该都知道filter,nat,mangle等几个表分别装载着不同的链(Chain),而不同的链又分别可以定义着特定用途的规则。
iptable_security,
iptable_filter
iptables_mangle
iptables_nat
iptables_raw.
而这些规则,正是firewalld中的direct规则。direct规则就是带了套iptables规则。红帽官方的firewalld手册页指出,只有在无法使用例如-add-rich-Rule=‘Rule’时,才应使用direct规则作为最后手段。因此有如下建议
我个人建议如果你对iptables有深入的理解,就使用direct规则
rich规则与direct规则最好不要混用。
firewall-cmd --permanent \ --direct \ --add-rule { ipv4 | ipv6 | eb } \
<表(table)> <链(chain)> <优先级(priority)> args
Linux NAT系统
在使用direct规则配置nat系统之前,我们复习一下iptables的运行机制,下图是在前人的基础上加以汇总的
我们假设external区域外有一台主机(202.43.72.56)需要通过MS远程桌面服务连接到内网的一台主机10.10.10.1,那么对应的数据包有如下细节信息。
源地址117.34.25.26,
目的地址:202.43.72.56(假设这是我们防火墙的公网IP)
源端口7345(随机端口)
目的端口 3389
那么这个数据包会如上图iptables的操作流程
数据包来到入站的网卡接口时候会先通过mangle表的PREROUTING,mange表通常给数据包的加上头部字段加上特殊标识,用于在后续其他链中对该数据包做精准的控制(通常情况下,会略过mangle表的PREROUTING链)。
接着来到nat表的PREROUTING链中,目的地址转换(Destination NAT ,简称DNAT)会在这里发生,也就是说入站数据包202.43.72.56:3389会被替nat表的PREROUTING链的规则替换成10.10.10.1:3389,被修改后的数据包在离开这里时,之前的202.43.72.56的源端口和目的端口,以及内网10.10.10.1的对应信息会写入一张NAT映射表。
接着10.10.10.1:3389的数据包,会被系统内核的路由系统依据它的目标IP(查看路由表),这里的10.10.10.1:3389这个数据包的接收对象显然不是防火墙的本机地址,此时数据包会进入FORWARD链。
在FORWARD链中,此时数据包会依次由mangle->filter两张表的FORWARD链内规则进行过滤。由于在第一步的mangle表没做任何处理,所以会快速略过mangle表,并且filter表的FORWARD链是默认ACCEPT的。值得一提的是,CentOS 7/8在安装之初,如果主机本身不少于两张网卡并且是已连接状态,系统内核会默认激活IP数据包转发功能。
POSTROUTING链是用于处理数据包在离开防火墙的出站数据包后的最后一个操作,当10.10.10.1:3389这个数据包离开之前,POSTROUTING的规则会对数据包的源IP地址替换为10.10.10.254,这正是SNAT操作,同理这些对应的IP和端口信息会被写入NAT映射表中.对于10.10.10.1的主机接收到该数据包,该主机只知道这个数据包是防火墙的出站接口10.10.10.254发给它的,而对最初117.34.25.26的源地址,该主机是一无所知的。
此时源IP为10.10.10.254,目标IP是10.10.10.1:3389的数据包已经离开了防火墙,此时的数据包已经被封装成链路层中的数据帧,并且经由二层交换设备到达10.10.10.1的主机。
对于上面NAT执行原理的细节,我只是提及到防火墙向内网主机发送的过程,如果你对NAT原理不理解的话,建议找本类似CCNA的书籍,恶补一下路由交换与NAT的基础。
Lab:配置NAT路由器
在上面拓扑中,我们要允许internal区域的vm与external的web主机通信,我们必须为防火墙配置IP伪装,如果你的防火墙接口的IP地址经常变动的,那么使用下面指令:
firewall-cmd --permanent --direct --add-rule \
ipv4 nat POSTROUTING 0 -o ens33 -j MASQUERADE
注意:由于在写本文时,我在公司和家中搭建的网络环境有差别,防火墙外部接口获得的ip地址有所不同,因此配置命令和截图会有所不同,这里特此说明。
或对于有固定外网IP的情况,我们应该明确在nat表的POSTROUTING中使用SNAT操作,本示例是192.168.50.19,因此如下命令所示
firewall-cmd --permanent --direct \
--add-rule ipv4 nat POSTROUTING 0 \
-s 10.10.10.0/24 -o ens33 \
-j SNAT --to 192.168.50.19
以下这条是可选的命令,如果你生产环境的信息安全要求比较严谨,不妨将FORWARD链的默认策略设定为DROP
iptables -P FORWARD DORP
这样以后谁要访问你的网站或者你公司的员工需要访问外网就必须在FORWARD链中显式添加基于源IP地址到目标IP的转发规则。
将所有ICMP请求从internal区域(ens34)转发到external区域(enp33)
firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-p icmp -m state --state NEW,RELATED,ESTABLISHED \
-j ACCEPT
对所有HTTP和HTTPS流量执行相同的操作:
firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-p tcp -m multiport --dport 80,443 \
-m state --state NEW,RELATED,ESTABLISHED \
-j ACCEPT
对所有dns流量执行相同的操作:
firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-p udp --dport 53 \
-m state --state NEW,RELATED,ESTABLISHED \
-j ACCEPT
还允许internal区域访问public区域外的SMTP和SMTPS服务器:
firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-p tcp -m multiport --dport 25,465 \
-m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
开放ssh端口
firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-p tcp --dport 22 \
-m state --state NEW,RELATED,ESTABLISHED \
-j ACCEPT
记录所有转发流量的日志
firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i enp34 -o enp33 \
-j LOG --log-prefix "forward_traffic "
最后一条默认规则
firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-j REJECT
配置完以上规则,我们重新加载firewalld
firewall-cmd --reload
查看所有iptable规则
firewall-cmd --direct --get-all-rules
如下图所示
我们从internal区域的vm中测试,刚才用direct规则配置的防火墙,尝试打开一个网站以及做一个简单的路有跟踪,一切如常工作,那么我们本篇direct配置示例就到这里。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/4612.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~