Завернуть часть трафика в OpenVPN туннель.

Вводные данные: 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
/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

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

Ваш адрес email не будет опубликован.