Когда я попытался удалить некоторые провода Ethernet в моей домашней сети, я взял более старый ноутбук с Linux и попытался использовать его как своего рода Ethernet-2-WiFi-NAT-маршрутизатор (карта Wi-Fi не может выступать в качестве моста, поэтому я должен был сделать NAT). В основном это работает, но все клиенты за этим маршрутизатором NAT время от времени получают сетевые ошибки на соединениях TCP.
Во-первых, вот полная настройка:
INTERNET > wire > Standard Wi-Fi Router > air > Linux Router > Clients
После некоторого прослушивания маршрутизатора Linux и клиентов я обнаружил следующее:
- клиент, как обычно, подключается к удаленному серверу и получает некоторые данные
- клиент загружается (например, записывает данные на диск) и окно приема заполняется
- тогда клиент в основном говорит серверу подождать; в моем случае ACK с win = 0 или win <MTU - это последний ACK, который я вижу в перехвате перед разрывом соединения
- пока этот последний ACK путешествует, все еще есть некоторые пакеты, поступающие с удаленного сервера
- маршрутизатор Linux отвечает на каждый из этих пакетов с RST на удаленный сервер и поэтому разрушает соединение
- клиент запутался, потому что он получает RST от сервера в ответ на следующий пакет, который отправляет клиент
Так что это [5], это моя проблема здесь, и я хотел бы знать, почему это происходит и как это исправить.
Другие вещи, чтобы упомянуть:
- Сама беспроводная сеть работает нормально
- все клиенты не за коробкой Linux работают нормально
- UDP работает нормально, насколько я могу судить
iptables
на роутере Linux просто минимален
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -I FORWARD -i eth1 -o eth0 -s 192.168.2.0/24 -d 192.168.1.0/24 -j ACCEPT # for static routing iptables -I FORWARD -i eth0 -o eth1 -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT # for static routing
Я также обнаружил, что установка политики удаления цепочки ввода помогает, так как она отбрасывает нежелательные пакеты, которые приводят к сбросу, но это ИМХО просто грязное исправление.