Networking

在使用 Nftables 訪問不同網路的不同介面上偽裝的 NAT

  • December 15, 2021

我有一個連接到兩個網路的伺服器:

  • 10.0.0.0/24 通過介面 wlan0
  • 192.168.1.0/24 通過介面 eth0

我想設置一個 Wireguard VPN 以使兩個網路都可以從外部訪問。我在我的配置中啟動了 ip 轉發(使用 sysctl)。現在我需要設置一個 NAT,以便通過兩個本地網路路由來自 VPN 伺服器的請求。我使用 nftables 來設置 NAT。

我的問題是,對於只有一個介面的機器,我會使用以下配置:

table ip nat {
   chain prerouting {
       type nat hook prerouting priority 0;
   }
   chain postrouting {
       type nat hook postrouting priority 100;
       ip saddr 10.2.0.0/24 oifname eth0 masquerade
   }
}

但是在這裡,我不想通過 eth0 路由所有內容,我想專門通過 wlan0 路由所有用於 10.0.0.0/24 的內容,以及通過 eth0 路由所有用於 192.168.1.0/24 的內容。如何使用 nftables 實現這一目標?

最後我自己找到了答案,所以這裡是如何做到的:你必須使用ip daddr參數來按目標地址過濾。我的最終規則集如下:

table ip nat {

       chain PREROUTING {
           type nat hook prerouting priority filter; policy accept;
       }
   
       chain POSTROUTING {
           type nat hook postrouting priority srcnat; policy accept;
           ip saddr 10.2.0.0/24 ip daddr 192.168.0.0/16 oifname "eth0" masquerade
           ip saddr 10.2.0.0/24 ip daddr 10.0.0.0/24 oifname "wlan0" masquerade
       }
}

這完美地工作。

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