Мне нужно настроить сервер брандмауэра с двумя линиями Интернета (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.