Дозвіл SSH на сервері з активним клієнтом OpenVPN


15

У мене 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 є:

клієнт
dev tun
proto udp
віддалений nl.privateinternetaccess.com 1194
резоль-повтор нескінченний
неприв’язаний
персистент-ключ
персист
ca ca.crt
tls-клієнт
сервер віддаленого cert-tls
auth-user-pass
comp-lzo
дієслово 1
оновлення-сек 0
crl-перевірити crl.pem

IP-добавник VPS:

1: lo: mtu 65536 qdisc noqueue state UNKNOWN
    посилання / зворотний зв'язок 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    inet 127.0.0.1/8 область хосту lo
       valid_lft назавжди віддав перевагу_lft назавжди
    inet6 :: 1/128 хост діапазону
       valid_lft назавжди віддав перевагу_lft назавжди
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    посилання / ефір 00: 50: 56: бути: 16: f7 brd ff: ff: ff: ff: ff: ff
    inet 104.167.102.77/24 brd 104.167.102.255 сфера глобального забезпечення33
       valid_lft назавжди віддав перевагу_lft назавжди
    inet6 fe80 :: 250: 56ff: febe: 16f7 / 64 посилання на область застосування
       valid_lft назавжди віддав перевагу_lft назавжди
4: tun0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    посилання / немає
    inet 10.172.1.6 peer 10.172.1.5/32 сфера глобального tun0
       valid_lft назавжди віддав перевагу_lft назавжди

IP-маршрут VPS:

0,0.0,0/1 через 10,172,1,5 dev tun0
за замовчуванням через 104.167.102.1 dev ens33 протостатична метрика 1024
10.172.1.1 через 10.172.1.5 dev tun0
10.172.1.5 dev tun0 proto ядро ​​області зв’язку src 10.172.1.6
104.167.102.0/24 dev ens33 proto ядро ​​області зв’язку src 104.167.102.77
109.201.154.177 через 104.167.102.1 dev ens33
128.0.0.0/1 через 10.172.1.5 dev tun0

Відповіді:


16

У мене є проблема, схожа на цю, і я намагаюся виправити опис у цій публікації на форумі .

Ідея полягає в тому, що в даний час, коли ви підключаєтесь до своєї загальнодоступної IP-адреси, зворотні пакети передаються через VPN. Вам потрібно змусити ці пакети перенаправлятись через ваш загальнодоступний інтерфейс.

Ці команди маршруту, сподіваємось, виконають трюк:

ip правило додати з xxxx таблиці 128

ip route додати таблицю 128 до yyyy / y dev ethX

ip route додати таблицю 128 за замовчуванням через zzzz

Якщо xxxx - це ваш загальнодоступний IP, yyyy / y має бути підмережею вашої загальнодоступної IP-адреси, ethX має бути вашим загальнодоступним інтерфейсом Ethernet, а zzzz має бути шлюзом за замовчуванням.

Зауважте, що це не працює для мене (використовуючи Debian та PrivateInternetAccess), але може допомогти вам.


1
Замість того, щоб просто посилатися на рішення, вкажіть тут або принаймні узагальнюйте рішення. Таким чином, ваша публікація може бути корисною в майбутньому, якщо публікація, з якою ви пов’язані, піде.
Ендрю Шульман

Я запускав ці команди безрезультатно ... Як я потім перерахував цю таблицю (я не можу побачити нові правила, які я додав routeабо ip route show) та видалити її?
Хусейн Халіл

Я втратив ssh на своєму публічному ip, коли я встав на openvpn на своєму домашньому сервері. Запуск першої перерахованої вище команди дозволив мені отримати ssh доступ назад на сервер, коли він не знаходиться в домашній локальній мережі. Використання PIA + OpenVPN + ubuntu 16.04.
нудно кодування

Це насправді тільки маршрут SSH порт до мого публічного IP? Чи можете ви пояснити більше про те, що саме це робить? Я ніде не бачу, як ви встановлюєте конкретний порт чи протокол
Freedo

Він взагалі не спрямований на порти (128 - це номер таблиці, а не порт). В основному йдеться про те, що якщо пакети надходять через вашу загальнодоступну IP-адресу, тоді відповідь має бути надіслана через той самий інтерфейс (без використання VPN).
MrK

17

Це може бути трохи пізно, але ...

Проблема полягає в тому, що шлюз за замовчуванням змінюється 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 я щойно виявив, що мені потрібно додати "через" до запису таблиці маршрутизації:

# 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.


1
ДЯКУЮ! Я цілими днями шукав рішення цієї проблеми, і ваша відповідь вирішила це для мене. Це має бути прийнятою відповіддю.
Майк Турлі

Це рішення теж працювало для мене. Дуже дякую за те, що поділилися цим.
alecov

Чи можуть бути два маршрути в таблиці маршрутів з однаковим пунктом призначення ( ip route add default)? Я отримую "відповіді RTNETLINK: файл існує". Я запускаю Ubuntu Xenial. "через" не допомагає. Я просто спробував це в Arch Linux, спочатку, ip route add defaultздається, це вдалося, але ip routeвихід не змінюється. Будь-який наступний запуск призводить до повідомлення "файл існує".
x-yuri

Я бачу, маршрут додається до 3412 таблиці маршрутів. А щоб дістатися до нього , ви повинні: ip route show table all | grep 3412. І без "через" не встановлені (якщо я не помиляюся) з'єднання перестають працювати (Ubuntu Xenial). Принаймні я в змозі виправити таблицю маршрутизації. Але все-таки я не можу отримати доступ до сервера після запуску openvpn.
x-yuri

З мене чомусь не працювали, на відміну від цього , або цього , або цього . Які в основному однакові.
x-yuri

14

На основі відповіді @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, і він працює чудово.


Дуже дякую!
Jordi Goyanes

0

hmm звучить як перекриття підмережі 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 box збирається на nl. змінити маршрут за замовчуванням на 104.167.102.x або будь-який шлюз ур-підмережі у постачальника ur vps.


Яких результатів команд було б достатньо?
odie5533

1
вихід "ip addr" та "ip route" на ssh-клієнт, ssh-сервер / vpn-клієнт та nl-сервер vpn. переконайтеся, що vpn працює під час отримання виводу.
nandoP

Я хочу, щоб трафік за замовчуванням проходив через VPN; однак я хочу, щоб вхідний трафік 104.167.102.77:22 був дозволений, щоб я міг SSH на VPS.
odie5533

Ви перевіряєте це за допомогою tcpdump, але це звучить як після підключення, і маршрут за замовчуванням стає тунельним, новий ssh ​​трафік, вхідний з інших місць Інтернету, дозволений, але він не повертається, оскільки маршрут за замовчуванням надсилає ssh відповідь через тунель, замість того, щоб повернутися до вас. Ви можете виправити це за допомогою "ip route add [your-ip-addr] / 32 через [ваш шлюз vps]". щоб знайти свій vps шлюз, просто відключіться від тунелю і подивіться маршрут за замовчуванням
nandoP

0

Коли ви піднімаєте 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>є довільними ідентифікаторами на ваш власний вибір.


0

Для мене із запуском сервера OpenVPN в pfSense було зняти прапорець "Змусити весь генерований клієнтом IPv4 трафік через тунель".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.