Вопрос или проблема
У меня есть два сетевых интерфейса eth0 и eth1. У каждого из них есть свои шлюзы.
Eth0 (10.0.0.1) настроен с использованием шлюза по умолчанию (10.0.0.254), а eth1 (192.168.1.1) подключен к другому шлюзу (192.168.1.254).
Весь трафик в данный момент проходит через eth0.
Но сейчас мне нужно использовать интерфейс eth1 и шлюз за ним для отправки данных (MQTT, порт 8883) на конкретный целевой IP.
Eth1 должен использоваться только когда запрашивается конкретная цель, в противном случае шлюз по умолчанию подходит.
Как можно решить эту проблему, используя iptables на моем Raspberry Pi OS?
Есть идеи?
Ответ или решение
Для маршрутизации трафика через два сетевых интерфейса в Linux, где необходимо направлять определенный трафик через один интерфейс, а остальной трафик через другой, можно воспользоваться правилами маршрутизации и iptables
. Давайте рассмотрим, как сделать это на основе вашего случая с интерфейсами eth0
и eth1
.
Шаг 1: Настройка маршрутизации
Сначала необходимо определить маршруты для обоих интерфейсов. В вашем случае:
eth0
с IP 10.0.0.1 и шлюзом 10.0.0.254 – это интерфейс по умолчанию.eth1
с IP 192.168.1.1 и шлюзом 192.168.1.254, который будет использоваться только для определённого IP-адреса.
Мы предполагаем, что целевой IP, к которому вы хотите направить трафик, – это TARGET_IP
.
-
Добавьте маршрут для целевого IP через
eth1
:ip route add TARGET_IP via 192.168.1.254 dev eth1
Это укажет системе, что для трафика, адресуемого TARGET_IP
, необходимо использовать интерфейс eth1
и его шлюз.
Шаг 2: Настройка iptables
Теперь нужно настроить iptables
, чтобы разрешить трафик, который идет на MQTT (порт 8883), через интерфейс eth1
. Для этого создадим правило, которое будет маркировать пакеты, и затем настроим параметры для маршрутизации.
-
Установите пакет iptables-persistent, если его еще нет:
sudo apt-get install iptables-persistent
-
Создайте правило для маркировки трафика MQTT:
sudo iptables -t mangle -A OUTPUT -p tcp --dport 8883 -j MARK --set-mark 1
-
Добавьте правило для маршрутизации по этой метке:
Во-первых, нужно настроить таблицу маршрутизации. Откройте файл
/etc/iproute2/rt_tables
и добавьте строку:100 mqtt
Теперь создайте новую таблицу маршрутов для меток:
ip route add default via 192.168.1.254 dev eth1 table mqtt
-
Затем добавьте правило, которое будет использовать эту таблицу маршрутизации:
ip rule add fwmark 1 table mqtt
Шаг 3: Сохранение правил
Чтобы сохранить ваши правила iptables
и маршрутизации:
sudo iptables-save > /etc/iptables/rules.v4
И для сохранения правил маршрутизации, вы можете добавить команды в скрипт, который будет выполняться при загрузке системы (например, в /etc/rc.local
).
Проверка работоспособности
Теперь вы можете проверить вашу конфигурацию:
-
Для проверки маршрутов:
ip route show
-
Для проверки правил
iptables
:sudo iptables -t mangle -L -v
-
Протестируйте отправку трафика на
TARGET_IP
черезeth1
и убедитесь, что весь другой трафик идет черезeth0
.
Заключение
Таким образом, вы обеспечили маршрутизацию трафика для определённого IP через eth1
, минимально изменив настройки остального трафика, который по-прежнему будет использовать eth0
. Эта конфигурация позволяет вам эффективно управлять сетевыми маршрутами и осуществлять выборочный трафик.