Linux

IP 轉發、偽裝、NAT

  • July 15, 2021

我的目標上有一個物理介面eth0,執行 Linux。該介面的 IP 地址為 172.16.81。x(公共 IP)。

我必須創建一個eth0:1IP 地址為 173.1.1 的虛擬介面。x。我將使用 IP 地址 173.1.1 執行具有自定義埠 49155 的套接字伺服器。x

從另一台 PC/目標我應該無法 ping 173.1.1。x。但是,我將在另一台 PC 上執行套接字客戶端程序。此客戶端應該能夠連接到 172.16.81 上的埠 49155。x公共 IP。

我試過NAT,橋接但不成功。

使用以下 iptable 規則,能夠建立伺服器<–>客戶端通信:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -A FORWARD -i ens33 -o 173.1.1.6 -p tcp --syn --dport 49155 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i ens33 -o 173.1.1.6 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i ens33 -o 173.1.1.6 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 49155 -j DNAT --to-destination 173.1.1.6
sudo iptables -t nat -A POSTROUTING -o ens33 -p tcp --dport 49155 -d 173.1.1.6 -j SNAT --to-source 192.168.233.251
sudo iptables -A INPUT -m tcp -p tcp -s 192.168.233.251 --dport 49155 -j ACCEPT

此時仍然可以從外部 PC ping 173.1.1.6。

但是我還必須使 173.1.1.6 對外部世界不可見,因為我添加了以下規則:

sudo iptables -A INPUT -d 173.1.1.6 -j DROP
sudo iptables -A OUTPUT -s 173.1.1.6 -j DROP
sudo iptables -A FORWARD -s 173.1.1.6 -j DROP

在此 ping 被阻止後。伺服器 <–> 客戶端通信也不會發生。

雖然我不知道您最終實際嘗試設置或實現的目標是什麼,但考慮到以下情況:

  1. 您在同一主機上配置了兩個 IP 地址(無論它們是否配置在同一網路介面上)
  2. 您有一些綁定到其中一個地址的伺服器程序
  3. 您不希望其他主機能夠通過上述程序綁定的地址訪問此主機(無論它們是否正在嘗試連接到該程序/埠)。
  4. 您希望其他主機能夠使用未綁定的其他地址連接到上述程序。

不管以上在任何情況下是否有意義,您都可以使用以下 iptables 規則來做到這一點:

(假設它有 和 的 IP 地址,192.168.1.2並且192.168.2.2伺服器程序綁定到192.168.2.2:80,我希望其他主機能夠連接到它192.168.1.2:8080

iptables -t raw -I PREROUTING -d 192.168.2.2 -j DROP
iptables -t nat -I PREROUTING -d 192.168.1.2 -p tcp --dport 8080 -j DNAT --to-destination 192.168.2.2:80

(注意:這些規則適用於主機本身,而不是其網關左右;由於您包含FORWARD了我無法理解的規則,所以我不知道您在做什麼或在哪裡做)

這裡的關鍵是使用raw (PREROUTING)而不是filter (INPUT)丟棄不需要的流量,因為filter (INPUT)它與 after is 匹配nat (PREROUTING)

您可能不想將入站介面匹配 ( -i) 添加到第一條規則,因為您顯然希望地址完全“不可見”。(好吧,也許你想要! -i……再說一次,我不知道你到底想做什麼,所以。)對於第二個,這取決於你希望 DNAT 在什麼情況下發生。

作為記錄,無論如何,我認為您沒有任何理由為此目的使用公共 IP(儘管公平地說,即使您使用私有 IP,您也需要選擇一個與私有子網不衝突的該主機需要到達的位置)。

PS 據我所知,您所說的“虛擬介面”只不過是一種在一個網路介面上配置多個 IP 地址的古老方法。

引用自:https://unix.stackexchange.com/questions/658455