iptables e redirecionamentos múltiplos nat

1

Eu tenho cerca de 20 VPS (rodando em um IP local) na minha máquina e estou redirecionando certas portas usando o iptables nesses VPSs com um script:

iptables -t nat -A PREROUTING -p tcp -d %hostIP% --dport %real_port% -i eth0 -j DNAT --to-destination %vps_local_ip%":%vps_destination_port%

Para atualizar (novos vps criados ou apagados) eu tenho que rodar como comandos do 2000 iptables, primeiro eu apago todas as regras e depois as insiro novamente, algumas vezes alguns comandos são pulados porque o iptables não pode processá-lo tão rápido, adicionar um intervalo não é uma opção, pois preciso concluir esses comandos rapidamente.

Existe alguma solução melhor para este problema?

    
por Welite 08.04.2018 / 13:52

2 respostas

2

Não vejo motivo para redefinir todas as regras quando um VPS foi alterado. A menos que você quisesse dizer 2000 comandos por VPS, mas nesse caso eu suponho que você esteja fazendo algo errado.

Em geral, sugiro que você tenha duas cadeias para cada VPS, uma ativa e outra inativa. Se você realmente precisa esperar por dois comandos iptables , basta fazê-lo - enquanto configura a cadeia inativa. Quando isso é feito, você altera a referência da cadeia ativa para a inativa na cadeia principal (provavelmente PREROUTING ).

Se você estiver usando muitos comandos iptables para verificar qual VPS é o destino, então você pode começar a usar ipset para fazer isso com um único comando.

exemplo

Você cria duas cadeias para todas as cadeias ativas e todas as cadeias inativas. Isso permite uma mudança sem condição de corrida.

iptables -t nat -I PREROUTING 1 -j chaingroup_a

iptables -t nat -A chaingroup_a -j vps_1a
iptables -t nat -A chaingroup_a -j vps_2a
iptables -t nat -A chaingroup_a -j vps_3a
iptables -t nat -A chaingroup_a -j ACCEPT # stop applying rules

iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 42 -j DNAT --to-destination 10.1.2.3:4242

Se a configuração for alterada, você redefine as cadeias inativas e as configura:

iptables -t nat -F chaingroup_b
iptables -t nat -F vps_1b
iptables -t nat -F vps_2b
iptables -t nat -F vps_3b

iptables -t nat -A chaingroup_b -j vps_1b
iptables -t nat -A chaingroup_b -j vps_2b
iptables -t nat -A chaingroup_b -j vps_3b
iptables -t nat -A chaingroup_b -j ACCEPT # stop applying rules

iptables -t nat -A vps_1a -d 1.2.3.4 -p tcp --dport 4321 -j DNAT --to-destination 10.1.2.3:12345

Após a preparação, você torna o grupo de cadeias inativo o ativo:

iptables -t nat -I PREROUTING 1 -j chaingroup_b

Devido ao -j ACCEPT no final de chaingroup_b , o chaingroup_a ainda existente é ignorado. Mas você deve excluí-lo assim mesmo para evitar que PREROUTING cresça com cada alteração:

iptables -t nat -D PREROUTING 2
    
por 08.04.2018 / 15:22
1

Por uma questão de fato, o iptables pode ser rápido o suficiente e eu testei isso para quase 1900 regras. Tudo o que você precisa é manter o controle de ip: ports em um arquivo de lista e, em seguida, escrever um script, por exemplo, um script bash como o seguinte, e recarregar ip: port desse arquivo

Eu assumo que cada linha no arquivo é algo como realport: vps-ip: port

#/bin/bash
HOST=100.200.100.200 # your public address
LIST=/path/to/file

iptables -t nat -F
cat "$LIST" | while read line
do
realport='echo $line|cut -f1 -d:'
vpsip='echo $line|cut -f2 -d:'
port='echo $line|cut -f3 -d:'
iptables -t nat -A PREROUTING -p tcp -d $HOST --dport $realport -i eth0 -j DNAT --to-destination $vpsip:$port
done

iptables save

Dessa forma, você só precisa cuidar da lista. Você também pode usar outros formatos em vez de realport: vps-ip: port, por exemplo, torná-lo separado por vírgulas. Em seguida, altere-d: para -d ou o que for.

    
por 08.04.2018 / 15:10