Como pode adicionar regras iptables depois que o Docker define suas próprias regras na inicialização?

2

Eu quero limitar as conexões para a execução de contêineres do Docker. Eu tenho um conjunto de regras iptables que fazem isso de forma eficaz. No entanto, o conjunto de regras depende da aplicação da minha própria cadeia de regras antes da cadeia DOCKER .

Basicamente, eu quero esse resultado

Chain FORWARD (policy DROP)
target     prot opt source               destination
PRE_DOCKER  all  --  0.0.0.0/0            0.0.0.0/0            /* Insert before Docker's filtering to apply our own */
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

Chain PRE_DOCKER (policy DROP)
target     prot opt source               destination
//My own rules go here targeting the DOCKER chain

Estou tendo problemas para obter essas regras definidas na inicialização do sistema. Eu tenho um arquivo systemd com o conteúdo

[Unit]
Description=Restore iptables firewall rules
Before=iptables-store.service
Requires=docker.service
After=docker.service
Conflicts=shutdown.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore --noflush /var/lib/iptables/rules-save

[Install]
WantedBy=basic.target

Mas na inicialização, recebo o erro

iptables-restore v1.4.21: Couldn't load target 'DOCKER':No such file or directory

que eu assumo significa que o serviço Docker ainda não criou suas regras.

Qual é a maneira correta de estruturar meus arquivos unitários ou minhas regras iptables para que eu tenha a saída desejada.

Para completar, aqui está o conteúdo de /var/lib/iptables/rules-save que eu configurei.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:PRE_DOCKER - [0:0]

-I FORWARD -o docker0 -j PRE_DOCKER -m comment --comment "Insert before Docker's filtering to apply our own"
-A PRE_DOCKER ! -i eth0 -o docker0 -j DOCKER -m comment --comment "Anything coming from something other than the public interface send to DOCKER chain"
-A PRE_DOCKER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow connections from established connections"
-A PRE_DOCKER -j DROP -m comment --comment "Drop anything else"

-A INPUT ! -i eth0 -j ACCEPT -m comment --comment "Accept anything coming from something other than the public interface"
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow connections from established connections"
COMMIT
    
por Kris Harper 05.10.2015 / 23:51

1 resposta

0

Eu realmente não consegui descobrir isso. Eu acho que há algum problema de tempo com quando o docker.service cria a cadeia iptables DOCKER versus quando o systemd a vê como concluída.

Então eu recorri a um método de pesquisa que verifica se a cadeia está presente e só então tenta restaurar as regras.

while ! iptables -n --list DOCKER >/dev/null 2>&1
do
    sleep 1;
done

/sbin/iptables-restore --noflush /var/lib/iptables/rules-save
    
por 06.10.2015 / 20:39