Укључивање 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 везу; то је прави тест, јер стара сесија може преживети на стању које нова веза не може да репродукује. Ако друга блокира док прва још одговара, правило никада није погодило саобраћај који је важан, а ознаке или изворна адреса су место где треба гледати.

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

Повезани чланци