У нас есть сервер OpenSUSE, на котором запущена служба. У нас в сети два шлюза. Один из этих шлюзов установлен в качестве шлюза по умолчанию для сервера. В этом случае сервер может принимать соединения, которые идут только через этот шлюз. Но он не может обслуживать соединения, поступающие из другого шлюза (насколько я понимаю, он отправляет ответы обратно на шлюз по умолчанию, но не на шлюз, с которого пришли эти запросы).
Можем ли мы настроить сервер так, чтобы он мог обслуживать соединения с обоих шлюзов? (Я слышал слова «маршрутизация на основе источника», но не уверен, так ли это).
Если ваша таблица маршрутизации в порядке, сервер имеет отправлять ответы на правильный GW
Как вы правильно указали, вы должны настроить маршрутизацию на основе источника, эта ссылка должно быть хорошей отправной точкой для создания базы знаний по теме.
Это возможно и довольно легко настроить. Мы будем использовать iproute2 и iptables МАРК и КОННМАРК для этого.
Идея состоит в том, что мы будем отмечать пакеты, поступающие от второго шлюза (не шлюза по умолчанию, который использует сервер), и при ответе мы направим эти пакеты через тот же интерфейс.
Предположим, что IP-адрес второго шлюза - 2.2.2.2, а интерфейс на сервере, подключенном к шлюзу, - eth2.
Сначала настроим таблицу маршрутизации для второго шлюза (для этого мы используем таблицу 20):
# ip route add default via 2.2.2.2 table 20
И установите правило, согласно которому пакеты, отмеченные цифрой 200, будут маршрутизироваться с использованием таблицы 20:
# ip rule add fwmark 200 table 20
Вы можете проверить, используя:
# ip route list table 20
# ip rule list
Теперь используя iptables мы отмечаем пакеты, поступающие со второго шлюза (в интерфейсе eth2), меткой 200:
1 # iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
2 # iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
3 # iptables -t mangle -A PREROUTING -i eth2 -j MARK --set-mark 200
4 # iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
Для получения дополнительных сведений о том, как работают эти MARK и CONNMARK, см. Вот
Если 2 ваших шлюза находятся в одной сети, и ваш сервер использует только один интерфейс для подключения к обоим из них, то определенно команда iptables номер 3, указанная выше, не будет работать. Вы можете использовать другой, основанный на MAC-адресе, например:
# iptables -t mangle -A PREROUTING -m mac --mac-source AA:BB:CC:DD:EE:FF -j MARK --set-mark 200
Конечно, AA: BB: CC: DD: EE: FF - это MAC-адрес второго шлюза.