Маршрут засварлаж програмыг бүрэн туннельтай WireGuard хостээс чөлөөлж чадахгүй. Маршрут нь очих газраар зам сонгодог, харин таны чөлөөлөхийг хүсч буй зүйл бол процесс тул цөмд харьцуулах зүйл байхгүй. Ажиллах арга нь тэр процесст өөрийн сүлжээний контекст өгөх: өөрийн интерфейс, хаяг, өгөгдмөл маршрут бүхий нэрийн орон зайг veth хосоор хосттой холбох юм. Би үүнийг Ubuntu 24.04 дээр wireguard-tools 1.0.20210914-тэй ажиллуулсан бөгөөд нэрийн орон зай хэзээ ч асуудал болоогүй — хостны дамжуулалтын бодлого, туннелийн тэмдэглэгээний дүрэм л асуудал байсан.

Эхлээд хэрэгтэй контекстийн төрлөө сонгоно уу

Практикт хоёр хэлбэр гардаг. Хэрэв хост бүрэн туннель ажиллуулж, нэг програм ISP-ийн замаар гарах ёстой бол та хоёр дахь нэрийн орон зайг барьж, хосттой холбож, хост түүний өмнөөс урсгалыг дамжуулж, хөрвүүлэхэд хүргэнэ. Хэрэв нэрийн орон зай аль хэдийн VPN интерфейс зөөж байгаа бөгөөд танд зөвхөн дотор нь эхлүүлэх команд хэрэгтэй бол энэ нь энгийн ip netns exec тохиолдол бөгөөд маршрутжуулалтын ихэнх ажил аль хэдийн дууссан.

Аль ч хэлбэр нэг процессын ID-д хязгаарлагдсан дүрэм өгөхгүй. Netfilter хаяг, порт, тэмдэг, интерфейсийг тааруулдаг; процесс бүрийн маршрутжуулалтын хүснэгт байхгүй. Тэмдэглэгээ урсгалыг чиглүүлж болох ч тэмдгийг таны аль хэдийн тодорхойлсон пакетуудад тавих ёстой бөгөөд энэ нь нэг давхаргын доорх мөн адил асуудал юм. Нэрийн орон зай тэр процессын модны бүх стекийг тусгаарладаг тул энэ нь ердийн хариулт юм.

Хэрэв шаардлага үнэхээр туннелиас юу ч гарахгүй байх бол, оронд нь туннелийг зогсоо. Нэрийн орон зай холимог тохиолдолд зориулагдсан: нэг програм гадагш, бусад бүхэн дотогш, нэг машин дээр, нэгэн зэрэг.

Хоёр дахь контекстийг барьж, хосттой холбоно уу

Жишээ зохион байгуулалт: хостод өгөгдмөл маршрутыг зөөж буй WireGuard интерфейс болон clearnet нэртэй сүлжээний нэрийн орон зай байгаа бөгөөд veth хосоор хосттой холбогдсон. Доорх хаягууд нь жишээ юм.

ip netns add clearnet
ip link add veth-clear-out type veth peer name veth-clear-in
ip addr add 192.168.100.1/24 dev veth-clear-out
ip link set veth-clear-out up
ip link set veth-clear-in netns clearnet
ip netns exec clearnet ip addr add 192.168.100.2/24 dev veth-clear-in
ip netns exec clearnet ip link set veth-clear-in up
ip netns exec clearnet ip route add default via 192.168.100.1

Энэ нэрийн орон зай одоо хостод хүрч, өөр юунд ч хүрэхгүй. Хост урсгалыг дамжуулж, эх хаягийг дахин бичих ёстой, учир нь 192.168.100.0/24 нь хувийн бөгөөд дээд маршрутлагч түүн рүү буцах маршрутгүй:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o <wan-interface> -j MASQUERADE

Цааш явахаас өмнө нэрийн орон зайн талыг баталгаажуулна уу.ip netns exec clearnet ip route veth маршрут болон 192.168.100.1-ээр дамжих өгөгдмөл маршрутыг харуулах ёстой бөгөөд тэр хаяг руу ping хариу өгөх ёстой. Хэрэв хостны хаяг руу ping бүтэлгүйтвэл хаяг эсвэл холбоосын төлөв буруу бөгөөд ямар ч firewall дүрэм тус болохгүй.

