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

OpenVPN + iptables / маршрутизация NAT

Я пытаюсь настроить OpenVPN VPN, который будет передавать некоторый (но не весь) трафик от клиентов в Интернет через сервер OpenVPN.

Мой сервер OpenVPN имеет общедоступный IP-адрес на eth0 и использует tap0 для создания локальной сети 192.168.2.x. У меня есть клиент, который подключается с локального IP 192.168.1.101 и получает IP-адрес VPN 192.168.2.3.

На сервере я запустил:

iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

На клиенте по умолчанию остается маршрутизировать через 192.168.1.1. Чтобы указать 192.168.2.1 для HTTP, я запустил

ip rule add fwmark 0x50 table 200
ip route add table 200 default via 192.168.2.1
iptables -t mangle -A OUTPUT -j MARK -p tcp --dport 80 --set-mark 80

Теперь, если я попытаюсь получить доступ к веб-сайту на клиенте (скажем, wget google.com), он просто зависнет там. На сервере я вижу

$ sudo tcpdump -n -i tap0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes
05:39:07.928358 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 558838 0,nop,wscale 5>
05:39:10.751921 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 559588 0,nop,wscale 5>

Где 74.125.67.100 - это IP-адрес, который он получает для google.com.

Почему не работает МАСКАРАД? Точнее, я вижу, что источник отображается как 192.168.1.101 - разве не должно быть чего-то, что указывало бы на то, что он пришел из VPN?

Изменить: некоторые маршруты [от клиента]

$ ip route show table main
192.168.2.0/24 dev tap0  proto kernel  scope link  src 192.168.2.4
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.101  metric 2
169.254.0.0/16 dev wlan0  scope link  metric 1000
default via 192.168.1.1 dev wlan0  proto static

$ ip route show table 200
default via 192.168.2.1 dev tap0

Можете ли вы опубликовать вывод ip route show table main и ip route показать таблицу 200? Я подозреваю, что вам не хватает пары маршрутов в таблице "200". Ваша таблица маршрутов «200» должна иметь примерно те же маршруты, что и «основная» таблица, с той лишь разницей, что это маршрут по умолчанию.


Я вижу, что вы обновили, и считаю, что мое первоначальное предложение было правильным. Обратите внимание, как в вашей основной таблице есть маршрут «ссылка на область действия» как для вашей локальной сети, так и для ссылки VPN? Эти маршруты также нужно добавить в таблицу «200».

Попробуйте выполнить эти команды в дополнение к другим командам, которые вы используете.

ip route add 192.168.2.0/24 dev tap0  proto kernel  scope link  src 192.168.2.4 table 200
ip route add 192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.101  metric 2 table 200
ip route flush cache

Если вы хотите создать сценарий для создания этих маршрутов, вы можете использовать это. Он скопирует все маршруты 'scope link' из основной таблицы маршрутов в другую таблицу.

#!/bin/bash
IFACE=wlan0
RT=200
/sbin/ip route list scope link table main proto kernel dev ${IFACE} \
| while read ROUTE ; do
    # and add that route to all the tables mentioned in the rrtables option
    # in the interfaces file
    /sbin/ip route add table ${RT} scope link proto kernel dev ${IFACE} ${ROUTE}
done

Очередное обновление. Я просто заметил, что раньше упустил кое-что довольно очевидное.

Ваш оператор MASQ, похоже, работает с eth0. Из опубликованных вами таблиц маршрутов ваше устройство вывода не eth0. Вместо этого.

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

Вероятно, вам следует просто использовать подобное утверждение.

iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE

Две вещи были неправильными:

Во-первых, на клиенте мне нужен был SNAT источник для фактического IP.

Во-вторых, фильтр обратного пути блокировал возвращаемые пакеты, считая их подделкой. echo 0 > /proc/sys/net/ipv4/conf/tun0/rp_filter исправил это

Попробуйте на сервере:

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

Думаю, это временно даст ему возможность. Если работает, добавьте:

net.ipv4.conf.default.forwarding=1 

в ваш /etc/sysctl.conf, чтобы сделать его постоянным.