ตามที่ปรากฎใน Linux คุณสามารถใช้ได้ ipset การจับคู่เพื่อเลือกตารางเส้นทาง ส่วนผสมพิเศษกำลังใช้กฎ netfilter ที่จะจับคู่แพ็กเก็ตขาออกและใช้ fwmark ให้กับพวกเขา ซึ่งสามารถใช้เพื่อเลือกตารางเส้นทางเฉพาะได้ ตารางเส้นทางเฉพาะนี้จะมีเพียงเส้นทางเริ่มต้นเดียวผ่าน VPN
ต่อไปนี้เป็นแนวคิดทั่วไปในสคริปต์ วิธีการตั้งค่า
# เครือข่ายย่อยเพื่อกำหนดเส้นทางผ่าน TUN
DSTNETS=.../...../..
# ไม่รวมปลายทางเหล่านี้จากการกำหนดเส้นทางผ่าน TUN
ยกเว้น=... ...
# อุปกรณ์ TUN ที่จะใช้สำหรับการเชื่อมต่อนี้และพารามิเตอร์ของอุปกรณ์เหล่านั้น โดยปกติแล้ว VPN daemon จะเป็นผู้จัดเตรียมให้
ทุนเดฟ=...
TUNADDR=.../..
ทูนเพียร์=...
# ชื่อสำหรับ ipset ที่ใช้จับคู่ปลายทาง ตามชื่อ TUN
IPSET=${TUNDEV}ipset
# เราต้องการ netfilter fwmark และตาราง iproute2 fwmarks และตารางเป็นค่า 32 บิต จำกัดเฉพาะช่วงจำนวนเต็มที่มีเครื่องหมาย เช่น [0, 2³¹-1] อาจใช้ fwmarks เป็นบิตมาสก์ที่ส่งสัญญาณแฟล็กหลายแฟล็ก ดังนั้นขึ้นอยู่กับความต้องการของเรา ไม่ว่าจะเป็นการตั้งค่าบิตเฉพาะเจาะจง (หรือน้อย) หรือ ค่าที่เฉพาะเจาะจงมากที่จะเปรียบเทียบความเท่าเทียมกัน
FWMARK=0x...
ตาราง=0x...
# สร้าง ipset และเติมด้วยช่วงที่อยู่ IP และซับเน็ตที่จับคู่และไม่เข้ากับ
ipset สร้างแฮช $IPSET:net
สำหรับ d ใน $DSTNETS ; ทำ ipset เพิ่ม $IPSET $d ; เสร็จแล้ว
สำหรับ x ใน $EXCLUDE ; ทำ ipset เพิ่ม $IPSET $x nomatch ; เสร็จแล้ว
# สร้างตารางกฎ iproute2 ใหม่ที่จะใช้สำหรับการค้นหาเส้นทางสำหรับแพ็กเก็ตทั้งหมดที่มีการตั้งค่าตัวเลือก fwmark ของเรา
กฎ ip เพิ่ม fwmark ตาราง $FWMARK $TABLE
# นี่คือจุดที่ความมหัศจรรย์เกิดขึ้น: สร้างกฎ netfilter ที่จะจับคู่แพ็กเก็ตที่มาจากโฮสต์นี้สำหรับปลายทางที่ตรงกับ ipset ที่เราเพิ่งสร้างและทำเครื่องหมายด้วย fwmark ที่เราเลือก เนื่องจากกฎที่เราเพิ่งสร้างขึ้นก่อนหน้านี้ แพ็กเก็ตเหล่านั้นจะถูกกำหนดเส้นทางโดยใช้ตารางเฉพาะนั้น แทนที่จะใช้ตารางส่วนกลาง
iptables -t mangle -A OUTPUT -m set --match-set $IPSET dst -j MARK --set-mark $FWMARK
# เพิ่มกฎ netfilter เพื่อเขียนทับที่อยู่ต้นทางสำหรับแพ็กเก็ตเหล่านี้เนื่องจากเครือข่ายปลายทางอาจปฏิเสธหากไม่ตรงกับช่วงที่อยู่ที่ใช้สำหรับ VPN
iptables -t nat -A POSTROUTING -m set --match-set $IPSET dst -j SNAT --to-source $INTERNAL_IP4_ADDRESS
# ตอนนี้เราสามารถตั้งค่าอุปกรณ์ TUN จริงได้แล้วพูดอย่างเคร่งครัดขั้นตอนเหล่านั้นสามารถทำได้มาก่อน แต่ในช่วงเวลาสั้น ๆ ระหว่างที่ TUN มาถึงและกำหนดกฎการกำหนดเส้นทาง บางแพ็กเก็ตอาจสิ้นสุดในบริเวณขอบรก
ip link ตั้งค่า dev $TUNDEV ขึ้น
ip addr เพิ่ม $TUNADDR เพียร์ $TUNPEER dev $TUNDEV
# ในที่สุดสร้างเส้นทางเริ่มต้นที่จะผ่าน TUN ในตารางเส้นทางเฉพาะของเรา ซึ่งเนื่องจากกฎ fwmark จะถูกโจมตีโดยแพ็กเก็ตที่จับคู่กับ ipset ของเราเท่านั้น
เส้นทาง ip เพิ่ม dev เริ่มต้น $TUNDEV ตาราง $TABLE
หากต้องการฉีกทุกสิ่ง เพียงทำตามสคริปต์ในสิ่งที่ตรงกันข้าม ลบเนื้อหา; เดอะ ipset เป็นไปได้ ทำลาย
ed ด้วยคำสั่งเดียว