Firewall

Nftables - 如何不在介面上 dnat ip (DNS)

  • May 9, 2020

我一直在尋找,但似乎無法找到我的具體問題的答案。我今天在預路由下有以下規則: iifname "br0" udp dport 53 counter dnat to 192.168.22.5:53

但是,我有一個問題,IP 地址 192.168.22.5 也在“br0”上。所以手頭的問題是,我怎樣才能讓 nftables 忽略這個 IP 並允許它訪問網路上的埠 53(這是我的 pihole),但將所有其他埠 53 udp 數據重定向到它?

感謝您的回复!

您只需添加一個附加條件以不匹配此 IP 地址,因此最終不執行 NAT:

iifname "br0" ip saddr != 192.168.22.5 udp dport 53 counter dnat to 192.168.22.5:53

**但是…**如果客戶端和 DNS 伺服器都在同一個 LAN 中,那麼回復將直接從 DNS 伺服器到客戶端。例如,將 192.168.22.101 的客戶端設置為使用 google 的公共解析器(涉及所有涉及的隱私問題),您將得到以下資訊:

查詢:192.168.22.101 到 8.8.8.8 -> 路由和 dnat-ed -> 192.168.22.5

回复:192.168.22.5 -> 橋接(或在這兩種情況下路由器根本看不到)ip 系列規則看不到 -> 192.168.22.101

但是由於 192.168.22.101 期望來自 8.8.8.8 的答案,而不是來自 192.168.22.5 的答案,它會失敗。

因此,您還必須抓取查詢。任何使數據包使用路由器的 IP 地址都可以:路由器的內部 IP ( masquerade),因為路由器擁有此 IP,或任何 Internet IP (使用snat),因為它們是通過路由器路由的。您甚至可以想像為此使用一些 TEST-NET IP(例如:192.0.2.2):無論如何,在本地網路之外永遠不會看到 IP 地址。缺點是 DNS 伺服器無法辨識進行查詢的 IP。如果這真的很重要,更新的核心(即將發布的 5.7 或 5.8)將提供相當於 iptables 的 NETMAP 的版本。

為簡單起見,讓我們masquerade在這裡使用。

因此,在等效的後路由鏈中,可以使用類似的東西創建(請適應您自己的命名約定):

nft add chain ip nat postrouting '{ type nat hook postrouting priority 100; policy accept; }'

規則是:

ip daddr 192.168.22.5 udp dport 53 counter masquerade

這不會影響從 DNS 伺服器發起的任何返回流量,因為它的 conntrack 條目將不再處於狀態 NEW 並且不會遍歷此nat規則。

如果您只想影響來自br0而不是來自其他地方的先前 dnat-ed 流量,有幾個選項:

  • 檢查源 IP 來自 192.168.22.0/24 和 dnat-ed
ip saddr 192.168.22.0/24 ip daddr 192.168.22.5 udp dport 53 ct status dnat counter masquerade
  • 使用最新的核心(> = 5.6)匹配傳入介面(仍在後路由中)就足夠了:
iifname "br0" ip daddr 192.168.22.5 udp dport 53 ct status dnat counter masquerade
  • 或者,如果它們與其他用途不衝突,您可以在預佈線和後佈線中使用標記:

預路由:

iifname "br0" ip saddr != 192.168.22.5 udp dport 53 counter set mark 1 dnat to 192.168.22.5:53

後路由:

mark 1 counter masquerade

最後,由於 DNS 使用 TCP 和 UDP,您可能也應該使用tcp dport 53.

引用自:https://serverfault.com/questions/1016398