如何停止拒绝 DNS 查询?

如何停止拒绝 DNS 查询?

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/00.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。注意gotos。)

相关内容