Я использую службу динамического DNS, которая отправляет обновления IP-адреса с моего маршрутизатора. В настройках маршрутизатора порты 22 и 80 перенаправлены на мой сервер по адресу 192.168.1.10. У меня есть веб-сервер и sshd, запущенные на моем сервере. Из-за пределов моей локальной сети я могу перейти на mydomain.dyndns.org или ssh на свой сервер. Это работает нормально, пока я не подключусь к OpenVPN. Когда я подключаю свой сервер к провайдеру OpenVPN, я больше не могу подключаться к моему серверу по ssh из-за пределов моей локальной сети. Таймаут http и ssh. Даже если я вырезал dyndns и просто использовал IP-адрес WAN, он все равно истекает с подключенным OpenVPN и работает, когда я останавливаю OpenVPN.
Мой провайдер OpenVPN (я не контролирую), который отправляет маршруты мне (клиенту). В частности, при подключении к openvpn выполняются следующие команды:
/sbin/ifconfig tun0 10.15.0.74 pointopoint 10.15.0.73 mtu 1500
/sbin/route add -net 141.255.164.66 netmask 255.255.255.255 gw 192.168.1.1
/sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
/sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
/sbin/route add -net 10.15.0.1 netmask 255.255.255.255 gw 10.15.0.73
и добавленные маршруты удаляются с помощью del
когда vpn соединение закрывается.
Проблема в том, что эти маршруты все хоть и VPN. Вместо этого я хотел бы, чтобы мой сервер использовал openvpn для всего трафика, кроме портов 80 и 22 (входящего и исходящего). то есть я хотел бы иметь возможность подключиться к моему серверу с помощью http и ssh.
Я считаю, что задавались аналогичные вопросы, но, похоже, все они маршрутизируют определенные порты через VPN и все остальное, а не через vpn. Я не смог приспособить их для своих целей.
РЕДАКТИРОВАТЬ:
Мой маршрутизатор - 192.168.1.1 (маршрутизатор dd-wrt). Я предполагаю, что трафик ssh / http должен быть помечен и настроен на использование 192.168.1.1 в качестве шлюза по умолчанию. Однако я не знаю, как это сделать.
РЕДАКТИРОВАТЬ 2:
Следуя совету лейкозов, я попробовал следующее:
root@FILESERVER:~# curl ipecho.net/plain; echo
###.###.135.118
root@FILESERVER:~# echo "Connecting to OpenVPN in other terminal"
Connecting to OpenVPN in other terminal
root@FILESERVER:~# curl ipecho.net/plain; echo
###.###.164.93
root@FILESERVER:~# echo "1 NOVPN" >> /etc/iproute2/rt_tables
root@FILESERVER:~# ip route add default via 192.168.1.1 dev p4p1 table NOVPN
root@FILESERVER:~# ip route show table NOVPN
default via 192.168.1.1 dev p4p1
root@FILESERVER:~# ip rule add from all fwmark 0x1 lookup NOVPN
root@FILESERVER:~# iptables -t mangle -I PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
root@FILESERVER:~# iptables -t mangle -I PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
root@FILESERVER:~# curl ipecho.net/plain; echo
###.###.164.93
Теперь я не именно уверен, как работает ipecho.net, но я предполагаю, что он получил что-то от ###. ###. 164.93, что (я полагаю) означает, что трафик порта 80 был не маршрутизируется через p4p1 (мой собственный интерфейс), но вместо этого маршрутизируется через tun0 (настройка OpenVPN). При попытке подключиться из-за пределов моей сети также продолжалось время ожидания.
«Нормальные» решения по маршрутизации основываются на префиксах и масках адресата и таблицы маршрутизации. Если вы хотите принимать решения о маршрутизации на основе других данных (например, портов TCP), вы должны использовать ip rule
.
С участием ip rule
, вы можете попросить ядро использовать альтернативную таблицу маршрутизации при возникновении некоторого условия. Обычно для этого в iptables используется маркировка пакетов.
Вот пример, непроверенный, вы можете попробовать это (не играйте с этим, если у вас есть только удаленное соединение с вашим сервером!).
# Create an alternate routing table
echo "1 NOVPN" >> /etc/iproute2/rt_tables
# Create the routes for this table
# Actually, you just want to set the default gateway
ip route add default via 192.168.1.1 dev eth0 table NOVPN
# Check results with
ip route show table NOVPN
# Now tell the kernel that this routing table should be used when
# a packet waiting to be routed has a specific "mark"
ip rule add from all fwmark 0x1 lookup NOVPN
# Then mark all the required packets with the same mark use above
iptables -t mangle -I OUTPUT -p tcp --sport 22 -j MARK --set-mark 1
iptables -t mangle -I OUTPUT -p tcp --sport 80 -j MARK --set-mark 1
Удачи.
РЕДАКТИРОВАТЬ:
Возможно, вам также потребуется изменить исходный адрес:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.10
Если не работает, проверьте, что происходит с:
tcpdump -enieth0 port 80
(В своих ответах я предполагаю, что правильный интерфейс Ethernet для исходящей связи - eth0)
Это заставляет весь трафик проходить через VPN.
/sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
/sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
Возможно, вы указали это в файле конфигурации? Согласно Документы OpenVPN соответствующая директива конфигурации redirect-gateway