Заштитни зид на VPS-у: отворите само VPN порт, затим то докажите
Један порт мора да остане јаван, иначе се ниједан клијент не повезује. Одбијте остало, држите прослеђивање одвојено од улаза и оставите пут опоравка који сте унапред пробали.
Заштитни зид који пропушта само VPN порт није једно правило. То су три одвојене одлуке које се случајно тичу истог броја порта: ланац за улаз одлучује шта може да дође до локалног процеса, ланац за прослеђивање одлучује шта може да прође кроз домаћин у име клијената тунела, а NAT табела преписује адресу извора на излазу. Погрешите једну од њих и резултат ретко је чист прекид. Добићете домаћин који прихвата клијенте, али ништа не учитава, или домаћин који изгледа затворено док неко не прочита редослед ланаца.
Једини порт који се не може затворити
Слушалац VPN-а мора да прихвата везе са адреса које не можете да предвидите, па је по дефиницији јавна услуга. То је једини изузетак на коме је дизајн изграђен: један UDP порт за OpenVPN, један UDP порт за WireGuard, један TCP порт за SSL VPN. Све остало припада иза тунела, што значи да апликационе услуге треба да се вежу на адресу тунела или на loopback, а не на сва интерфејса.
Везивање, међутим, није спровођење. Процес везан на 0.0.0.0 доступан је само ако га правило пропушта, а подразумевана политика је резерва за саобраћај који није ухватило ниједно правило, а не правило које управља портом. Правило пропуштања изнад вашег одбијања и даље је пропуштање, а премештање услуге са јавне адресе је независно побољшање, а не замена за ланац.
Улаз, прослеђивање и NAT одговарају на различита питања
Улазни саобраћај је намењен самом домаћин, па ту живе слушалац VPN-а и административни пут. Саобраћај за прослеђивање пролази кроз домаћин и клијентима тунела потребан је он, плус net.ipv4.ip_forward=1. Класична напола исправна конфигурација пропушта одлазни ток и заборавља повратни смер, па клијент заврши руковање и затим се ништа не учитава; правило conntrack за успостављени и повезани саобраћај покрива тај смер.
NAT је треће питање. Без преписивања у postrouting, прослеђени пакети одлазе са приватним извором тунела и бивају одбачени даље узводно, јер ниједна мрежа изван домаћина не уме да усмери базен назад. Изворни префикс у том правилу мора да одговара базену VPN-а, а не сопственој адреси домаћина, и исто важи за правило прослеђивања које именује подмрежу клијената.
IPv6 је друга политика, а не накнадна мисао. Домаћин са строгим ланцем IPv4 и отвореном политиком на ip6tables није ништа затворио; услуге су и даље доступне преко друге фамилије. Или пресликајте скуп правила са ip6tables или намерно искључите IPv6 на јавном интерфејсу, и запишите шта сте изабрали.
Основа која се чита у једном пролазу
Почните од одбијања, затим додајте само оно што домаћин треба. Прво loopback и одговори, затим административни пут, затим слушалац тунела, затим политика прослеђивања за клијенте:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -m conntrack --ctstate NEW -j ACCEPT
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADEНазиви интерфејса, порт и базен су замене; прочитајте их са сервера уместо да их копирате. Чување резултата једнако је важно као и његово писање, јер скуп правила који живи само у меморији нестаје при следећем покретању и тихо поново отвара домаћин. Учините га трајним механизмом дистрибуције и држите копију изван машине за дан када се машина не буде подигла.
Затворити последњи порт без губитка домаћина
У дизајну постоји замка. Ако SSH постоји само кроз тунел, неуспела VPN услуга односи SSH са собом, а једини пут назад може бити конзола коју никада нисте отворили. Пре него што затворите последњи јавни порт, потврдите да та конзола постоји и да је заиста можете користити, или задржите један уски административни пут који не зависи од тунела: SSH са фиксне адресе, само кључеви, аутентификација лозинком искључена.
Примените промену из већ успостављене сесије, а не кроз везу коју ћете филтрирати. Закажите враћање како би грешка истекла уместо да постане трајна, на пример задатак systemd-run --on-active=10min који враћа претходни скуп правила, и држите другу SSH сесију отвореном док тестирате прву. Затим проверите да се задатак враћања заиста покреће, јер непроверени опоравак је исто што и никакав опоравак.
Проверите пут, не скрипту
Читајте учитана правила, а не датотеку која је требало да их учита. Са овлашћеног спољног домаћина потврдите да одговарају само предвиђени портови; из унутрашњости тунела потврдите да су услуге које сте хтели да објавите доступне. Политика одбијања по подразумеваном која блокира и саобраћај тунела изгледа исто као радно закључавање док је неко не покуша да користи.
iptables -S
iptables -t nat -S
ss -lntup
ip -4 addr showЗапишите дозвољени порт, базен клијената, интерфејс тунела, административни извор и поступак са конзолом поред конфигурације. Следећа промена базена или назива интерфејса мора да се усклади и у филтеру и у правилу NAT, иначе се домаћин враћа у напола отворено стање, а да то нико не примети.
Једна навика вреди више од скупа правила: после сваке промене докажите пут прослеђивања клијентским захтевом, а пут опоравка другом сесијом. Закључавање које нисте користили само је хипотеза.