Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 Docker隐藏调用容器的IP_Amazon Ec2_Go_Docker_Iptables_Coreos - Fatal编程技术网

Amazon ec2 Docker隐藏调用容器的IP

Amazon ec2 Docker隐藏调用容器的IP,amazon-ec2,go,docker,iptables,coreos,Amazon Ec2,Go,Docker,Iptables,Coreos,免责声明: 我是一个网络新手。如果我没有用恰当的词汇来描述我的问题,请原谅 上下文: 所以我有两个应用程序容器(Docker)要在CoreOS上运行。每个容器必须具有不同的IAM角色。由于在同一主机上可能会有N个容器运行N个不同的IAM角色,因此使用EC2实例元数据()检索实例凭据会带来问题。每个容器都需要一组不同的凭据(因为每个容器将具有不同的角色) 为了解决这个问题,我偶然发现了这个项目,它是一个Go代理,可以拦截(使用iptables规则)对的调用,并根据调用容器的IAM角色提供适当的凭据

免责声明:

我是一个网络新手。如果我没有用恰当的词汇来描述我的问题,请原谅

上下文:

所以我有两个应用程序容器(Docker)要在CoreOS上运行。每个容器必须具有不同的IAM角色。由于在同一主机上可能会有N个容器运行N个不同的IAM角色,因此使用EC2实例元数据()检索实例凭据会带来问题。每个容器都需要一组不同的凭据(因为每个容器将具有不同的角色)

为了解决这个问题,我偶然发现了这个项目,它是一个Go代理,可以拦截(使用iptables规则)对的调用,并根据调用容器的IAM角色提供适当的凭据

重新路由呼叫的iptables规则(请参阅):

# Get the host IP address. You can use a different mechanism if you wish.
# Note that IP can not be 127.0.0.1 because DNAT for loopback is not possible.
PROXY_IP=$(ifconfig eth0 | grep -Eo "inet addr:[0-9.]+" | grep -Eo "[0-9.]+")

# Port that the proxy service runs on. Default is 18000.
PROXY_PORT=18000

# Drop any traffic to the proxy service that is NOT coming from docker containers
iptables                   \
   -I INPUT                \
   -p tcp                  \
   --dport ${PROXY_PORT}   \
   ! -i docker0            \
   -j DROP

# Redirect any requests from docker containers to the proxy service
iptables                                       \
   -t nat                                      \
   -I PREROUTING                               \
   -p tcp                                      \
   -d 169.254.169.254 --dport 80              \
   -j DNAT                                     \
   --to-destination ${PROXY_IP}:${PROXY_PORT}  \
   -i docker0
因为我们在CoreOS上运行,所以我们希望在Docker容器中部署该代理。我们不想直接在EC2主机上安装代理

假设我有2个容器运行2个具有不同IAM角色的应用程序:

  • containerA:IP:172.17.0.7,IAM角色:roleA
  • 集装箱B:IP:172.17.0.8,IAM角色:roleB
当代理截取到的请求时,代理需要知道请求容器的IP(例如172.17.0.8),以便使用Docker客户端()检索请求容器的IAM角色(使用环境变量传递到容器,例如:
docker run-e IAM_ROLE=arn:aws:IAM::123456789012:ROLE/roleA--name containerA myapp

问题:

当代理在EC2主机上本机运行时,检索请求容器的IP(在我们的示例中,172.17.0.[7,8])工作得非常好。以下是我的心智模型,说明代理在主机上本机运行时会发生什么:

containerA调用->发生iptables路由->调用被重定向到localhost:18000->代理容器将containerA的IP视为传入请求的源

但是,当代理在Docker容器中运行时,它不会很好地工作。请注意,我使用
Docker run-p 18000:18000-v/var/run/Docker.sock:/var/run/Docker.sock ec2元数据代理启动代理

当代理在Docker容器中运行时,请求容器的IP是docker0接口的IP(例如172.17.42.1),因此无法确定请求容器。同样,以下是代理在容器中运行时发生的情况的心智模型:

containerA调用->发生iptables路由->调用被重定向到localhost:18000->Docker将调用路由到代理容器->代理容器将docker0的IP视为传入请求的源

问题:


如何确保代理将看到的IP地址是请求容器(例如containerA)的IP地址,而不是docker0接口的IP地址?

经过一点实验,我发现在
--net=host
模式下运行代理容器解决了问题

通过使用此选项,代理容器与主机共享相同的网络堆栈,从而绕过docker0网桥