กระบวนการ openvpn เดียวกันไม่สามารถฟังบนซ็อกเก็ต UDP และ TCP ในเวลาเดียวกัน
คุณมีสองตัวเลือกที่ดี:
ใช้สองอินเตอร์เฟสการแตะสำหรับ openvpn มีกระบวนการเซิร์ฟเวอร์ openvpn สองกระบวนการหนึ่งรายการสำหรับแต่ละอินเตอร์เฟสอินเตอร์เฟส หนึ่งควรฟังบน UDP อื่น ๆ บน TCP เชื่อมอินเตอร์เฟซการแตะทั้งสองนี้บนเซิร์ฟเวอร์
ใช้สองอินเตอร์เฟส tun สิ่งเหล่านี้ไม่สามารถเชื่อมโยงได้ดังนั้นหากคุณต้องการแชร์พื้นที่ IP ระหว่างไคลเอนต์ TCP และ UDP คุณจะต้องใช้learn-address
สคริปต์แบบที่http://thomas.gouverneur.name/2014/02/openvpn- Listen-on-tcp-and-udp-with-tun / (อย่างไรก็ตามสคริปต์เฉพาะนี้มีความเสี่ยงต่อการโจมตี / tmp symlink ดังนั้นให้ลบการบันทึกไปยัง / tmp หากคุณใช้)
ตัวเลือกที่สามคือเพียงเรียกใช้สองอินสแตนซ์ openvpn และกำหนดพื้นที่ IP ของไคลเอ็นต์แยกต่างหากให้กับทั้งสอง (ตัวอย่างเช่นหนึ่ง / 25 จากซับเน็ตเดียวกัน / 24 แต่ละรายการ) วิธีนี้จะช่วยหลีกเลี่ยงการเชื่อมโยงและความต้องการสคริปต์การเรียนรู้
แก้ไข: เนื่องจากฉันต้องการสคริปต์เรียนที่อยู่เช่นนั้นฉันจึงเขียน ฉันวางไว้ในโดเมนสาธารณะ
#!/bin/sh
#
# This script allows an openvpn server with several openvpn instances that
# use tun interfaces to share client IP space by adjusting the routing table
# to create entries towards specific clients as needed
action="$1"
addr="$2"
cn="$3" # not used, but it's there; you could e.g. log it
case "$action" in
add)
echo "sudo ip ro add $addr/32 dev $dev" >&2
exec sudo ip ro add $addr/32 dev $dev
;;
delete)
echo "sudo ip ro del $addr/32 dev $dev" >&2
sudo ip ro del $addr/32
exit 0 # ignore errors
;;
update)
echo "sudo ip ro change $addr/32 dev $dev" >&2
exec sudo ip ro change $addr/32 dev $dev
;;
esac
สคริปต์นี้บันทึกไปยัง stderr ซึ่งควรจบลงในบันทึก openvpn
tun
อินเตอร์เฟสไม่มีเลเยอร์ MAC และดังนั้นจึงไม่สามารถเป็นสมาชิกของบริดจ์ได้ หากคุณต้องการเชื่อมโยงคุณจะต้องใช้tap
ส่วนต่อประสาน