Назад | Перейти на главную страницу

Получите доступ к сервисам за пределами VPN при туннелировании сервера доступа OpenVPN

У меня два VPS, на одном из которых я установил OpenVPN Access Server, а на втором vpn client. Когда я подключаю клиента к OpenVPN AS, я не могу получить доступ к 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

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

Нет

на вопрос

«Следует ли маршрутизировать клиентский интернет-трафик через VPN?»

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

Для этого используйте маршрутизацию политики на стороне клиента.

Маршрутизация политики

Пример политики маршрутизации 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.