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

Обход OpenVPN на некоторых портах

У меня есть сервер под управлением Debian 7, и я хотел бы подключиться к VPN и позволить всему трафику проходить через VPN, за исключением некоторых портов (SSH, размещенные веб-сайты и т. Д.).

Я уже некоторое время искал в Интернете, но ничего не работает, как ожидалось.

Я не специалист по iptables / сетям, так что, возможно, я что-то упускаю ...

Вот мои сценарии:

Перед скриптом VPN

Вот сценарий, запущенный до VPN, он используется для блокировки всего входящего / исходящего трафика без прохождения через VPN, за исключением некоторых портов (здесь SSH).

Если я запускаю только этот сценарий, он выполняет свою работу. Я могу подключиться к своему серверу через SSH, но все остальные порты заблокированы, и сервер не может выйти в Интернет (потому что VPN не запущен).

#!/bin/bash

# Flush iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Default policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Accept packets through VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT

# Accept local connections
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Accept connection to/from VPN servers
iptables -A INPUT -s xxx.xxx.xxx.xxx -j ACCEPT
iptables -A OUTPUT -d xxx.xxx.xxx.xxx -j ACCEPT

# Disable Reverse Path Filtering on all network interfaces
for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
    echo 0 > $i
done

# Open ports on iptable
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

Скрипт маршрутизации OpenVPN

Вот сценарий, вызываемый с помощью опции OpenVPN "route-up". Это сценарий, который должен заставить порты обходить VPN.

#!/bin/bash

WAN_GATEWAY="xxx.xxx.xxx.xxx"

echo 1 > /proc/sys/net/ipv4/ip_forward

# Delete table 100 and flush all existing rules
ip route flush table 100
ip route flush cache
iptables -t mangle -F PREROUTING

# Table 100 will route all traffic with mark 1 to WAN (no VPN)
ip route add default table 100 via $WAN_GATEWAY dev eth0
ip rule add fwmark 1 table 100
ip route flush cache

# Mark packets on port 22
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Файл конфигурации OpenVPN

Вот файл конфигурации клиента OpenVPN.

client
dev tun
proto udp
resolv-retry infinite
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun
comp-lzo
verb 3
redirect-gateway def1
user nobody
group nogroup
script-security 2
auth-user-pass /path/to/config/login.conf
route-up /path/to/scripts/vpn_up.sh
remote xxx.xxx.xxx.xxx 443
ca /path/to/config/certs/ch.crt

Моя проблема в том, что когда VPN включается, я больше не могу получить доступ к своему серверу.

Что я делаю не так?

Большое спасибо за твою помощь !

После небольшого поиска я нашел эту ветку: https://forum.linode.com/viewtopic.php?p=50114&sid=b440414422596bb7dbc96cf7c9ee511f#p50114

Я изменил свой скрипт OpenVPN для маршрутизации следующим образом, и он наконец заработал! Я удалил все остальные грязные правила (iptable PREROUTING, MASQUERADE и т. Д.).

Вот мой последний сценарий "маршрута":

ip route flush table 100
ip route flush cache

ip rule add from x.x.x.x table 100
ip route add table 100 to y.y.y.y/y dev ethX
ip route add table 100 default via z.z.z.z

Где x.x.x.x - это общедоступный IP-адрес моего сервера, y.y.y.y / y - это подсеть общедоступного IP-адреса моего сервера, ethX - это общедоступный интерфейс Ethernet моего сервера, а z.z.z.z - шлюз по умолчанию.

Надеюсь, это поможет кому-то другому.

Пройдя через то же самое испытание, я обнаружил по крайней мере одну проблему со сценарием маршрутизации.

iptables -t mangle -A PREROUTING ...

должно быть:

iptables -t mangle -A OUTPUT ...

О том, почему, читайте здесь: http://www.iptables.info/en/structure-of-iptables.html

Мне не пришлось включать переадресацию IP.