Нэрүүд шийдэгдэж байгаа ч юу ч буцаж ирэхгүй бол FORWARD-ыг уншина уу

Сонгодог алдаа нь маршрутжуулалтын алдаа мэт харагдана: нэрийн орон зай нэрийг шийдэж, пакет гарч, хариу хэзээ ч ирэхгүй. FORWARD бодлого DROP байдаг хостод — хэд хэдэн түгээлт, хатууруулсан образын ихэнх нь тэгдэг — пакет замд хаягдаж, програмын хэвлэсэн алдаа шүүлтийн талаар юу ч хэлэхгүй.

Ямар нэгэн зүйл нэмэхийн өмнө гинжийг уншина уу:

iptables -S FORWARD
nft list chain inet filter forward

Дараа нь урсгалыг хоёр чиглэлд, тоолууртайгаар нэвтрүүлээрэй, дүрэм хэзээ нэгэнт таарсан эсэхийг мэдэхийн тулд:

iptables -A FORWARD -i veth-clear-out -o <wan-interface> -j ACCEPT
iptables -A FORWARD -i <wan-interface> -o veth-clear-out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
watch -n1 'iptables -L FORWARD -v -n'

Тэг пакет тоолууртай дүрэм замд байхгүй. Нэг бол интерфейсийн нэрс таны таамаглалаас өөр, эсвэл гинжин дэх өмнөх дүрэм пакетыг эхлээд хүлээн авсан, хаясан, эсвэл буцаасан. Дарааллыг зас, дүрмийн текстийг биш.

Хариу урсгал бол хүмүүсийн мартдаг тал юм. Буцаах дүрэмд ижил veth нэр болон холболтын төлөвийн таарлыг хэрэгтэй, эсвэл бодлогыг нээлттэй байлгаж байгаа бол энгийн интерфейсийн зөвшөөрөл. Зөвхөн гарах дүрмийг нэмбэл анхны шинж тэмдэг буцаж ирнэ, харин таны шинэ дүрэм тэнд зөв харагдана.

Туннелийн тэмдэглэгээний дүрмийг шинэ замаас хол байлга

Энэ алхам ажиллаж буй нэрийн орон зайг гоожсон орон зай болгоно. WireGuard тохиргоо нь ихэвчлэн firewall тэмдгийн бодлогыг өөрийн маршрутжуулалтын дүрэм, тусгай хүснэгтийн хамт суулгадаг тул тэмдэггүй пакетууд үндсэн хүснэгт рүү буцаж унадаг бол тэмдэгтэй пакетууд туннелийн хүснэгтийг ашигладаг. Нэрийн орон зайнаас дамжуулсан урсгал гарахдаа бодлогын маршрутжуулалтаар үнэлэгдэж, эдгээр дүрмийг хэрхэн бичсэнээс хамаарч туннелийн хүснэгтэд орж болно.

Хоёр нэмэлт замыг тусгаарлана. Нэрийн орон зайн дэд сүлжээний хувьд mangle гинжид эрт буцаж, тэр дэд сүлжээг үндсэн хүснэгтэд оруулах эх сурвалжид суурилсан дүрэм нэмнэ үү:

iptables -t mangle -I PREROUTING -s 192.168.100.0/24 -j RETURN
ip rule add from 192.168.100.0/24 lookup main priority 100

100 давуу эрх миний хостод туннелийн дүрмээс өмнө эрэмбэлэгддэг тул тэр эх сурвалжийн хувьд энгийн хүснэгт шийднэ. Тоог сохроор хуулж болохгүй:wg-quick суулгадаг давуу эрхүүд хувилбар болон IPv4, IPv6 тохиргоонуудын хооронд ялгаатай тул ажиллуулна уу ip rule show мөн өөрийн машин дээр туннелийн дүрмээс өмнө орох давуу эрхийг сонго.

Дүрмийн жагсаалтад итгэхийн оронд эх сурвалжид тусгай хайлт ашиглан шалгана уу:

ip route get 1.1.1.1 from 192.168.100.2
ip netns exec clearnet ip route get 1.1.1.1

Хэрэв эхний команд WireGuard интерфейсийг мэдээлбэл, шинэ дүрэм одоо ч туннелийн бодлогын өмнө биш байна. Хэрэв тэр WAN интерфейсийг мэдээлж, хоёр дахь нь одоо ч veth өгөгдмөл маршрутыг харуулж байвал хост болон нэрийн орон зай санал нийлэхгүй тул хоёр маршрутжуулалтын хүснэгтийг дахин уншина уу.

