dns
尽管允许服务通过 Firewalld,但通过internal
接口接收的 DNS 查询被拒绝。
网络如下:
PC ------------- SERVER ---------------- DNS Server
> nslookup # firewall-cmd DNS service
192.168.2.11 --- ens244 192.168.2.1
net.ipv4.ip_forward=1
ens160 192.168.1.1 ---- 192.168.1.11
这是区域设置:
[christine@montreal ~]$ sudo firewall-cmd --list-all --zone=internal
internal (active)
target: default
icmp-block-inversion: no
interfaces: ens224
sources:
services: cockpit dhcpv6-client dns mdns samba-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[christine@montreal ~]$
这是日志消息:
Jun 10 <...> montreal.<...>: FINAL_REJECT: IN=ens224 OUT=ens160 MAC=<...> SRC=192.168.2.11 DST=192.168.1.11 LEN=71 TOS=0x00 PREC=0x00 TTL=127 ID=61889 PROTO=UDP SPT=53254 DPT=53 LEN=51
尝试过:当target
设置为时,拒绝停止ACCEPT
,但这不是我想要的策略。
答案1
免责声明:我对防火墙并不是很有经验/熟悉,所以我的判断/意见可能有偏见/不准确。
实际上,允许两个接口/网络之间的 IP 转发并不是很困难,特别是如果你想“无状态地”允许双向转发(即允许两个都端与另一端的主机发起通信)。您实际上只需要创建一个区域,将两个接口添加到该区域,然后添加该区域。(顺便说一下,--add-forward
还有--add-masquerade
可能也需要/想要。
问题是,firewalld 在我看来非常不灵活,而且很笨。正如我刚才提到的,似乎根本没有任何方法可以让你“无状态”地只允许一个方向的转发(而另一个方向则只能“有状态地”允许,就像典型的 LAN-WAN 情况一样)。但也许这对你来说不是问题(因为从使用的 IP 子网块来看,这两个网络似乎或多或少都是内部网络)。
更大的问题是,它的设计不允许您进一步挑选已添加到区域(用于转发)的接口以允许发往该主机的入站流量。您只能使用“丰富规则”允许 IP(范围)。
你甚至不能使用另一个源区(其优先级高于界面区) 来执行此操作。例如,如果您有一个源区域,192.168.2.0/24
允许 ssh 连接到此主机,它将覆盖刚刚配置的接口区域添加的转发规则。即使您--add-forward
也使用此区域,它也只允许“源 192.168.2.0/24(逻辑 AND)目标 192.168.2.0/24”之类的内容。如果您另外将0.0.0.0/0
源添加到此区域,那么您将允许全部(从0.0.0.0/0
到0.0.0.0/0
)转发流量。
正如我在开头所说的,这些可能都只是误判。也可能只是我不知道如何正确使用它。无论如何,我宁愿编写自己的 nftables 规则集。我几乎看不到使用它的任何意义。
无论如何,这里有一个示例区域(文件),你可以可能想要作为参考:
$ cat /etc/firewalld/zones/myForward.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<rule family="ipv4">
<source address="192.168.1.0/24"/>
<service name="ssh"/>
<accept/>
</rule>
<rule family="ipv4">
<source address="192.168.150.0/24"/>
<service name="dns"/>
<accept/>
</rule>
<interface name="wlan0"/>
<interface name="bridge0"/>
<forward/>
</zone>
它允许 wlan0 和 bridge0 之间无状态双向转发,并允许 ssh 连接到此主机来自192.168.1.0/24
(一侧的 IP 子网wlan0
),并允许 DNS 请求到此主机来自192.168.150.0/24
(侧面的 IP 子网bridge0
)。
(这是 /etc/firewalld/zones/ 中唯一的区域文件。我没有使用任何内置区域。)
编辑:我找到了一种无状态地只允许一个方向转发的方法。您可以将“WAN”接口(例如 ens160)添加到内置public
区域。对于您想要转发流量的“LAN”接口(例如 ens244),您无需将其添加到公共区域。但是,您也不能将其添加到任何其他区域,因为该其他区域将具有自己的转发配置(无论您是否在该区域都无关紧要--add-forward
)。(您可以使用 进行检查nft list chain inet firewalld filter_FORWARD_ZONES
。注意goto
s。)