Eu tenho um sistema Linux embarcado com duas interfaces de rede (lan0, wlan0) configuradas na mesma sub-rede. Um servidor neste sistema aceita conexões TCP em ambas as interfaces.
Como posso garantir que todas as respostas de uma sessão sejam enviadas na mesma interface em que a solicitação foi recebida? Ou seja, como todo o tráfego de uma sessão TCP pode ser limitado a uma interface de rede específica?
O soquete listen() e os soquetes aceitos podem ser vinculados a uma interface/dispositivo com setsockopt(fd, BIND_TO_DEVICE). O servidor faz isso para ambas as interfaces. Isso ajuda a detectar em qual interface a sessão foi criada e a limitar o tráfego de saída para a mesma interface.
Mas quando aceita () acontece, o SYN-ACK é enviado de volta ao cliente e um problema parece ser que esse pacote inicial pode ser enviado pela outra interface (errada) por causa da pesquisa ARP. O arp pode encontrar o endereço IP do cliente na outra interface/"errada" porque o cliente também está visível lá.
Responder1
Você pode limitar a conexão TCP para a interface usando iptables.
#iptables -A INPUT -p tcp -i eth0 --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
--limit 1/s: Maximum average matching rate in seconds
--limit-burst 3: Maximum initial number of packets to match