Получите доступ к сервисам вне 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)

Эти правила делают следующее:

  1. Флеш mangle таблица (требуется только для очистки любых ранее определенных правил)
  2. MARK входящие пакеты на внешний интерфейс для конкретного порта (80)
  3. Установить MARK исходного пакета (предыдущее правило) в качестве значения CONNMARK (conntrack mark) для всех пакетов соединения.
  4. Восстановить CONNMARK в OUTPUT цепь.
  5. MARK исходящие пакеты в OUTPUT цепь, где соединение CONNMARK является 0x1, это MARK может использоваться для сопоставления пакетов в политике маршрутизации с fwmark 0x1,

Я наконец решил свою проблему. Вот как я это сделал. В настройках веб-администратора OpenVPN Access Server в разделе "Маршрутизация" параметров VPN я проверил

нет

на вопрос

"Должен ли интернет-трафик клиента маршрутизироваться через VPN?"

Затем я вернулся на клиентскую сторону и сбросил все предыдущие правила, добавленные в таблицу mangle. Затем пришло волшебство! Теперь я могу подключиться к своему VPN, пока мой Apache все еще доступен для общественности.

Другие вопросы по тегам