Múltiplas fontes de IP em uma única interface no Linux

2

Poderíamos definir vários endereços IP em uma única interface, por exemplo, usando o NetworkManager:

Como fazer com que qualquer conexão fora deste PC use IPs diferentes?

por exemplo, se eu tiver 8 endereços IP ( 10.7.4.x , 10.7.4.x+1 , 10.7.4.x+2 , ...), quero conectar cada endereço de destino usando IPs diferentes, usando IP aleatório ou mod sequencial (quando destino IP mod 8 = 0, então use x , quando destino mod 8 = 1, então use x+1 , e assim por diante)

    
por Kokizzu 06.05.2015 / 07:34

2 respostas

8

No Linux, a seleção de endereços de origem para conexões de saída pode ser controlada pela tabela de roteamento:

ip route add 10.11.12.0/24 via 10.7.4.1 src 10.7.4.200

Isso é suficiente se você precisar usar endereços de origem diferentes para alguns intervalos IP fixos. No entanto, combinando o poder do netfilter do Linux ( iptables ) com o roteamento de políticas ( ip rule ), você pode obter uma seleção dinâmica do endereço de origem.

O procedimento básico é o seguinte:

  1. Defina as marcas apropriadas nos pacotes na cadeia PREROUTING da tabela mangle .
  2. Use tabelas de roteamento IP diferentes para pacotes com marcas diferentes ( ip rule add fwmark X table Y ).
  3. Em cada tabela de roteamento, use o endereço src necessário para os pacotes.

A configuração do netfilter para marcar os pacotes de acordo com o IP de destino para a configuração "mod 4" pode ser assim:

iptables -A PREROUTING  -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.0/0.0.0.3 \
  -j MARK --set-mark 1
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.1/0.0.0.3 \
  -j MARK --set-mark 2
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.2/0.0.0.3 \
  -j MARK --set-mark 3
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.3/0.0.0.3 \
  -j MARK --set-mark 4
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark

(Neste caso em particular, você pode omitir dois comandos CONNMARK , porque os outros comandos de marcação fornecerão o mesmo resultado para todos os pacotes na mesma conexão; no entanto, para casos mais complexos, como o uso round-robin da origem endereços, esses comandos são necessários para garantir que todos os pacotes na conexão usem a mesma rota.)

A configuração do roteamento IP pode ficar assim:

ip route add default via 10.7.4.1 src 10.7.4.200 table 1
ip route add default via 10.7.4.1 src 10.7.4.201 table 2
ip route add default via 10.7.4.1 src 10.7.4.202 table 3
ip route add default via 10.7.4.1 src 10.7.4.203 table 4

ip rule add fwmark 1 pref 1 table 1
ip rule add fwmark 2 pref 2 table 2
ip rule add fwmark 3 pref 3 table 3
ip rule add fwmark 4 pref 4 table 4
    
por 06.05.2015 / 13:21
4

O aplicativo ou a ferramenta com a qual você está realizando as conexões de saída deve entender que há vários endereços IP de origem possíveis e vincular explicitamente a qualquer endereço necessário.

Por exemplo ssh tem esse recurso por meio da opção -b ; por isso, se você usar ssh -b 10.7.4.201 ... , ele usará esse endereço como o endereço de origem.

Usar automaticamente os possíveis endereços de origem em, e. uma maneira round-robin não é possível.

o que é -b flag?

-b bind_address
         Use bind_address on the local machine as the source address of
         the connection.  Only useful on systems with more than one
         address.
    
por 06.05.2015 / 08:52