Апликација у VPN именском простору није доступна са LAN-а
Мрежни именски простор даје једном програму сопствени тунел и сопствени loopback. Објавите само његов порт кроз socat скок или veth пар, уместо кроз домаћин.
Ваша услуга ради на машини, тунел је подигнут, а ипак прегледач на вашем столу још увек чека одговор. Ништа није покварено у уобичајеном смислу: апликација слуша унутар мрежног именског простора, и тај стек је невидљив за LAN. Његов loopback припада именском простору, зато клијент на другој машини нема адресу која стиже до порта. Један намерни скок или један veth пар то поправља без премештања остатка домаћина.
Зашто ништа не одговара на LAN адреси
Именски простор је потпун мрежни стек: интерфејси, руте, правила заштитног зида и приватни loopback. Процес покренут кроз ip netns exec види само тај стек и ништа друго, зато се адреса на коју се везује решава само унутар именског простора. Сопствени 127.0.0.1 домаћина је сасвим други loopback.
Зато curl на домаћину не успева, док иста наредба унутар именског простора успева. Апликација је здрава; адреса једноставно не постоји у стеку домаћина.
Објавите један порт socat скоком
socat премошћује два стека у корисничком простору, што је довољно када треба да прође један TCP порт. Страна домаћина слуша на LAN-у и за сваку прихваћену везу покреће други socat унутар именског простора који се повезује са loopback-ом апликације. Унутрашњи процес достиже апликацију тачно као што би то урадио локални клијент. Ништа у рутирању именског простора се не мења, зато апликација наставља да користи тунел као једини излаз.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
Спољном процесу је потребан root или могућност уласка у именски простор. Ако VPN падне, апликација губи пут, а објављени порт не успева затворен, и то је понашање које очекујете од затвора.
Користите veth пар када пролази више од једног порта
veth пар је прави одговор када треба да прође неколико портова или протокола, или када други домаћини треба да покрећу везе. Један крај остаје у домаћину, други се премешта у именски простор, а мала /30 даје обе стране стабилну адресу. Затим рута домаћина шаље адресу именског простора преко пара.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up
Не додајте подразумевану руту кроз домаћина осим ако не намеравате да разбијете затвор. Тунел треба да остане излаз, зато је преко пара доступна само објављена адреса услуге. Дајте именском простору и сопствену resolver датотеку, јер ip netns exec чита /etc/netns/vpn/resolv.conf и без ње је решавање имена унутар затвора празно.
Тестирајте са друге машине, не са домаћина
Покрените тест са друге машине, јер домаћин може да стигне до локалног слушаоца путевима који ништа не говоре о LAN-у. Прво проверите на шта се апликација стварно везала унутар именског простора, затим се споља повежите на објављену адресу. Везивање на све адресе тамо не шири затвор, јер wildcard и даље припада именском простору и LAN не може да га види.
ip netns exec vpn ss -lntp
Ако веза са домаћина ради, а са LAN-а не, део који недостаје је скок или рута, а не адреса везивања. Покрените OpenVPN унутар именског простора уместо да тамо премештате живу tun направу, јер премештање интерфејса је искључује и може да избрише руте које потом не можете да поправите споља. Држите команде за опоравак на конзоли, а не унутар затвора.