Eu tenho uma configuração incomum no meu servidor. Temos três portas Ethernet de saída, todas conectadas a uma única interface de ponte que dividimos em duas VLANs:
ip link add veth type bridge
ip link set veth address 01:23:45:67:89:0A
ip link set dev eth1 master veth
ip link set dev eth2 master veth
ip link set dev eth3 master veth
[...]
ip link add veth name veth.10 type vlan id 10
ip link add veth name veth.20 type vlan id 20
ip link add veth.20-local link veth.20 type macvlan mode bridge
[...]
docker network create --driver=macvlan --subnet=192.168.XXX.0/24 --opt com.docker.network.driver.mpu=1500 --gateway 192.168.XXX.1 --opt parent=veth.20-local dockerbr20
Eu tenho uma imagem docker dentro do meu servidor conectada ao veth.20
endereço, que só tem permissão para se comunicar por veth.20
. Existem regras de roteamento e encaminhamento no restante da rede que permitem que a imagem do Docker se comunique com alguns destinos selecionados fora dessa VLAN.
Gostaria de adicionar uma iptables
regra cobrindo pacotes de saída que deixam meu servidor fora da veth.20
interface, independentemente do seu destino. (Alguns pacotes devem permanecer dentro da veth.20
interface; alguns podem ser roteados para outras VLANs.)
As seguintes regras foram tentadas e, por qualquer motivo, não parecem marcar os pacotes que saem veth.20
do contêiner do docker:
iptables -A POSTROUTING -t mangle -o veth.20 -j MARK --set-mark 3
iptables -A PREROUTING -t mangle -i veth.20 -j MARK --set-mark 3
iptables -A POSTROUTING -t nat -o veth.20 -j MARK --set-mark 3
iptables -A PREROUTING -t nat -i veth.20 -j MARK --set-mark 3
iptables -A OUTPUT -t mangle -o veth.20 -j MARK --set-mark 3
iptables -A INPUT -t mangle -i veth.20 -j MARK --set-mark 3
iptables -A FORWARD -i veth.20 -j MARK --set-mark 3
iptables -A FORWARD -o veth.20 -j MARK --set-mark 3
Isto é, iptables -L -n -v -t mangle
e iptables -L -n -v -t nat
não mostra nenhuma dessas regras sendo aplicadas a pacotes de saída veth.20
para um host em outra VLAN.
Confirmei, por meio de ifconfig
, que todos os pacotes da imagem do docker estão saindo do servidor veth.20
; o
iptables -A OUTPUT -t mangle -o veth.20 -j MARK --set-mark 3
a regra se aplica quando envio pacotes para máquinas externas na VLAN 20, do servidor ou da imagem do docker; mas quando envio pacotes pela veth.20
interface do docker que são roteados para um endereço VLAN 10 ou VLAN 30 externo (não ilustrado), nenhuma marca é aplicada.
Acho que esse deveria ser um problema simples, mas nada do que tentei foi capaz de marcar com base na interface que o pacote usa para sair da caixa. o que estou perdendo?