Alterando o endereço IP de saída aleatoriamente

1

Se tivermos um servidor com 10 endereços IP, existe uma maneira limpa de selecionar aleatoriamente um deles em cada solicitação de saída como o IP de origem?

Eu tentei o Apache Mod Proxy, mas aparentemente, mesmo que eu mude o endereço IP de origem por um script automaticamente, tenho que recarregar o Apache toda vez que faço isso.

Existe alguma ferramenta ou métodos limpos que possam lidar com isso?

Editar: mais informações

Existem vários clientes hospedados em um servidor

Muitos deles estão chamando a mesma API (usando cURL), que tem um limite de taxa de 2 por segundo, então, basicamente, quando um dos clientes envia 2 solicitações, as outras não conseguem!

Estou tentando rotacionar os servidores "Endereço IP de saída (IP de origem)" aleatoriamente em cada solicitação (a pergunta aqui) ou atribuir um IP de "SAÍDA" dedicado a cada host (que não é a questão aqui). / p>     

por T. Rex 30.01.2017 / 02:12

2 respostas

4

Você pode usar o módulo statistic iptables com uma regra SNAT como a seguir:

$ sudo iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.1 -j SNAT --to-source IP2
$ sudo iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.1 -j SNAT --to-source IP3
Other rules for remaining IPs ...

Você pode escolher entre random mode ou nth mode. 10 IPs fornecem 0,1 probabilidade para cada IP individual. Não é necessário adicionar uma regra para o IP da interface principal (IP1), pois é usado por padrão.

As regras acima são aplicadas a todos os tipos de tráfego. Você pode restringi-lo a um protocolo específico / porta, etc, conforme necessário.

    
por 30.01.2017 / 09:35
2

(Postado como uma resposta separada, porque é muito para ser um comentário sobre a resposta de Khaled)

Enquanto o módulo statistic funciona, as matemáticas estão aqui. A primeira regra é atingida com p=0.1 para qualquer pacote fornecido. A segunda regra corresponde a 10% dos restantes, por isso, atinge um total de p=0.1*0.9=0.09 . A terceira regra se aplica com p=0.1*0.9*0.9=0.081 e assim por diante. Para nove regras, há apenas uma probabilidade total de p=0.651 , portanto, o DROP implícito corresponderia a um terço de todos os pacotes. Você pode tentar por si mesmo:

$ for n in 'seq 9'; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode random --probability 0.1 -j ACCEPT; done
$ sudo iptables -A OUTPUT  --dest 10.10.10.10 -j ACCEPT
$ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10
$ sudo iptables-save -c | grep 10.10.10.10
[103:8652] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[90:7560] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[74:6216] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[70:5880] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[44:3696] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[43:3612] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[50:4200] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[380:31920] -A OUTPUT -d 10.10.10.10/32 -j DROP

Você pode ver que a primeira regra corresponde a cerca de 10% dos pacotes e a probabilidade de uma correspondência cair na linha, enquanto a% final DROP recebe muito mais do que deveria. Você pode ajustar suas probabilidades ou, mais fácil, usar o modo não probability , mas nth :

$ sudo iptables -F OUTPUT
$ for n in 'seq 10 -1 2'; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode nth --every $n --packet 0 -j DROP; done
$ sudo iptables -A OUTPUT  --dest 10.10.10.10 -j DROP
$ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 10 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 9 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 8 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 7 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 6 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 5 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 4 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 3 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 2 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -j DROP
    
por 01.02.2017 / 21:53