Cenário
ClientA e ClientB estão conectados via VPN ao ServerA
Meta
Todo o tráfego do ClienteA que entra na Internet através do ServidorA deve usar o IP público 192.0.2.1
, e o ClienteB deve usar o IP público192.0.2.2
Configurar
Minha configuração é um servidor e quatro clientes, quero rotear todo o tráfego através do ServerA.
IP VPN | |
---|---|
ServidorA | 10.0.0.1 (192.0.2.1 e 192.0.2.2 (IPs públicos)) |
ClienteA | 10.0.0.2 |
ClienteB | 10.0.0.3 |
Regras
Eu adicionei essas regras via iptables
:
iptables -t nat -A POSTROUTING -s 10.0.0.2/22 -o eth0 -j SNAT --to 192.0.2.1
iptables -t nat -A POSTROUTING -s 10.0.0.3/22 -o eth0 -j SNAT --to 192.0.2.2
A configuração funciona bem, mas todo o tráfego é traduzido em IP 192.0.2.1
para ambos os clientes, embora eu tenha especificado que cada cliente sai através de um determinado IP público.
Para ser sincero, não sei se é possível o que quero, mas se puder ser feito, como seria.
No contexto do endereço do firewall, ambos
-s 10.0.0.2/22
e-s 10.0.0.3/22
funcionam como-s 10.0.0.0/22
, ou seja, a máscara mostra quantos bits analisar, e ambos.2
e não.3
devem ser analisados aqui. Essas partes não utilizadas são removidas antes de serem adicionadas a um firewall:Observe como
.2
é convertido silenciosamente para.0
. Verifique o seu depois de executar esses comandos comiptables-save
, você verá que criou duas regras com exatamente a mesma correspondência, portanto, apenas a primeira tem chance de disparar!Se você deseja que esses endereços e não uma sub-rede inteira correspondam, você não especifica a máscara (também conhecida como use a máscara
/32
):Atualização: as regras de firewall são processadas sequencialmente. A primeira regra correspondida encerra o processamento da cadeia. Portanto, se você deseja ter uma configuração NAT "padrão" e "substituí-la" para um número limitado de clientes, coloque as regras de "substituição" primeiro e depois faça uma regra "padrão" por último com uma correspondência ampla o suficiente:
Isto terá
192.0.2.1
como configuração "padrão" que corresponde a todos os clientes. A maioria dos clientes que não são.22
ou.44
não serão correspondidos pelas duas primeiras regras e serão traduzidos pela terceira. Os clientes especiais.22
também.44
teriam sido correspondidos com a última regra, mas existem regras dedicadas apenas para eles, que acontecem no início da cadeia e os traduzem em192.0.2.2
, para que o processamento não alcance a última regra.Você pode usar
-I
a ação para inserir a regra em um local arbitrário na cadeia preenchida (enquanto-A
sempre anexa ao final da cadeia). Por exemplo, você pode adicionar outra substituição na frente, acima da última regra geral:Isto colocará a nova regra na terceira posição, deslocando a regra geral para a quarta. Muitas vezes, como a ordem entre as substituições não é importante, você sempre as coloca na primeira posição; o único requisito aqui é colocar a nova regra acima da regra “padrão” de correspondência ampla.
Para completar, explicaria como as máscaras podem ser usadas corretamente no firewall.
Se você puder controlar as atribuições de endereços IP dos clientes, poderá agrupar os clientes que devem ser mapeados de maneira semelhante em blocos. Em seguida, use máscaras para combinar com o bloco. O seguinte irá traduzir endereços IP
10.0.0.32÷.63
(inclusive) em192.0.2.1
e10.0.0.64÷.95
em192.0.2.2
:O exemplo acima distribui os clientes em blocos de 32 endereços que correspondem à máscara
/27
=255.255.255.224
. Observe que essas máscaras não estão correlacionadas com as máscaras de rede usadas na atribuição de endereços aos próprios clientes; estes desempenham um papel diferente. Além disso, o "primeiro e o último" endereço do bloco pode ser usado em sistemas clientes, uma vez que esses blocos não são usados como sub-redes, mas apenas para correspondência de firewall, porque sua sub-rede é10.0.0.0/22
onde endereços como.32
,.63
etc. não desempenham nenhum papel especial.Se não for possível agrupar clientes nesses blocos, você poderá usar
ipset
e a correspondência correspondente para distribuir clientes estaticamente. Primeiro crie um ipset dedicado para cada ip de saída:Em vez das regras acima, adicione regras NAT que correspondam ao conjunto correspondente:
Agora, você adiciona clientes aos conjuntos correspondentes e eles receberão NAT no IP correspondente:
Os blocos de endereços também podem ser usados como membros de conjuntos, portanto esta é a forma mais genérica. Leia a página do manual para descobrir como usá-los.