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

Две форми, едно место на средба

Во првата форма клиентот отвора SSH сесија нанадвор и бара од серверот да слуша на избрана порта, враќајќи ја секоја врска назад низ таа сесија. На серверот ништо не се проследува и не се случува превод на пакети, па единствените барања се SSH сметка, дозволено проследување и правило на огнениот ѕид за портата. Услугата останува врзана за loopback на клиентот, што обично е она што го сакате.

ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]

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

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

Услов прв: мора ли портата да живее подолго од сесијата

Обратното проследување живее точно колку SSH сесијата што го создала. Кога врската ќе падне, слушателот исчезнува и колегата гледа одбиена врска наместо бавен пат. Надзорот над командата со systemd единица и политика за рестартирање го решава тоа, а ExitOnForwardFailure=yes го прави неуспешното врзување веднаш видливо наместо да остави сесија без проследување.

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

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

Услов втор: чиј е огнениот ѕид и чии се логовите

Обратната форма ја држи целата политика на две места. sshd преку AllowTcpForwarding одлучува дали воопшто се дозволени далечински проследувања, а GatewayPorts одлучува дали слушателот се врзува за loopback или за секоја адреса. Со стандардната вредност no колега надвор од серверот не може да ја достигне портата иако проследувањето успеало, и тоа изгледа како расипан тунел кога всушност е адреса на врзување.

sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config

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

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8081 -j DNAT --to-destination 10.88.0.6:8080
sudo iptables -t nat -A POSTROUTING -o tun0 -m conntrack --ctstate DNAT -j SNAT --to-source 10.88.0.1

Тоа препишување исто така го уништува припишувањето. Потоа клиентот го гледа секој повикувач како адреса на тунелот на серверот, што ги спојува сите ограничувања на брзина по адреса во една кофа и го крие тоа кој што пратил. Ако припишувањето е важно, завршете ја врската на серверот или задржете ја одлуката за дозвола таму и предадете идентитет во заглавие на кое услугата му верува. Изборот меѓу овие две поправки зависи од тоа дали услугата воопшто чита прокси заглавие.

Услов трет: една порта или многу, и чие е името

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

Имињата го усложнуваат дополнително. Обратното проследување може да стои зад TCP прокси што рутира според SNI, додека преведената порта обично е една порта по услуга. Ако услугата сама го завршува TLS и и треба оригиналното име на домаќинот, пристапот со прокси го зачувува тоа, а пристапот со DNAT го зачувува само ако услугата го прифаќа тоа име на таа порта.

Запишете кој од трите услови ја одредил формата. Инаку следниот човек што ќе додаде втора услуга повторно ќе ја отвори истата споредба со помалку контекст.

Одлучете, потоа тестирајте однадвор

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

sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20

Бројачи што остануваат рамни значат дека пакетот никогаш не стигнал до правилото, што укажува на провајдерот или огнениот ѕид на домаќинот. Бројачи што се движат додека услугата одбива укажуваат на сопствениот огнен ѕид на клиентот или на адресата на која услугата слуша. Тунел што го носи пакетот но не враќа ништо е проблем со рута или со повратна патека, и ниту еден од овие три исходи не треба да се отстранува со уредување на адаптерот на клиентот. Запишете кој бројач се помести пред да промените нешто, бидејќи следниот тест ја бара таа основна линија.

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

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