Linux
iptables 埠重定向不起作用
我正在嘗試設置在 localhost:8082 上執行的網路伺服器並將埠 80 重定向到它。
我已經使用預路由重定向 nat 表完成了它,但它似乎不起作用,數據包到達規則,但似乎沒有被轉發。
這是我的 iptable 的樣子:
ubuntu@ip-172-31-31-104:~$ sudo iptables -t nat -L -v -n Chain PREROUTING (policy ACCEPT 6 packets, 348 bytes) pkts bytes target prot opt in out source destination 6 320 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 8082 2 84 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 redir ports 8082 0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:38204 redir ports 38204 Chain INPUT (policy ACCEPT 14 packets, 752 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 381 packets, 27905 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 381 packets, 27905 bytes) pkts bytes target prot opt in out source destination
當我對 localhost:8082 進行 curl 時,我的伺服器日誌如下所示:
2019/09/16 11:47:36 "GET http://localhost:8082/ping HTTP/1.1" from 127.0.0.1:40386 - 200 87B in 83.384µs
但是,當我嘗試使用郵遞員從外部發出請求時,ip 表如下所示:
ubuntu@ip-172-31-31-104:~$ sudo iptables -t nat -L -v -n Chain PREROUTING (policy ACCEPT 6 packets, 348 bytes) pkts bytes target prot opt in out source destination 11 580 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 8082 2 84 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 redir ports 8082 0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:38204 redir ports 38204 Chain INPUT (policy ACCEPT 19 packets, 1012 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 395 packets, 28995 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 395 packets, 28995 bytes) pkts bytes target prot opt in out source destination
注意 pkts 和 bytes 列確實發生了變化,所以看起來數據包確實到達了機器,但伺服器日誌中沒有新日誌。
我需要擔心另一個防火牆或抽象級別嗎?
感謝您的幫助 !
更新 這裡是 netstat,我的伺服器叫做離心機,所以它在埠 8082 上偵聽
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:8082 0.0.0.0:* LISTEN 4163/centrifuge tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:52698 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:38204 0.0.0.0:* LISTEN 4163/centrifuge tcp6 0 0 :::22 :::* LISTEN - tcp6 0 0 :::8088 :::* LISTEN 26143/pm2-gui slave tcp6 0 0 ::1:52698 :::* LISTEN -
正如@msp9011 和@user4556274 試圖描述的那樣,您需要讓您的伺服器偵聽“任何地址”而不是“127.0.0.1”地址。因此,根據您的網路伺服器軟體,您可以將所謂的“監聽地址”更改為:
- 將 127.0.0.1 替換為空,即刪除配置
- 將 127.0.0.1 替換為 0.0.0.0 表示監聽任何 IP
- 添加 0.0.0.0 配置以覆蓋預設 127.0.0.1
- 沿著這些構想,檢查您的文件以獲取“監聽”或“綁定”地址以及如何使其不只監聽本地地址
如果您告訴我們更多有關您擁有的網路伺服器軟體的資訊,我們或許可以就上述過程提供更多詳細資訊。
然而,當成功時,您目前的 netstat 輸出中的這一行:
tcp 0 0 127.0.0.1:8082 0.0.0.0:* LISTEN 4163/centrifuge
成功更新配置後應如下所示:
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 4163/centrifuge
@user4556274 引用的文件意味著,如果新連接帶有本地 IP 地址為 123.456.78.9 的介面,則 REDIRECT 目標會將目標埠更改為 8082,將目標主機更改為 123.456.78.9(即不是 127.0。 0.1)。因為您的配置僅偵聽 127.0.0.1,所以它不會看到具有任何其他目標地址的數據包。地址 0.0.0.0 是特殊的,意味著它將監聽所有地址。