1

У меня есть устройство Ubuntu с включенным OpenVPN и подключенное к локальной сети за маршрутизатором TP-Link. Вот что известно:

  • Находясь внутри локальной сети, я могу подключиться к устройству напрямую через SSH (VPN запущена или остановлена).
  • Когда вне локальной сети и OpenVPN остановлен, я могу подключиться к устройству через переадресацию портов (порт WAN 22106).
  • Когда за пределами локальной сети запущен OpenVPN, я больше не могу подключиться к устройству через SSH через реальный IP-адрес.
  • В iptables -L нет ничего особенного, только шум UFW

Любые идеи, как SSH в устройство через реальный IP-провайдер, а не VPN-IP, когда VPN-соединение установлено?

Решение:

Вот одно полное решение, которое сработало. Создайте виртуальный адаптер, назначьте ему неиспользуемый соседний IP-адрес и добавьте правило и таблицу поиска, чтобы использовать тот же интерфейс для исходящих пакетов. Кроме того, перенаправьте порт WAN на порт устройства 22 с этим новым статическим IP-адресом.

ip addr add 192.168.0.6 dev eth0:0
ip rule add from 192.168.0.6 table 1234
ip route add default via 192.168.0.1 dev eth0:0 table 1234

Предыдущие попытки:

Вот все мои неудачные попытки от различных решений вокруг Stack Exchange.


cat /etc/iproute2/rt_tables
echo 200 isp2 >> /etc/iproute2/rt_tables


## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
ip rule add from 192.168.0.106 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2


## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
ip rule add from 192.168.0.106 table isp2 priority 900
ip rule add from dev eth0 table isp2 priority 1000
ip route add default via 192.168.0.1 dev eth0 table isp2
ip rule add iif eth0 table isp2 priority 1000


## FAILED - No effect
iptables -A PREROUTING -t mangle -p tcp --dport 222 -j MARK --set-mark 1
ip rule add fwmark 1 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2


## FAILED - No effect
iptables -t mangle -A OUTPUT -p tcp --dport 222 -o eth0 -j MARK --set-mark 1
ip rule add fwmark 1 table isp2
ip route add 0.0.0.0/0 table isp2 dev eth0 


## FAILED - No effect
ip rule add from 192.168.0.106 table isp2
ip route add table isp2 to 192.168.0.106/32 dev eth0
ip route add table isp2 default via 192.168.0.1


## FAILED - No effect
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default dev eth0 table 3412
ip rule add fwmark 4321 table 3412


## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default via 192.168.0.1 dev eth0 table 3412
ip rule add fwmark 4321 table 3412


## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default via 192.168.0.1 dev eth0 table isp2
ip rule add fwmark 4321 table isp2

Обновление: больше неудачных попыток

## FAILED
iptables -t mangle -A OUTPUT -p tcp --dport 22106 -o eth0 -j MARK --set-mark 1 && \
iptables -t mangle -A OUTPUT -p tcp --dport 222 -o eth0 -j MARK --set-mark 1 && \
iptables -t mangle -A OUTPUT -p tcp --dport 22 -o eth0 -j MARK --set-mark 1 && \
ip rule add fwmark 1 table isp2 && \
ip route add default via 192.168.0.1 dev eth0 table isp2

Обновление: Добавлен вывод обмена tcpdump между sshd (192.168.0.106:22) и машиной локальной сети (192.168.0.114). Пакеты ACK отправляются обратно по eth0, но не достигают машины .114. На данный момент я могу ssh извне локальной сети, но внутри локальной сети не удается. Добавлены только следующие правила ip:

# WAN SSH okay, LAN SSH fails
ip rule add from 192.168.0.106 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2

ТСРйитр


Сервер WAN (статический IP) <-> Маршрутизатор <-> (192.168.0.106)

Попытка переадресации маршрутизатора:

22106/TCP --> 192.168.0.106:22 (same result as above)
22106/TCP --> 192.168.0.106:22106 (same result as above)

ip a адрес устройства при запуске OpenVPN:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:1e:06:36:2b:05 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.106/24 brd 192.168.0.255 scope global dynamic noprefixroute eth0
       valid_lft 3068726852sec preferred_lft 3068726852sec
    inet6 fe80::a15b:2d6f:2dc9:8892/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none
    inet 10.7.0.10 peer 10.7.0.9/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::7d84:a8cc:f96e:6f11/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

Устройство /etc/ssh/sshd_config (все остальное по умолчанию и закомментировано):

Port 22
Port 22106
ListenAddress 192.168.0.106:22
ListenAddress 0.0.0.0:22106
AllowAgentForwarding yes
AllowTcpForwarding all
GatewayPorts yes
X11Forwarding yes
PermitTunnel yes
DisableForwarding no

Устройство netstat -tlpn:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      455/systemd-resolve
tcp        0      0 0.0.0.0:22106           0.0.0.0:*               LISTEN      9312/sshd
tcp        0      0 192.168.0.106:22        0.0.0.0:*               LISTEN      9312/sshd

Состояние устройства ufw status:

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22106/tcp                  ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
22106/tcp (v6)             ALLOW       Anywhere (v6)

2 ответа2

1

Этого следовало ожидать. Когда openvpn запущен, он устанавливает маршрут по умолчанию через vpn, поэтому исходящие пакеты будут проходить через него и, вероятно, будут отброшены из-за выходной фильтрации, выполняемой большинством провайдеров.

Существует множество решений / обходных путей, ни одно из которых не является одновременно простым и надежным.

  1. SSH к IP-адресу OpenVPN, при условии, конечно, что это реальный IP или сопоставленный порт.

  2. Используйте маршрутизацию на основе политик на сервере ssh для маршрутизации трафика ssh через интерфейс Ethernet

2а. Используйте определенный (то есть к внешнему клиентскому IP) маршрут из интерфейса маршрутизатора - более конкретные маршруты. Примите приоритет, чтобы это могло сработать, но тогда трафик на этот IP не пойдет. Vua VPN.

  1. добавьте VPN-сервер к маршрутизатору и подключите клиент к VPN перед использованием SSH. Обязательно рекламируйте диапазон ЛВС через VPN.

Обновить

Я подозреваю, что ваши вторые и третьи ошибочные правила были в большинстве случаев там, за исключением того, что они использовали порт 222, а не порт 22 или порт 22106, и неправильно использовали синтаксис. Я бы попробовал:

iptables -t mangle -A OUTPUT -p tcp --dport 222106 -o eth0 -j MARK --set-mark 1
ip rule add fwmark 1 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2
1

переформулировать ваш вопрос по-другому:

Я могу подключиться к своему серверу под управлением OpenVPN локально. Я могу подключиться к тому же серверу извне моей сети, потому что я настраиваю переадресацию портов. Однако любые попытки подключиться извне моей сети потерпят неудачу, если OpenVPN работает, потому что маршрут по умолчанию для нелокального трафика находится в туннеле, и нет сеанс, который возник локально, поэтому он отбрасывается. Я хотел бы подключиться к серверу из-за пределов моей сети, в то время как мой VPN работает.

Я бы предложил виртуальный интерфейс.

ifconfig eth0:0 192.168.0.107 (если этот ip свободен в вашей локальной сети)

раскрутит виртуальный подынтерфейс на eth0. добавьте правила переадресации портов, чтобы использовать этот IP и проверить. Теперь у вас должен быть глобальный IP-адрес управления независимо от состояния туннеля.

Не забудьте сохранить его с правильной конфигурацией интерфейса для вашего вкуса Linux.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .