Маршрутизация трафика в Linux с двумя сетевыми интерфейсами

Вопрос или проблема

У меня есть два сетевых интерфейса 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.

  1. Добавьте маршрут для целевого IP через eth1:

    ip route add TARGET_IP via 192.168.1.254 dev eth1

Это укажет системе, что для трафика, адресуемого TARGET_IP, необходимо использовать интерфейс eth1 и его шлюз.

Шаг 2: Настройка iptables

Теперь нужно настроить iptables, чтобы разрешить трафик, который идет на MQTT (порт 8883), через интерфейс eth1. Для этого создадим правило, которое будет маркировать пакеты, и затем настроим параметры для маршрутизации.

  1. Установите пакет iptables-persistent, если его еще нет:

    sudo apt-get install iptables-persistent
  2. Создайте правило для маркировки трафика MQTT:

    sudo iptables -t mangle -A OUTPUT -p tcp --dport 8883 -j MARK --set-mark 1
  3. Добавьте правило для маршрутизации по этой метке:

    Во-первых, нужно настроить таблицу маршрутизации. Откройте файл /etc/iproute2/rt_tables и добавьте строку:

    100     mqtt

    Теперь создайте новую таблицу маршрутов для меток:

    ip route add default via 192.168.1.254 dev eth1 table mqtt
  4. Затем добавьте правило, которое будет использовать эту таблицу маршрутизации:

    ip rule add fwmark 1 table mqtt

Шаг 3: Сохранение правил

Чтобы сохранить ваши правила iptables и маршрутизации:

sudo iptables-save > /etc/iptables/rules.v4

И для сохранения правил маршрутизации, вы можете добавить команды в скрипт, который будет выполняться при загрузке системы (например, в /etc/rc.local).

Проверка работоспособности

Теперь вы можете проверить вашу конфигурацию:

  1. Для проверки маршрутов:

    ip route show
  2. Для проверки правил iptables:

    sudo iptables -t mangle -L -v
  3. Протестируйте отправку трафика на TARGET_IP через eth1 и убедитесь, что весь другой трафик идет через eth0.

Заключение

Таким образом, вы обеспечили маршрутизацию трафика для определённого IP через eth1, минимально изменив настройки остального трафика, который по-прежнему будет использовать eth0. Эта конфигурация позволяет вам эффективно управлять сетевыми маршрутами и осуществлять выборочный трафик.

Оцените материал
Добавить комментарий

Капча загружается...