Танд нугарахгүй шаардлага байна: эсрэг тал илгээгчийн гаргаж буй ижил 1,500 байтын IP пакетыг толгой хэсгийг оролцуулан хүлээн авах ёстой. Туннель тэр пакетыг өөрийн фреймтэй хамт хоёр дахь 1,500 байтын IP пакет дотор багтааж чадахгүй, тиймээс дизайны ямар нэг зүйл буух ёстой. Доорх дарааллыг би өөрчлөлтийн цонхонд ашигладаг: байтын төсвийг бичих, underlay юу үнэхээр зөөж чадахыг нотлох, дараа нь яг нэг тээвэрлэх механизм сонгож, эсрэг талд дотоод пакетыг баталгаажуулах.

Профайлыг засахын өмнө байтын төсвийг бич

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

Дизайныг хоёр тоо шийднэ: зам фрагментацигүйгээр зөөх хамгийн том гадаад пакет, таны инкапсуляцид хэрэгтэй нэмэлт байт. Эхнийх нь хоёр дахь дээр 1,500 нэмснээс бага байхад аль нэг нь өөрчлөгдөх ёстой. Тэгвэл сонголт бүтээлч биш, нарийн болдог тул би хувилбаруудыг хэлэлцэхийн өмнө хоёр тоог бичиж авдаг. Туннелийн түвшинд тэдгээр байтыг шахаж арилгах зүйл байхгүй бөгөөд ганц MTU бүхэл тоо ч танд өгсөн шаардлагыг арилгахгүй.

Underlay-г do-not-fragment ping-ээр шалга

Интерфейсийн MTU-д итгэхгүй замыг хэмж, учир нь гадаад замд хамгийн жижиг холбоос чухал. Linux дээр, -M do do-not-fragment битийг тогтоож, -s ICMP ачааллыг авдаг тул 20 байтын IP толгой, 8 байтын ICMP толгойг хасахад 1,500 байтын фрейм 1,472 байтын ачаалалд хариулна. Шалгалт бүтэлгүй болтол ачааллыг өсгө, дараа нь jumbo хэмжээ рүү үсэрч зам үүнийг огт зөөж байгаа эсэхийг хар.

ping -M do -s 1472 -c 2 198.51.100.10
ping -M do -s 8972 -c 2 198.51.100.10
tracepath -n 198.51.100.10

1,472-ыг давж 8,972-т бүтэлгүй болдог зам 1,500 байтын дотоод пакетыг нэмэлт зардалтай нь нэг гадаад пакетад зөөж чадахгүй. Энэ нь VPN тохиргоог нээхээс өмнө танд хэрэгтэй байсан хариулт юм. Энэ нь мөн дараагийн хоёр хэсгийн аль нь танд хамаарахыг шийддэг тул хоёр шалгалтын үр дүнг тасгийн хажууд байлга. Энд таамаглах нь нэг засвар үйлчилгээний цонхыг үрэгдүүлнэ, учир нь өөрийгөө up гэж мэдээлдэг туннель зам хүлээн авах хамгийн том пакетын талаар юу ч хэлэхгүй.

Замын MTU-г зөвхөн бүх хоп зөвшөөрсөн газар өсгө

Jumbo фрейм нь end-to-end шинж чанар, та санамсаргүй хянадаг хоёр төгсгөлийн цэг дээр асаах тохиргоо биш. Гадаад замын свич, роутер, үйлчилгээ үзүүлэгчийн дамжуулалт бүр том хэмжээг зөвшөөрөх ёстой бөгөөд ганц 1,500 байтын хоп дөнгөж томруулсан пакетыг чимээгүй хаяна. Зөвхөн локал интерфейсийг өсгөх нь туннелийг эвдэрсэн мэт харагдуулж, underlay чимээгүй унагадаг сонгодог хагас өөрчлөлт юм.

ip link set dev eth1 mtu 9000
ip link show dev eth1
ping -M do -s 8972 -c 2 198.51.100.10

Интерфейсийг соль, дараа нь өөр юу ч солихоос өмнө мөн тэр замыг дахин шалга. Шалгалт дахин бүтэлгүй болвол буцаа ip link set dev eth1 mtu 1500 мөн өөрийн мэдэлгүй холбоосын талаар үйлчилгээ үзүүлэгчтэй маргахын оронд фрагментацид шилж.

Underlay өсч чадахгүй үед туннелийн фрагментацийг ашигла

Дотоод пакетын доор дэмжигдсэн фрагментацийн механизм нь хэд хэдэн гадаад пакетад нэг дотоод пакетыг зөөх боломж олгодог бөгөөд эсрэг талын туннелийн төгсгөлийн цэг нь эх хувилбарыг стек рүү өгөхөөс өмнө тэдгээрийг дахин угсардаг. Community OpenVPN-ийн UDP fragment сонголт нь тэр санааны нэг хэрэгжилт бөгөөд гадаад пакетын энгийн IP фрагментацтай ижил зүйл биш. Хоёр peer хоёулаа энэ форматыг дэмждэг хувилбар ажиллуулах ёстой бөгөөд өгөгдлийн зам таны бодож байгаа зам байх ёстой: OpenVPN 3 клиентүүд болон цөмөөр хурдасгасан өгөгдлийн сувгууд өөр хязгаартай тул нэг клиент дээр ажилладаг профайл нөгөө дээр бүтэлгүй болж болно.

openvpn --config client.ovpn --tun-mtu 1500 --fragment 1400 --verb 4

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

Урсгалд суурилсан гадаад зөөгч өөрийн байтын урсгалыг хуваах замаар хэмжээний асуудлыг тойрч, дахин бүтээсэн дотоод пакет 1,500 байт хэвээр байж болно. Энэ нь өөрийн өртөгтэй тээврийн шийдвэр бөгөөд TCP доторх TCP-ийн сайн мэдэх зан төлөвийг оролцуулан, тиймээс MTU-ийн маргааны гаж нөлөө биш, санаатайгаар аваарай.

Дотоод пакет өөрчлөгдөөгүй ирснийг батал

Баталгаажуулалт нь амжилттай handshake биш. Хоёр төгсгөлд туннелийн интерфейс дээр баривчил мөн апп-ын үнэхээр илгээсэн пакетын хэмжээ, агуулгыг эсрэг тал хүлээн авсантай харьцуул.

ip link show dev tun0
ping -M do -s 1472 -c 2 10.8.0.1
tcpdump -ni tun0 -c 5 'icmp and greater 1000'

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

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

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