第6篇:Linux防火墙 direct规则配置

之前几篇文章已经谈及了firewalld最常用的配置,之前的所有命令行只是firewalld实用程序对iptables/ntable的规则做了预封装处理,每个区域的底层都有预设规则来处理入站/出站的数据包,如果你需要实现更细粒度的数据包过滤操作/转发操作,那么你必须对iptables更深入的了解,而本章谈论到的direct规则,实际上就是iptables规则的外壳语法。

实验拓扑

我们仍然通过下面的拓扑,通过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的操作流程

  1. 数据包来到入站的网卡接口时候会先通过mangle表的PREROUTING,mange表通常给数据包的加上头部字段加上特殊标识,用于在后续其他链中对该数据包做精准的控制(通常情况下,会略过mangle表的PREROUTING链)。

  2. 接着来到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映射表。

  3. 接着10.10.10.1:3389的数据包,会被系统内核的路由系统依据它的目标IP(查看路由表),这里的10.10.10.1:3389这个数据包的接收对象显然不是防火墙的本机地址,此时数据包会进入FORWARD链。

  4. 在FORWARD链中,此时数据包会依次由mangle->filter两张表的FORWARD链内规则进行过滤。由于在第一步的mangle表没做任何处理,所以会快速略过mangle表,并且filter表的FORWARD链是默认ACCEPT的。值得一提的是,CentOS 7/8在安装之初,如果主机本身不少于两张网卡并且是已连接状态,系统内核会默认激活IP数据包转发功能。

  5. 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的源地址,该主机是一无所知的。

  6. 此时源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配置示例就到这里。

后文更新

参考文章:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352