Холболтыг нээж буй процессыг эхлүүлнэ үү

Командыг эхлүүлэх нь нэг мөр боловч сокетыг үнэхээр үүсгэдэг процессыг эхлүүлнэ үү.ip netns exec clearnet curl -s https://ifconfig.me бол хамгийн бага шударга шалгалт: нэрийн орон зайн дэлхийд үзүүлж буй хаягийг харуулдаг, хостны ашиглах хаягийг биш.

Үйлчилгээний хувьд нэрийн орон зайг замаар холбож, процесс бүх насаараа дотор нь үлдэх болно:

[Service]
NetworkNamespacePath=/run/netns/clearnet

График програмууд бол нэг мөрийн арга чимээгүй бүтэлгүйтдэг газар. Цэснээс эхлүүлсэн хөтөч хүсэлтийг ихэвчлэн нэрийн орон зайн гадна аль хэдийн ажиллаж буй хувилбарт дамжуулдаг тул шинэ цонх гарч ирэх боловч урсгал одоо ч туннелиар гарна. Түүнд тусдаа профайл өгч үнэхээр шинэ хувилбар үүсгэ, дараа нь таамаглахын оронд процессын контекстийг шалга:

readlink /proc/$(pgrep -f clearnet-profile | head -1)/ns/net
readlink /run/netns/clearnet

Хоёр гаралт тохирох ёстой. Ижил шалгалт ямар ч удаан ажилладаг програмд тохирно, эхлүүлэгч таны санааг хэрэгжүүлсэн гэж таамаглахын оронд програмын тус бүрд нэг удаа хийх нь зүйтэй.

Нэрийн шийдэлд өөрийн шийдвэр хэрэгтэй. Нэрийн орон зай үүсгэх нь түүнд resolver-ийн тохиргоо өгөхгүй; нэрийн орон зай тус бүрийн файлууд дараах замаар дэмжигддэг /etc/netns/<name>/resolv.conf түүнгүйгээр та буруу уншихад хялбар зан үйлийг өвлөнө. IPv6-д ижил хандлага хэрэгтэй: хэрэв нэрийн орон зайд v6 өгөгдмөл маршрут байхгүй бөгөөд программ v6-г илүүд үзвэл хүсэлтүүд буцахаасаа өмнө гацаж болох бөгөөд энэ нь эвдэрсэн туннель мэт харагдана.

Хүрээг шалга, зөвхөн гарах хаягийг биш

Ажиллаж буй нийтийн хаяг зам баталдаг, бүх шаардлагыг биш. Үлдсэнийг энэ дарааллаар яв:

  • ip netns exec clearnet ip route get 1.1.1.1 veth өгөгдмөл маршрутыг харуулдаг, WireGuard интерфейсийг биш.
  • Хүсэлт явах үед хоёр дүрмийн FORWARD тоолуур өснө.
  • Програмын процесс таны хүлээж буй нэрийн орон зайн inode-г мэдээлнэ.
  • Дахин ачаалсны дараа нэрийн орон зай үйлчилгээ эхлэхээс өмнө байна; эрт ажилладаг unit бүтэлгүйтнэ, эсвэл бүр дор, нэрийн орон зайн гадна ажиллана.

Дараа нь туннель унах үед юу болох ёстойг шийд. Нэрийн орон зай үргэлжлүүлэн ажиллана, энэ нь дасгалын зорилго бөгөөд нэгэн адил эрсдэл: чөлөөлсөн програм холбогдсон хэвээр үлдэж, бусад бүхэн зогсоно. Үүнийг бодлогын сонголт хэмээн тэмдэглэж, чөлөөлөлт юуг хамарч чадахгүйг тодорхой хэл — бүртгэлийн таних тэмдэг, хадгалсан хөтчийн төлөв, таны DNS нийлүүлэгч бүгд сүлжээний нэрийн орон зайн хүрээнээс гадуур байдаг бөгөөд чөлөөлөлтийг нэргүй гэж үзэх нь тохиргооноос илүү удаан амьдардаг алдаа юм.

Холбоотой нийтлэлүүд