在 Linux 上使用 nftables 完成偽裝 NAT 範例?

在 Linux 上使用 nftables 完成偽裝 NAT 範例?

我正在尋找如何使用 nftables 執行此操作的完整範例。它應該是上游介面上的 DHCP 用戶端,另一個介面上有 192.168.0.0/24 LAN,並且還充當防火牆。

額外的功勞是在上游接口上打開 ssh 端口,並將端口 80 流量轉發到 LAN 上的其他伺服器。

nftables wiki 留下了一些未解答的問題。例如,關於偽裝的部分沒有描述如何將偽裝規則附加到一個介面與另一個介面。

答案1

這是我正在使用的,假設lan0已連接到您的內部網路和wan0ISP。

我不確定「上游介面上的 DHCP 用戶端」是什麼意思,因為這是透過 DHCP 用戶端而不是 nftables 完成的。下面的設定不限制傳出流量,因此 DHCP 請求將通過。

#!/usr/bin/nft -f

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;

    # allow established/related connections
    ct state {established, related} accept

    # early drop of invalid connections
    ct state invalid drop

    # allow from loopback
    iifname lo accept

    # Allow from internal network
    iifname lan0 accept

    # allow icmp
    ip protocol icmp accept

    # allow ssh
    tcp dport 22 accept comment "SSH in"

    reject
  }

  chain forward {
    type filter hook forward priority 0;

    # Allow outgoing via wan0
    oifname wan0 accept

    # Allow incoming on wan0 for related & established connections
    iifname wan0 ct state related, established accept

    # Drop any other incoming traffic on wan0
    iifname wan0 drop
  }

  chain output {
    type filter hook output priority 0;
  }

}

table ip nat {
  chain prerouting {
    type nat hook prerouting priority 0;

    # Forward traffic from wan0 to a LAN server
    iifname wan0 tcp dport 80 dnat 192.168.0.8 comment "Port forwarding to web server"
  }

  chain postrouting {
    type nat hook postrouting priority 0;

    # Masquerade outgoing traffic
    oifname wan0 masquerade
  }
}

答案2

偽裝是 SNAT 的一個特例。如果您想要將流量附加到輸出介面或輸出位址(內部 IP 的來源位址),請使用 SNAT

相關內容