У меня два 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
)Эти правила делают следующее:
mangle
таблица (требуется только для очистки любых ранее определенных правил)MARK
входящие пакеты на внешнем интерфейсе на определенный порт (80)MARK
исходного пакета (предыдущее правило) как значение CONNMARK
(conntrack mark
) для всех пакетов соединения.CONNMARK
в OUTPUT
цепь.MARK
исходящие пакеты в OUTPUT
цепочка, где связь CONNMARK
является 0x1
. это MARK
может использоваться для сопоставления пакетов в политике маршрутизации с fwmark 0x1
.