У меня есть встроенная система с двумя портами ethernet. Эти два порта подключены к двум разным портам ethernet на linux box. На linux box есть еще третий порт который подключен к WAN.
Настройка выглядит следующим образом
_________________
eth0 ---- USB2ETH adapter-------(ethusb0)------------------| |
(IP: 192.168.2.50) (IP: 192.168.2.1) | Linux |
(Netmask: 255.255.255.0) (Netmask: 255.255.255.0) | Box |-------ethext0----WAN
| |
eth1----USB2ETH adapter--------(ethusb1)-------------------|_________________|
(IP: 192.168.3.50) (IP: 192.168.3.1)
(Netmask: 255.255.255.0) (Netmask: 255.255.255.0)
Оба интерфейса находятся в разных доменах, но имеют одинаковую маску сети, как показано выше.
ethusb0 и ethusb1 запускают dhcp-серверы. Я обновил /etc/dhcp/dhcpd.conf соответствующим образом, и eth0 и eth1 получили IP-адреса.
На компьютере linux я настроил iptables для приема и пересылки пакетов с ethusb0 на ethext0.
sudo iptables --policy FORWARD ACCEPT
sudo iptables -A FORWARD -i ethusb0 -o ethext0 -j ACCEPT
sudo iptables -A FORWARD -i ethext0 -o ethusb0 -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o ethext0 -j MASQUERADE
Аналогичные iptables настроены и для ethusb1.
На компьютере linux я также обновил /etc/network/interfaces для ethusb0 и ethusb1 , добавив dns-nameservers. Допустим, адрес сервера 192.0.3.3.
Теперь, из встроенной системы, с обоих портов я могу пинговать dns-сервер. Когда я делаю nslookup имени сервера, это удается в большинстве случаев.
Я наблюдал в wireshark за ethusb0 и ethext0 и могу видеть запросы и ответы nslookup. Запросы принимаются на ethusb0 и затем пересылаются на ethext0, а ответы с ethext0 на ethusb0.
Я также дважды проверил счетчик статистики пересылки в iptables для этих интерфейсов.
Проблема:
Переходим к проблеме, которая возникает часто.
В некоторых случаях nslookup не работает. Пакеты запроса принимаются на ethusb0, но не пересылаются на ethext0. Это подтверждается мониторингом wireshark, а также статистикой iptables. Но следующий запрос nslookup проходит успешно.
Я провел дальнейшее расследование и обнаружил аномалию в кадрах запроса nslookup, исходящих со стороны встроенной системы. Кадры, отправленные, скажем, на eth0, имели MAC-адрес eth0, но IP-адрес eth1. Только для таких кадров нарушается правило пересылки.
Во-первых, я не знаю и не понимаю, почему пакеты запроса содержат несовпадающие MAC и IP адреса. Обычно для передачи/приема пакетов выбирается один и тот же интерфейс. Только когда я выключаю и поднимаю интерфейс (например, eth0), выбирается другой интерфейс.
Во-вторых, я не совсем понимаю, почему пакеты не пересылаются. Я подозреваю, что происходит какая-то проверка MAC и IP адресов, которая заставляет машину linux отбрасывать эти пакеты. Но iptables не сообщает о количестве отброшенных пакетов.
Я проверил такие посты as https://unix.stackexchange.com/questions/58395/make-nslookup-use-specific-interface but, но это не помогло.
Что только не пробовал,
Не мог бы кто-нибудь сообщить мне, нужно ли добавить какие-либо дополнительные правила в iptables или интерфейсы на стороне встроенной системы должны быть настроены по-другому?
Либо отключение, либо установка фильтрации обратного пути в свободный режим для частных интерфейсов устраняет проблему.
echo 2 > /proc/sys/net/ipv4/conf/ethusb0/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/ethusb1/rp_filter