Ubuntu(Docker)上的 Iptables 端口转发

Ubuntu(Docker)上的 Iptables 端口转发

我在 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

相关内容