Вклучувањето OpenVPN клиент со целосен тунел на машина до која пристапувате преку SSH може да ја прекине сесијата во секунда, а машината не прави ништо погрешно. Тунелот не менува како пакетите стигнуваат до серверот; го менува како излегуваат одговорите. Штом стандардната рута покаже кон tun0, одговор до вашиот SSH клиент влегува во мрежата на провајдерот, која нема рута назад до вашата адреса. Врската виси, следниот обид истекува, а демонот цело време слуша на порта 22.

Прочитајте ја табелата за рутирање пред да го прочитате дневникот на VPN. Дневникот ќе каже дека тунелот се крена, и тоа е точно. Прашањето е на кој интерфејс му се предава секој одговор, а тоа е пребарување за секој пакет во табела што тунелот штотуку ја препишал.

Зошто одговорот излегува низ погрешна врата

Влезните пакети се уште пристигнуваат на физичкиот интерфејс, бидејќи VPN клиентот не може да го смени тоа како интернетот стигнува до јавната адреса на вашиот сервер. Одговорите се одделна одлука: за секој пакет јадрото ја бара дестинацијата, и по --redirect-gateway стандардниот запис вели тунел. Излезот на провајдерот гледа дестинација што не ја опслужува и го фрла пакетот.

Сопствената заштита на OpenVPN покрива точно една дестинација. Прирачникот за 2.6 го опишува --redirect-gateway како низа: додава рута за домаќин за VPN peer преку портата што се користела пред тунелот, за да не може шифрираниот сообраќај да се врати во себе, и потоа ја заменува стандардната рута. Таа рута за домаќин е само за peer. Вашиот SSH клиент е само уште една интернет адреса и не добива никаков исклучок.

Една грешка со префикс вреди да се исклучи рано. ip route add -net 0.0.0.0 gw 10.8.0.1 dev tun0 без должина одговара на единствената адреса 0.0.0.0, не на интернетот; мора да биде 0.0.0.0/0. И ако преземањето на стандардната рута го крши сопствениот транспорт на тунелот, додајте ја крајната точка како рута за домаќин преку физичкиот интерфејс, користејќи ја вистинската адреса на провајдерот.

Прикачете ја адресата на вашиот SSH клиент за итна поправка

Најбрзата поправка е рута за домаќин за адресата на вашиот клиент преку портата што серверот ја користел пред да постои тунелот. Од ваша страна, најдете ја адресата што серверот ќе ја види, потоа прочитајте ја табелата на серверот за да ја знаете старата порта:

curl -s https://ifconfig.co
ip route

На серверот, додајте го исклучокот пред клиентот да стартува. Адресите овде се заменски места; формата е она што е важно:

sudo ip route add 80.128.240.55 via 192.168.178.1

Ова е поправката користена во пријавениот случај, и таа работи веднаш. Таа е и кревка на два предвидливи начина: рутата исчезнува при рестартирање, и станува погрешна во моментот кога вашиот ISP ќе ви даде друга адреса. Третирајте ја како итна мерка и намерно направете ја трајна, преку мрежна единица или hook на диспечерот, или прифатете дека е привремена и запишете ја патеката за враќање.

Спречете клиентот да ја преземе стандардната рута

Почистата опција е да го спречите тунелот воопшто да ја замени стандардната рута. route-nopull, користен со --client или --pull, ги прифаќа турканите опции освен рути, block-outside-dns и опции во стил на DHCP како DNS сервери, па додавате само префиксите што ви требаат. Потесен алат е филтер за влечење, кој отфрла една проблематична директива и ги задржува останатите:

route-nopull
pull-filter ignore "redirect-gateway"

Користете едното или другото, не двете, и бидете јасни што се менува. Без стандардна рута низ тунелот, серверот повеќе не го прелистува интернетот преку провајдерот; стигнува само до она што сте го рутирале експлицитно. Ако целосниот тунел беше целата цел на поставката, ова е погрешниот прекинувач и рутата за домаќин погоре е точната.

Поделете ја повратната патека по извор или по врска

Кога влезната адреса е стабилна, правилото за извор ги задржува одговорите локални без да ги допира сопствените рути на тунелот. Дајте ѝ на адресата на физичкиот интерфејс своја табела со префиксот LAN и физичкиот стандард, потоа изберете ја таа табела за сообраќајот што доаѓа од неа:

ip rule add from 192.168.1.11 table 128
ip route add table 128 to 192.168.1.0/24 dev eth0
ip route add table 128 default via 192.168.1.1

Ова работи затоа што одговорите на влезна SSH врска доаѓаат од адресата на која се поврзал клиентот. Пријавениот случај каде секоја влезна услуга мораше да продолжи да работи го користеше точно овој облик. Кога влезната адреса лебди или патеката е динамична, означете ја врската: ставете conntrack ознака на првиот пакет што доаѓа од физичкиот интерфејс, копирајте ја на пакетите за одговор во OUTPUT, и рутирајте ги означените пакети низ табела што покажува кон физичката порта.

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.1.1 dev eth0 table 3412
ip rule add fwmark 4321 table 3412

Чувајте ги ознаката за врска, ознаката за огнен ѕид и бројот на табелата одделни за време на тестирањето. Повторното користење на еден број за две улоги создава правило што изгледа точно и ги погодува погрешните пакети. Стандардниот запис на табелата исто така бара via со LAN портата на обична Ethernet врска; гол dev eth0 работи само кога интерфејсот е точка-точка или следниот скок се решава на друг начин. Пријавениот Jessie домаќин случајно се наоѓаше на врска каде голата форма работеше, што не е правило за дистрибуција што треба да се копира.

Проверете без да се заклучите надвор

Не тестирајте со исклучување. Држете ја првата сесија отворена, кренете го тунелот и прашајте го јадрото која патека би ја зела вашата сопствена адреса:

ip route get 80.128.240.55

Одговорот треба да ги именува физичкиот интерфејс и старата порта, не тунелот. Потоа отворете втора SSH врска; тоа е вистинскиот тест, бидејќи старата сесија може да преживее на состојба што нова врска не може да ја репродуцира. Ако втората виси додека првата се уште одговара, правилото никогаш не погодило сообраќај што е важен, а ознаките или изворната адреса се местото каде што треба да се гледа.

Држете конзола надвор од опсегот достапна за време на целата вежба. Сервер чиј единствен пат за пристап е тунелот што штотуку го скршивте не може да се поправи преку тој тунел, а враќањето е полесно кога сте ги запишале броевите на табелите и префиксите што сте ги додале.

Поврзани статии