iptables端口转发未生效求助:AWS EC2 Ubuntu上Express端口转发失败
我在AWS EC2的Ubuntu Linux实例上运行基础Express应用,为避免用root权限监听80端口,计划让应用监听3000端口,通过iptables将80端口流量转发至3000端口。
执行了以下端口转发命令:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
但转发未生效,仅能通过3000端口访问服务:
curl localhost:3000 *html* curl localhost curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused
使用sudo iptables -L -n -v查看规则,结果未显示任何端口相关规则:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target
prot opt in out source destinationChain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target
prot opt in out source destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target
prot opt in out source destination
解决方法
1. 正确查看nat表规则
iptables -L默认查看的是filter表,而端口转发规则存储在nat表中,需添加-t nat参数查看:
sudo iptables -t nat -L -n -v
执行后就能看到你添加的PREROUTING转发规则。
2. 补充本地回环流量的转发规则
PREROUTING规则仅对外部流入的流量生效,本地curl localhost这类请求走的是OUTPUT链,需添加对应规则:
sudo iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 3000
3. 持久化iptables规则
Ubuntu系统重启后iptables规则会丢失,可通过iptables-persistent保存规则:
sudo apt update && sudo apt install iptables-persistent sudo netfilter-persistent save sudo netfilter-persistent reload
4. 检查EC2安全组配置
确认EC2实例的安全组已开放80端口的入站流量,否则外部请求无法到达实例的80端口。
5. 验证转发效果
添加完OUTPUT规则后,再次执行curl localhost即可正常访问服务。同时用sudo iptables -t nat -L -n -v能看到两条转发规则已生效。
内容的提问来源于stack exchange,提问作者machineghost

