iptables 將所有從客戶端透過網關的連線轉送到伺服器

iptables 將所有從客戶端透過網關的連線轉送到伺服器

我想將所有連接埠從我的客戶端(Windows)轉送到網關(Linux)後面的伺服器(Windows)。

我的網路拓撲如下所示:

10.20.10.14 --> 10.20.10.4 --> 192.168.1.1 --> 192.168.1.4
   client          ppp0           eth0          server
                |--------- Gateway -------|

其中網關設備有兩個網路設備:ppp0 和 eth0。

我希望在客戶端與 ppp0 之間存在網路連線的情況下,伺服器裝置將在與客戶端發送的資料相同的連接埠上看到資料。

換句話說,伺服器應該認為它直接與客戶端通信,並且在這種情況下網關是透明的。

另外我想知道如何刪除這個規則。

有任何想法嗎?

備註:我是所有設備的管理員。

答案1

將英文規則翻譯成iptables規則,只需要這條規則:

iptables -t nat -A PREROUTING -s 10.20.10.14 -i ppp0 -j DNAT --to-destination 192.168.1.4

目標連接埠不會改變(且來源連接埠也不應該改變,除非客戶端同時直接連接到伺服器的極少數情況)。

192.168.1.4沒有什麼可以阻止客戶端手動新增到via的路由10.20.10.4並直接存取伺服器。如果您不希望這樣做,為了隱藏伺服器的IP,您也可以新增以下規則:

iptables -I FORWARD -s 10.20.10.14 -i ppp0 -d 192.168.1.4 -m conntrack ! --ctstate DNAT -j DROP

這將阻止對未 DNAT 的伺服器的直接存取。

要刪除這些規則,只需使用-D

iptables -D FORWARD -s 10.20.10.14 -i ppp0 -d 192.168.1.4 -m conntrack ! --ctstate DNAT -j DROP
iptables -t nat -D PREROUTING -s 10.20.10.14 -i ppp0 -j DNAT --to-destination 192.168.1.4

隨機備註:

  • 由於 DNATed 連線被轉發,因此必須在網關上啟用 IP 轉送。最容易做到這一點的是echo 1 > /proc/sys/net/ipv4/ip_forward
  • 伺服器當然需要一條到客戶端的路由來接受其連接,例如將 Gateway ( 192.168.1.1) 作為預設網關。
  • -i ppp0-d 10.20.10.4是可選的,可以刪除(或者如果願意,可以在 PREROUTING 規則中替換)。如果不替換為-i ppp++作為通配符),它可能會導致問題:當出現快速連結故障/重新連接時,ppp1如果ppp0之前沒有斷開,則可能會呼叫新的 ppp 介面。 iptables 規則將不再符合。
  • 當 DNAT 規則被刪除時,已經建立的串流不會受到影響,新的串流將會受到影響(即不會到達伺服器)。

相關內容