
我很困惑,完全不懂iptables
。
我有一個 nginx 伺服器正在監聽localhost:80
,我想用我的網路卡 ip 存取它192.168.29.167:80
。我正在關注數位海洋關於設定規則的教程。
我的:
類型 | 介面 | 地址 |
---|---|---|
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
)
答案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
interface,而不是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。