Получите доступ к сервисам вне VPN при туннелировании OpenVPN Access Server
У меня есть два VPS с одним, на котором я установил OpenVPN Access Server и vpn клиент на втором. Когда я подключаю клиента к AS OpenVPN, я не могу получить доступ к apache, который установлен на клиенте, с его общедоступного IP-адреса. Я хочу, чтобы некоторые сервисы, такие как apache и postfix, были доступны из общедоступного интернета на клиентском сервере при туннелировании других сервисов, установленных на машине. Как я могу это сделать?
Вот содержание моего /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 inet
Когда клиент отключен, ip route show
дает:
default via <router_ip> dev <ext_if>
<netw_addr> via <router_ip> dev <ext_if>
<netw_addr> dev <ext_if> proto kernel scope link src <public_ip>
Когда клиент подключен, ip route show
дает:
0.0.0.0/1 via <private_router_ip> dev <vpn_if>
default via <router_ip> dev <ext_if>
128.0.0.0/1 via <private_router_ip> dev <vpn_if>
<vpn_addr> dev <vpn_if> proto kernel scope link src <private_ip>
<vpn_server_public_ip> via <router_ip> dev <ext_if>
<netw_addr> via <router_ip> dev <ext_if>
<netw_addr> dev <ext_if> proto kernel scope link src <public_ip>
Когда клиент подключен, ip addr show
дает
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: <ext_if>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
inet <public_ip>/<netmask> brd <ext_broadcast_ip> scope global <ext_if>
valid_lft forever preferred_lft forever
inet6 XXXX:XXXX:XXXX:XXXX::XX scope global
valid_lft forever preferred_lft forever
inet6 XXXX::XX:XXXX:XXXX:XXXX/XX scope link
valid_lft forever preferred_lft forever
18: <vpn_if>: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet <private_ip>/<netmask> brd <private_broadcast_ip> scope global <vpn_if>
valid_lft forever preferred_lft forever
2 ответа
Используйте политику маршрутизации на стороне клиента, чтобы сделать это.
Политика маршрутизации
Пример политики маршрутизации службы http (порт 80) через Интернет:
echo "1 inet" >> /etc/iproute2/rt_tables
Добавить маршрут по умолчанию в inet
таблица маршрутизации
ip route add default via <router_ip> dev <if> table inet
<if>
: заменить на имя интерфейса, напрямую подключенного к Интернету (т.е.eth0
)<router_ip>
: замените IP-адрес маршрутизатора (шлюза) в подсети на стороне Интернета. Этот маршрутизатор определен как шлюз по умолчанию, а клиентский сервер не подключен через VPN. Чтобы получить этот IP, отключите / закройте VPN-клиент и введите:ip route show | grep default
Добавьте правило маршрутизации для отправки всего, отмеченного fwmark 0x1
к таблице маршрутизации inet
ip rule add from all fwmark 0x1 table inet
Маркировка пакетов с iptables
для политики маршрутизации
Пометить пакеты с портом 80
в качестве пункта назначения в MANGLE
таблица (повторите ... --dport 80 ...
линия для любого другого сервиса / порта).
iptables -t mangle -F
iptables -t mangle -A PREROUTING -i <if> -p tcp --dport 80 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m connmark --mark 0x1 -j MARK --set-mark 0x1
<if>
: заменить на имя интерфейса, напрямую подключенного к Интернету (т.е.eth0
)
Эти правила делают следующее:
- Флеш
mangle
таблица (требуется только для очистки любых ранее определенных правил) MARK
входящие пакеты на внешний интерфейс для конкретного порта (80)- Установить
MARK
исходного пакета (предыдущее правило) в качестве значенияCONNMARK
(conntrack mark
) для всех пакетов соединения. - Восстановить
CONNMARK
вOUTPUT
цепь. MARK
исходящие пакеты вOUTPUT
цепь, где соединениеCONNMARK
является0x1
, этоMARK
может использоваться для сопоставления пакетов в политике маршрутизации сfwmark 0x1
,
Я наконец решил свою проблему. Вот как я это сделал. В настройках веб-администратора OpenVPN Access Server в разделе "Маршрутизация" параметров VPN я проверил
нет
на вопрос
"Должен ли интернет-трафик клиента маршрутизироваться через VPN?"
Затем я вернулся на клиентскую сторону и сбросил все предыдущие правила, добавленные в таблицу mangle. Затем пришло волшебство! Теперь я могу подключиться к своему VPN, пока мой Apache все еще доступен для общественности.