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

Разрешение SSH на сервере с активным клиентом OpenVPN

У меня есть VPS под управлением CentOS 7, к которому я подключаюсь по SSH. Я хотел бы запустить клиент OpenVPN на VPS, чтобы интернет-трафик направлялся через VPN, но при этом позволял мне подключаться к серверу через SSH. Когда я запускаю OpenVPN, мой сеанс SSH отключается, и я больше не могу подключиться к своему VPS. Как я могу настроить VPS так, чтобы входящие соединения SSH (порт 22) открывались на фактическом IP-адресе VPS (104.167.102.77), но при этом исходящий трафик (например, из веб-браузера на VPS) по-прежнему маршрутизировался через VPN?

Я использую службу OpenVPN PrivateInternetAccess, а пример файла config.ovpn:

client
dev tun
proto udp
remote nl.privateinternetaccess.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-client
remote-cert-tls server
auth-user-pass
comp-lzo
verb 1
reneg-sec 0
crl-verify crl.pem

IP-адрес VPS:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
    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: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:be:16:f7 brd ff:ff:ff:ff:ff:ff
    inet 104.167.102.77/24 brd 104.167.102.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:febe:16f7/64 scope link
       valid_lft forever preferred_lft forever
4: tun0:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.172.1.6 peer 10.172.1.5/32 scope global tun0
       valid_lft forever preferred_lft forever

IP-маршрут VPS:

0.0.0.0/1 via 10.172.1.5 dev tun0
default via 104.167.102.1 dev ens33  proto static  metric 1024
10.172.1.1 via 10.172.1.5 dev tun0
10.172.1.5 dev tun0  proto kernel  scope link  src 10.172.1.6
104.167.102.0/24 dev ens33  proto kernel  scope link  src 104.167.102.77
109.201.154.177 via 104.167.102.1 dev ens33
128.0.0.0/1 via 10.172.1.5 dev tun0

Основываясь на ответе @MrK, я написал здесь простой код, чтобы ускорить выполнение работы, поэтому вам не нужно проверять интерфейсы / IP:

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128
ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

Я пробовал этот скрипт на 4 своих VPS, и он отлично работает.

Это может быть немного поздно, но ...

Проблема в том, что шлюз по умолчанию изменяется OpenVPN, и это разрывает ваше текущее соединение SSH, если вы не настроите соответствующие маршруты перед запуском OpenVPN.

Следующее работает для меня. Он использует iptables и ip (iproute2). Ниже предполагается, что интерфейс шлюза по умолчанию перед запуском OpenVPN - «eth0». Идея состоит в том, чтобы гарантировать, что при подключении к eth0, даже если eth0 больше не является интерфейсом шлюза по умолчанию, ответные пакеты для подключения снова вернутся на eth0.

Вы можете использовать один и тот же номер для метки подключения, метки межсетевого экрана и таблицы маршрутизации. Я использовал различные числа, чтобы сделать различия между ними более очевидными.

# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

ОБНОВИТЬ:

Вышеупомянутое отлично работает для меня в Debian Jessie. Но в более старой системе Wheezy я только что обнаружил, что мне нужно добавить «via» в запись таблицы маршрутизации:

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

Там «12.345.67.89» должен быть исходный шлюз, не относящийся к VPN.

У меня аналогичная проблема, и я пытаюсь исправить, описанное в это сообщение на форуме.

Идея состоит в том, что в настоящее время, когда вы подключаетесь к общедоступному IP-адресу, ответные пакеты маршрутизируются через VPN. Вам необходимо принудительно маршрутизировать эти пакеты через ваш общедоступный интерфейс.

Надеемся, что эти команды маршрута помогут:

ip правило добавить из таблицы x.x.x.x 128

ip route добавить таблицу 128 в гг.г.г / г dev ethX

ip route добавить таблицу 128 по умолчанию через z.z.z.z

Где x.x.x.x - ваш общедоступный IP-адрес, y.y.y.y / y должен быть подсетью вашего общедоступного IP-адреса, ethX - вашим общедоступным интерфейсом Ethernet, а z.z.z.z - шлюзом по умолчанию.

