在Docker容器中使用iptables进行端口转发

我正在一个容器上运行两个服务(A&B)。 一个服务嘲笑另一个服务所需的依赖。

服务A是一个黑匣子,并致电IP 169.254.169.254。 我想要使​​用iptables将该呼叫转发到服务B.

我开始这样的容器,所以它可以有自己的iptables,

docker run -it --cap-add=NET_ADMIN --sysctl net.ipv4.conf.eth0.route_localnet=1 <name> bash 

一旦在bash中,我configurationiptables转发呼叫,

 iptables -t nat -I PREROUTING -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination "127.0.0.1:8099" -i eth0 

但是这个调用不会被路由到127.0.0.1。 如果在Ubuntu Xenial虚拟机中完成同样的步骤,

你可以运行下面的

 iptables -t nat -A OUTPUT -p tcp --dport 80 -d 169.254.169.254 -j DNAT --to-destination 127.0.0.1:8099 

我在下面用我的容器做了一个简单的testing,效果很好

 root@a09ced7f6961:/# iptables -t nat -A OUTPUT -p tcp --dport 8080 -d 123.45.67.89 -j DNAT --to-destination 127.0.0.1:80 root@a09ced7f6961:/# curl 123.45.67.89:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>