Iptables
如何從 enp7s0 埠轉發到 localhost:80
我很困惑,我完全不明白
iptables
。我有一個 nginx 伺服器正在監聽
localhost:80
,我想用我的 NIC 的 ip 訪問它192.168.29.167:80
。我正在關注digitalocean關於設置規則的教程。我的:
類型 界面 地址 local
lo
127.0.0.1
NIC
lan
enp7s0
192.168.29.167
我做到了,
iptables -A FORWARD -i lo -o enp7s0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT iptables -A FORWARD -i lo -o enp7s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i enp7s0 -o lo -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1 iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 127.0.0.1 -j SNAT --to-desitnation 127.0.0.1
設置
PREROUTING
,POSTROUTING
和FORWARD
規則什麼也沒做。我無法localhost:80
通過enp7s0
.(注:我有
sudo sysctl -w net.ipv4.ip_forward=1
)
- 您的規則有錯誤
nat
:您的介面名稱似乎不正確。最好使用DNAT
基於目標地址,而不是輸入介面名稱。因此,您只需要一條規則即可實現您想要的:iptables -t nat -A PREROUTING --dst 192.168.29.167 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80
- 這些數據包不會被轉發(中轉),但會被輸入。
filter/INPUT
您應該在鏈中允許此流量,而不是在filter/FORWARD
. 注意,DNAT
操作後輸入介面不會改變(所以你應該指定enp7s0
介面,而不是lo
)。但是您可以允許任何DNAT
與單個規則的連接。iptables -t filter -A INPUT -m conntrack --ctstate DNAT -j ACCEPT
- 執行
sysctl -w net.ipv4.conf.enp7s0.route_localnet=1
以允許從外部接收數據包,這些數據包的地址為127.0.0.1
.- 更好地使用
iptables-save -c
命令列出帶有計數器的完整規則集。您至少應該看到增加nat/PREROUTING
規則計數器。此外,使用iptables-apply
應用新規則。檢查這些實用程序的文件。- 使用 對
tcpdump -ni enp7s0 'tcp port 80'
來自外部的流量進行故障排除。- 要重定向本地發起的流量,您應該使用這些規則
iptables -t nat -A OUTPUT -p tcp --dport 80 --dst 192.168.29.167 -j DNAT --to 127.0.0.1
否則,您無法通過伺服器本身的 192.168.29.167 地址連接到您的 nginx。