Назад | Перейти на главную страницу

iptables: отмеченные пакеты не маршрутизируются по настроенному маршруту

Мне нужно настроить сервер брандмауэра с двумя линиями Интернета (A на eth1, B на eth0) и внутренней сетью (C на eth2). В дополнение к таблице маршрутизации по умолчанию (через A / eth1) у меня есть две таблицы маршрутизации со своими собственными шлюзами по умолчанию.

Как и ожидалось, я могу подключиться к серверу через интернет-линию A и SSH через порт 22. Но когда я пытаюсь связаться с ним через интернет-линию B, возвращаемые пакеты tcp / ip отправляются через интернет-линию A.

Очевидно, что когда я подключаюсь к серверу через интернет-линию B, я хочу, чтобы он отвечал через интернет-линию B.

Как я могу этого добиться?


Что я пробовал до сих пор: я настроил sshd так, чтобы он слушал второй порт (122). Затем я добавил

#!/bin/bash

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
ip rule add from all fwmark 1 table 2

ip route flush cache
iptables -A OUTPUT -p tcp --sport 122 -j LOG
iptables -A OUTPUT -t mangle -p tcp --sport 122 -j MARK --set-mark 1

Теперь я могу подключиться к серверу через интернет-линию B, но ответы регистрируются и возвращаются через интернет-линию A.


Что я еще пробовал:

Я могу контролировать трафик, исходящий от других компьютеров во внутренней сети C, который будет отправляться через интернет-линию A или B, просто пометив их пакеты в таблице предварительной маршрутизации:

$A -t mangle -A PREROUTING -p tcp --dport 80 -s 192.168.0.0/24 -j MARK --set-mark 2

Это очень хорошо работает.

Ваша установка требует использования PBR (маршрутизации на основе политик). Вы его используете, но не полностью. Вы можете решить проблему двумя способами:

  • Простой способ: просто добавьте два правила для каждого аплинка, например ip rule add from <srv-IP-A> table <tbl-A> pref 1001 и ip rule add from <src-IP-B> table <tbl-B> pref 1002, где A и B пересылаются ссылки. Он работает только для трафика от самого сервера, потому что он всегда отвечает с того же IP-адреса, на который поступает первоначальный запрос на соединение.

  • Трудный путь: используйте CONNMARK цель. Это будет работать во всех случаях. Логика: запись conntrack связана с соединением и может содержать внутри себя дополнительное значение. Вы можете клонировать это значение в / из метки брандмауэра и использовать совпадение в правилах iptables.