У меня есть сервер под управлением Debian 7, и я хотел бы подключиться к VPN и позволить всему трафику проходить через VPN, за исключением некоторых портов (SSH, размещенные веб-сайты и т. Д.).
Я уже некоторое время искал в Интернете, но ничего не работает, как ожидалось.
Я не специалист по iptables / сетям, так что, возможно, я что-то упускаю ...
Вот мои сценарии:
Вот сценарий, запущенный до 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 "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.
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.