Informações básicas
Eu tenho um servidor com duas interfaces de rede executando o Docker. O Docker, como algumas ferramentas de virtualização, cria uma interface de ponte do Linux chamada docker0
. Essa interface é configurada por padrão com um IP 172.17.42.1
e todos os contêineres do Docker se comunicam com essa interface como gateway e recebem endereços IP no mesmo /16
intervalo. Pelo que entendi, todo o tráfego de rede de / para contêineres passa por um NAT, de maneira que parece ser de saída 172.17.42.1
e de entrada para o qual é enviado 172.17.42.1
.
Minha configuração é assim:
+------------+ /
| | |
+-------------+ Gateway 1 +-------
| | 10.1.1.1 | /
+------+-------+ +------------+ |
| eth0 | /
| 10.1.1.2 | |
| | |
| DOCKER HOST | |
| | | Internet
| docker0 | |
| (bridge) | |
| 172.17.42.1 | |
| | |
| eth1 | |
| 192.168.1.2 | \
+------+-------+ +------------+ |
| | | \
+-------------+ Gateway 2 +-------
| 192.168.1.1| |
+------------+
O problema
Desejo rotear todo o tráfego de / para qualquer contêiner do Docker da segunda eth1
192.168.1.2
interface para um gateway padrão 192.168.1.1
, enquanto todo o tráfego da / para a máquina host sai da eth0
10.1.1.2
interface para um gateway padrão de 10.1.1.1
. Eu tentei várias coisas até agora sem sucesso, mas a única coisa que acho que é a mais próxima de corrigir é usar o iproute2 da seguinte maneira:
# Create a new routing table just for docker
echo "1 docker" >> /etc/iproute2/rt_tables
# Add a rule stating any traffic from the docker0 bridge interface should use
# the newly added docker routing table
ip rule add from 172.17.42.1 table docker
# Add a route to the newly added docker routing table that dictates all traffic
# go out the 192.168.1.2 interface on eth1
ip route add default via 192.168.1.2 dev eth1 table docker
# Flush the route cache
ip route flush cache
# Restart the Docker daemon so it uses the correct network settings
# Note, I do this as I found Docker containers often won't be able
# to connect out if any changes to the network are made while it's
# running
/etc/init.d/docker restart
Quando trago um contêiner, não consigo sair dele depois de fazer isso. Não tenho certeza se as interfaces de ponte são tratadas da mesma maneira que as interfaces físicas são para esse tipo de roteamento, e só quero uma verificação de sanidade, além de dicas de como eu posso realizar essa tarefa aparentemente simples.