Обратите внимание, что у меня это не сработало (с использованием Debian и PrivateInternetAccess), но может вам помочь.

хм звучит как перекрытие подсети IP .... не зная больше о вашей схеме IP, кроме общедоступного IP для вашего терминала vpn как nl.privateinternetaccess.com, не могу сказать наверняка.

так, например, если удаленная подсеть на другой стороне nl.privateinternetaccess.com - 10.32.43.0/24, а ваш экземпляр находится в aws vpc с подсетью 10.32.44.0/24. но ваш исходный клиент ssh живет на 10.32.43.0/24 (ваша сторона aws vpc), он не будет работать, поскольку обратный трафик ssh будет ошибочно передан через vpn в Нидерланды.

предоставьте полную информацию об IP-адресе / подсети для получения дополнительной помощи.

...

Хорошо, итак ... похоже, что ваш маршрут по умолчанию находится в туннеле после подключения к nl:

0.0.0.0/1 через 10.172.1.5 dev tun0

так что вы можете изменить это после подключения. много раз серверы vpn предоставляют вам фиктивные маршруты. особенно при небрежном корпусе. в этом случае они проталкивают вам маршрут по умолчанию, поэтому весь трафик из vps-бокса идет на nl. измените маршрут по умолчанию на 104.167.102.x или любой другой шлюз подсети ur у провайдера ur vps.

Когда вы запускаете VPN, ваш шлюз по умолчанию заменяется. Это означает, что любой трафик, генерируемый или маршрутизируемый через ваш ящик, будет перенаправлен на шлюз VPN.

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

Мы сделаем это здесь. Сначала создайте новую таблицу маршрутизации и добавьте маршрут по умолчанию, который направляет все через ваш локальный шлюз:

# <table> is any number between 2 and 252.
# Check /etc/iproute2/rt_tables for more info.
ip route add default via <gateway> table <table>
ip route add <lan-addr> dev <device> table <table>

Затем создайте новое правило фильтрации пакетов, которое помечает весь трафик, выходящий из вашего ящика с заданного адреса источника, с некоторым идентификатором.

# <mark> is any number.
iptables -tmangle -AOUTPUT -s<local-addr> -jMARK --set-mark <mark>

Наконец, создайте политику маршрутизации, которая выбирает весь вышеупомянутый отмеченный трафик и направляет его, используя созданную выше таблицу.

ip rule add fwmark <mark> table <table>

Еще раз, значения <mark> и <table> произвольные идентификаторы по вашему выбору.

Для меня при запуске сервера OpenVPN в pfSense я должен был снять флажок с параметра «Принудительно пропускать весь генерируемый клиентом IPv4-трафик через туннель».

У меня была такая же проблема с экземпляром AWS (VPN-клиент), подключенным к локальному серверу OpenVPN, и я не могу получить к нему доступ, если я не подключен к тому же VPN-серверу или локальной сети. Решение просто добавляло маршрут от общедоступного IP-адреса локального компьютера к шлюзу экземпляра AWS.

ip route add xx.xxx.xx.xx via 172.xx.xx.1 dev eth0

и я могу повторить то же самое для любого внешнего пользователя, которому нужен доступ к экземпляру AWS, поскольку он нужен только для совместного использования с горсткой внешних пользователей.

Расширение на https://serverfault.com/a/660106/577384 и https://serverfault.com/a/793700/577384. Чтобы это работало должным образом с общедоступными службами докеров, мне также пришлось сделать ip -4 rule add to 172.0.0.0/8. Чтобы пакеты, идущие на localhost (службы докеров), не перенаправлялись через eth0. Убедитесь, что это правило превалирует над правилом «таблицы».

У меня также есть следующее правило перед остальными правилами iptable для устройств LAN в целом iptables -A PREROUTING -t mangle -s 192.168.0.0/16 -j ACCEPT -m comment --comment "Skip special route for LAN".

(Я настаиваю, что мне понадобится что-то подобное для IPv6, но у меня еще нет докера, работающего в IPv6)