我在 Kubernetes 中运行一个 Ubuntu Docker 镜像,并尝试设置端口转发以将端口 5000 上的传入请求路由到不同的目标和端口 (10.30.8.191:443)。我安装了 iptables(默认情况下未安装)并添加了以下规则:
iptables -A PREROUTING -t nat -p tcp --dport 5000 -j DNAT --to 10.30.8.191:443
iptables -A FORWARD -p tcp -d 10.30.8.191 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
我还验证了/proc/sys/net/ipv4/ip_forward
设置为1
。但是,对进行 curl 调用https://127.0.0.1:5000
会导致。我已验证可以从此主机直接访问connection refused
目标 ip 。10.30.8.191
你知道我可能遗漏了什么吗?我没有在 iptables 规则中指定接口,据我理解,这意味着规则应该适用于所有现有接口。不是这样吗?
答案1
- 本地发起的数据包不会通过
nat/PREROUTING
链。要使对 127.0.0.1:5000 的请求成功,您应该将相同的DNAT
规则添加到nat/OUTPUT
链中:
iptables -t nat -A OUTPUT \
-d 127.0.0.1 -p tcp --dport 5000 \
-j DNAT --to 10.30.8.191:443
- 它还需要改变
net.ipv4.conf.lo.route_localnet
变量:
sysclt -w net.ipv4.conf.lo.route_localnet=1
- 回复数据包应该通过你的 ubuntu 主机,否则你会遇到路由三角问题。为此,你应该添加
SNAT
规则:
iptables -t nat -A POSTROUTING \
-d 10.30.8.191 -p tcp --dport 443 \
-m conntrack --ctstate DNAT --ctorigdstport 5000 \
-j MASQUERADE