Вводные данные: 2 сервера Linux связаны между собой через OpenVPN туннель. Нужно для части клиентов за одним из концов VPN’a завернуть весь трафик в туннель, то есть, что бы они выходили в интернет не через свой GW, а через удалённый GW, пройдя через VPN.
UPD. В данной схеме есть нюанс: она будет работать, если клиентские машины находятся за хостом, который является OpenVPN-клиентом. В обратном случае, пакеты просто не будут покидать хост, хотя через tcpdump вы их будете видеть. Связано это с особенностями самого OpenVPN’a. Пока не нашёл как это можно решить. Как workaround, можно либо изменить роли клиент-сервер, либо использовать простой туннель или другой тип VPN’a.
Настройки клиента
В client.conf OpenVPN’a добавляем такую строку
up /etc/openvpn/client.sh
Сам client.sh:
#!/bin/sh /sbin/ip route add default via 10.6.11.1 proto static table T2
/sbin/ip route add 192.168.55.3 via 10.6.11.2 dev tun4
/sbin/ip route add 192.168.55.4 via 10.6.11.2 dev tun4
/opt/scripts/remote_vpn.sh
где 10.6.11.1 – внутренний IP тунеля удалённого сервера, таблица T2 описана в файле /etc/iproute/rt_table так:
251 T2
Сам /opt/scripts/remote_vpn.sh выглядит так:
#!/bin/sh IP=/sbin/ip table="T2" $IP rule del table $table while $IP rule delete from 0/0 to 0/0 table $table do true done $IP rule add from 192.168.55.3/32 to 0/0 table $table $IP rule add from 192.168.55.4/32 to 0/0 table $table
После изменений (внесение/удаление новых IP), просто перезапускаем этот скрипт.
Настройка сервера
Тут единственное, что нужно, так это разрешить клиентам 192.168.55.3,… выходить в интернет. То есть, разрешить для них NAT + правила FireWall.
====================================================================
Дополнение.
Если по какой-то причине это не работает, есть вариант заворачивать пакеты на уровне меток.
- Правило для роутинга на основе меток:
# ip rule add fwmark 0x3 lookup T2
- Правило файервола (тут происходит процесс “навешивания” меток):
# iptables -t mangle -A PREROUTING -i $int_if -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x3
UPD.
Иногда, при использовании multiport часть трафика перестает заворачиваться. Workaround в этом случае только один – для каждого порта отдельное правило.