Iptables

設置埠偵聽和轉發

  • September 9, 2016

我知道,有很多關於開放埠和埠轉發的問題。我嘗試了幾乎所有的答案,但我無法讓它對我有用。

我正在虛擬機中執行全新安裝的 Kubuntu。

我只是想轉發所有流量

$$ myip $$:80 到 localhost:8080。出於測試目的,我使用 netcat 來監聽我的埠。 所以這是我的完整設置(在這些命令之前,我刪除了所有 iptable 規則,包括 PRE/POSTROUTING):

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j  DNAT --to-destination 127.0.0.1:8080
sudo iptables -A INPUT -j ACCEPT
sudo iptables -A FORWARD -j ACCEPT

據我了解,現在所有連接都將被接受並允許轉發(對於所有連接)。此外,預路由會將埠 80 上的所有流量路由到 localhost:8080。

現在我聽:

sudo nc -l 10.0.2.15 80
sudo nc -l localhost 8080

我在同一台機器上使用以下命令:

curl -XPUT http://10.0.2.15:80/
curl -XPUT http://127.0.0.1:8080/

理論上,我的第二個聽眾應該看到這兩個命令。實際上,第一個偵聽器將收到第一個命令,第二個偵聽器將收到第二個命令。如果我從另一台機器上嘗試命令**curl -XPUT http://10.0.2.15:80/**將導致拒絕連接錯誤。但是我接受與 iptables 配置的任何連接,不是嗎?

我也對 POSTROUTING 做了一些實驗,但從未成功。我錯過了什麼?我現在嘗試了 3 小時…感謝您的幫助。

//編輯:我可以從另一台機器上成功地 ping 虛擬機。反之亦然。

好的,我找到了解決方案。事實證明,我並沒有那麼錯,但是缺少了一些東西:

sysctl -w net.ipv4.conf.eth0.route_localnet=1

感謝Ipor Sircer指出,核心將丟棄 127.0.0.1 的數據包,感謝這篇文章,指出如何規避這個限制。

因此,如果有人需要做類似的事情(即在虛擬機上設置埠轉發到 localhost),這裡再次使用我正在使用的完整設置:

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j  DNAT --to-destination 127.0.0.1:8080
sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1

當然,將埠和介面更改為您的設置。即在您的界面的倒數第二個和最後一個命令中更改**–dport–to-destination** AND eth0 。

還要確保每台機器都可以真正相互交談——通常對於虛擬機,你需要做一些額外的設置。

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