Как ограничить весь TCP-трафик сетевым интерфейсом, на котором был инициирован сеанс?

Как ограничить весь TCP-трафик сетевым интерфейсом, на котором был инициирован сеанс?

У меня есть встроенная система Linux с двумя сетевыми интерфейсами (lan0, wlan0), настроенными на одну и ту же подсеть. Сервер в этой системе принимает tcp-соединения на обоих интерфейсах.

Как я могу гарантировать, что все ответы для сеанса отправляются на тот же интерфейс, на который был получен запрос? Т.е. как можно ограничить весь трафик сеанса TCP определенным сетевым интерфейсом?

Сокет listen() и принятые сокеты могут быть привязаны к интерфейсу/устройству с setsockopt(fd, BIND_TO_DEVICE). Сервер делает это для обоих интерфейсов. Это помогает определить, на каком интерфейсе был создан сеанс, и ограничить исходящий трафик тем же интерфейсом.

Но когда происходит accept(), SYN-ACK отправляется обратно клиенту, и проблема, похоже, в том, что этот начальный пакет может быть отправлен через другой (неправильный) интерфейс из-за поиска ARP. ARP может найти IP-адрес клиента на другом/"неправильном" интерфейсе, потому что клиент также виден там.

решение1

Вы можете ограничить TCP-соединение для интерфейса с помощью 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

Связанный контент