題 為什麼這個iptables規則使端口轉發不起作用?


我有一台服務器 localhost:7060。它使用的是ipv6 socket而不是ipv4。以下是netstat outout。

# netstat -an
Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp       0      0 10.200.32.98:1720      0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:4122           0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:4123           0.0.0.0:*              LISTEN
 tcp       0      0 127.0.0.1:4123         127.0.0.1:43051        ESTABLISHED
 tcp       0      0 10.200.32.98:5555      10.200.32.44:53162     ESTABLISHED
tcp6       0      0 :::5060                :::*                   LISTEN
tcp6       0      0 ::ffff:127.0.0.1:7060  :::*                   LISTEN
tcp6       0      0 :::23                  :::*                   LISTEN
tcp6       0      0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.142:43505 ESTABLISHED
tcp6       0      0 ::ffff:127.0.0.1:43051 ::ffff:127.0.0.1:4123  ESTABLISHED
tcp6       0      0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.44:53195 ESTABLISHED
udp6       0      0 :::5060                :::*                   CLOSE
# 

我想設置一個端口轉發規則,接受端口24上的連接(在所有接口環回以及eth0上)並轉發數據到 localhost:7060

這就是我設置iptables規則的方法:

iptables -t nat -A PREROUTING -p tcp --dport 24 -j DNAT --to 127.0.0.1:7060**

它不起作用。當我從不同的盒子telnet時,我看到以下內容

$ telnet 10.200.32.98 24
  試試10.200.32.98 ......

如果我將服務器更改為綁定到 *:7060 並設置以下規則,似乎工作正常。

iptables -t nat -A PREROUTING -p tcp --dport 24 -j REDIRECT --to-port 7060

但這將使我的服務器在我不喜歡的WAN接口上可用。

我覺得它與ipv6 socket(netstat輸出中的tcp6行)有關。這一切都是在具有自定義Android平台映像的Android設備上完成的。

我該如何工作?


5
2017-11-30 16:22


起源


如果您的套接字是IPv6,則需要進行IPv6過濾。此外,我的理解是 ip6tables 還沒有像偽裝或端口轉發(你的情況)那樣支持NAT。嘗試將套接字改為IPv4,並查看您的規則是否有效。 - Garrett


答案:


當響應數據包從端口7060返回並被發送到路由器時,這些數據包還需要對其進行發送方掩碼操作,將這些數據包源地址屏蔽到路由器的地址(127.0.0.1),並將端口屏蔽為24.因此,您需要添加SNAT iptables規則以使其工作。

iptables -t nat -A POSTROUTING -p tcp --sport 7060 -j MASQUERADE --to-ports 24

即使數據包是由localhost生成的,它也會進入POSTROUTER鏈。 REDIRECT操作會自動為您執行這兩項操作,但如果您的服務位於本地網絡中的另一台服務器上,則必須使用SNAT和DNAT。


0
2017-12-15 06:45





我想你一定要用 --sport 24 代替 --dport 24因為交通是 ,不是外向的。雖然如此 加雷特說,可能你必須使用 ip6tables...


-1
2018-02-10 08:35



錯誤,傳入連接具有目標端口24因此應該使用--dport。通常,源端口(來自連接客戶端)是隨機分配的。 - hultqvist