在 docker 容器内使用 iptables 进行端口转发
port forwarding using iptables inside docker container
我在一个容器上 运行 两项服务(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 中,我配置 iptables 来转发呼叫,
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 VM 中完成相同的步骤集。
您可以运行以下
iptables -t nat -A OUTPUT -p tcp --dport 80 -d 169.254.169.254 -j DNAT --to-destination 127.0.0.1:8099
我使用下面的方法对我的容器进行了简单测试,效果很好
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>
我在一个容器上 运行 两项服务(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 中,我配置 iptables 来转发呼叫,
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 VM 中完成相同的步骤集。
您可以运行以下
iptables -t nat -A OUTPUT -p tcp --dport 80 -d 169.254.169.254 -j DNAT --to-destination 127.0.0.1:8099
我使用下面的方法对我的容器进行了简单测试,效果很好
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>