Я пытаюсь настроить 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, чтобы сделать его постоянным.