Nftables - 如何不在介面上 dnat ip (DNS)
我一直在尋找,但似乎無法找到我的具體問題的答案。我今天在預路由下有以下規則:
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
.