Reescreva o IP de origem nas respostas TCP usando iptables

2

Gostaria de reescrever o IP de origem no tráfego TCP / 514, deixando uma máquina de redhat, para conexões que não foram iniciadas a partir da máquina.

A máquina recebe o tráfego TCP / 514 em uma interface, por exemplo, 10.10.0.20, e gostaria de retornar o tráfego como se a resposta fosse 10.10.0.15 (que não está atribuída à máquina).

Se eu estivesse iniciando a conexão, eu poderia usar a tabela nat e:

iptables -A POSTROUTING -t nat -p tcp --sport 514 -j SNAT --to=10.10.0.15

.. mas desde que eu estou respondendo ao tráfego de entrada, eu não posso fazê-lo bater na tabela nat (tanto quanto eu posso dizer). Ignorando as razões por que preciso fazer as coisas dessa maneira, como posso fazer isso funcionar?

Mais informações:

It's a redhat 7 machine sitting behind a Netscaler VIP which receives syslog traffic over TCP (not UDP). I'm using client IP passthrough on the VIP. Due to the firewall seeing return traffic coming from the syslog server IP, not the VIP's IP, the firewall is dropping the traffic, and hence I'd like to rewrite TCP replies from the syslog server so they come from the VIP's IP address. Since the traffic doesn't originate from the backend server, I don't seem to be able to use the nat table (and therefore no -j SNAT).

O que vejo agora é:

13:13:45.439683 IP 10.10.0.8.31854 > 10.10.0.20.514: Flags [S], seq 544116376, win 8190, options [mss 1460], length 0
13:13:45.439743 IP 10.10.0.20.514 > 10.10.0.8.31854: Flags [S.], seq 4163333198, ack 544116377, win 14600, options [mss 1460], length 0

O que eu quero ver é:

13:13:45.439683 IP 10.10.0.8.31854 > 10.10.0.20.514: Flags [S], seq 544116376, win 8190, options [mss 1460], length 0
13:13:45.439743 IP 10.10.0.15.514 > 10.10.0.8.31854: Flags [S.], seq 4163333198, ack 544116377, win 14600, options [mss 1460], length 0
    
por Daneel 19.08.2015 / 08:47

1 resposta

2

Método DSR

A maneira mais eficiente seria configurar o modo Direct Server Return corretamente no Netscaler, onde o Netscaler faz o encaminhamento baseado em MAC para o servidor syslog com o endereço VIP de destino inalterado (10.10.0.15).

O servidor syslog também precisa ter esse endereço VIP para receber pacotes encaminhados pelo Netscaler. O endereço pode ser atribuído a qualquer interface interna, como lo ou dummy0 .

ip addr add 10.10.0.15/32 dev lo

E você tem que definir alguns sysctls na interface de entrada (aqui eu assumo eth0 ) para evitar problemas com o ARP para VIP (veja 6.7. The Cure: kernels 2.6.x - arp_ignore / arp_announce ). Adicione o seguinte em /etc/sysctl.conf e execute sysctl -p .

net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

Observe que é inútil definir arp_ignore / arp_announce on lo .

método DNAT

Se o Netscaler fizer o DNAT no tráfego de entrada, o servidor syslog definitivamente deve encaminhar o tráfego de retorno para o Netscaler, de modo que ele possa liberar o recurso de rastreamento de conexão. Essa é a maneira mais natural de completar a tradução de endereços.

Nesse caso, você pode querer utilizar o roteamento de política no servidor syslog. Com isso, você pode aplicar uma tabela de roteamento especial aos pacotes na condição específica, como "pacotes TCP de saída da porta 514".

Existem documentos HOWTO sobre o roteamento avançado do Linux como este. Eu recomendo que você dê uma olhada no último mini HOWTO para entender as seguintes instruções.

Primeiro, defina a tabela de roteamento especial denominada VIP com qualquer ID em /etc/iproute2/rt_tables :

1 VIP

Adicione uma rota padrão ao VIP (10.10.0.15) para esta VIP table:

ip route add default via 10.10.0.15 table VIP

Adicione uma entrada ao iptables mangle table para marcar 1 nos pacotes TCP de saída da porta 514:

iptables -t mangle -A OUTPUT -p tcp --sport 514 -j MARK --set-mark 1

Adicione uma regra para pesquisar a tabela de roteamento VIP nos pacotes com a marca 1 :

ip rule add from all fwmark 1 table VIP

Você pode ver as regras definidas até o momento por ip rule list . As regras são processadas em ordem crescente de valor de prioridade (0 é a precedência mais alta).

# ip rule list
0:  from all lookup local 
32765:  from all fwmark 0x1 lookup VIP 
32766:  from all lookup main 
32767:  from all lookup default 

Você pode verificar o conteúdo de cada tabela de roteamento da seguinte forma:

# ip route ls table local
# ip route ls table VIP
# ip route ls table main
    
por 19.08.2015 / 19:57