ฉันใช้คำตอบที่มีให้โดย @ user48116 และใช้งานได้อย่างมีเสน่ห์ การตั้งค่าเป็นเรื่องง่ายมาก!
หมายเหตุ : ฉันใช้สิ่งนี้ด้วยการเชื่อมต่อสองจุดไปยังเซิร์ฟเวอร์เดียวเพียงเครื่องเดียวเนื่องจากปัญหานี้ได้แก้ไขแล้วสำหรับฉัน หากคุณต้องการลองตั้งค่ากับเซิร์ฟเวอร์สองเครื่องวิธีที่ง่ายที่สุดน่าจะใช้การส่งต่อพอร์ตเพื่อส่งต่อพอร์ต UDP จากเซิร์ฟเวอร์ที่สองไปยังเซิร์ฟเวอร์แรกและใช้สูตรเดียวกันตามที่อธิบายไว้ที่นี่ ฉันยังไม่ได้ทดสอบตัวเอง
ขั้นแรกตรวจสอบให้แน่ใจว่าคุณมีเคอร์เนล 2.6 พร้อมการสนับสนุนการเชื่อมโยง (ค่าเริ่มต้นในการแจกแจงที่ทันสมัยทั้งหมด) และคุณติดตั้ง ifenslave
ถัดไปวางสิ่งนี้ลงใน /etc/rc.local ของคุณหรือที่อื่น ๆ ที่คุณต้องการ แต่ให้แน่ใจว่ามันทำงานก่อนที่จะเปิด openvpn (เพราะมันจะพยายามผูกมัดกับ bond0):
ลูกค้า:
modprobe bonding mode=broadcast
ifconfig bond0 10.10.0.2 netmask 255.255.255.0 up
คุณสามารถเพิ่มการกำหนดเส้นทางบางอย่างถ้าจำเป็นที่นี่ตรวจสอบให้แน่ใจว่าคุณได้กำหนดเส้นทางที่เหมาะสมทั้งหมดจากอีกด้านหนึ่งด้วย
route add -net 10.7.0.0/24 gw 10.10.0.1
เซิร์ฟเวอร์:
modprobe bonding mode=broadcast
ifconfig bond0 10.10.0.1 netmask 255.255.255.0 up
สร้างสคริปต์ /etc/openvpn/tap-up.sh (และอย่าลืมทำเครื่องหมายให้เรียกใช้ด้วย chmod a + x tap-up.sh):
#!/bin/sh
# called as: cmd tap_dev tap_mtu link_mtu ifconfig_local_ip ifconfig_netmask [ init | restart ]
ifenslave bond0 "$1"
ถัดไปเพิ่ม bridge0a.conf และ bridge0b.conf ให้กับ / etc / openvpn / พร้อมกับรหัสแชร์ ไฟล์จะเหมือนกันสำหรับ a และ b ยกเว้นสำหรับพอร์ตอื่น (ตัวอย่างเช่นใช้ 3002 สำหรับ b) แทนที่ 11.22.33.44 ด้วย IP สาธารณะของเซิร์ฟเวอร์ของคุณ
ลูกค้า:
remote 11.22.33.44
dev tap
port 3001
rport 3001
secret bridge.key
comp-lzo
verb 4
nobind
persist-tun
persist-key
script-security 2
up /etc/openvpn/tap-up.sh
เซิร์ฟเวอร์:
local 11.22.33.44
dev tap
port 3001
lport 3001
secret bridge.key
comp-lzo
verb 4
script-security 2
up /etc/openvpn/tap-up.sh
อย่าลืมแก้ไข / etc / defaults / openvpn เพื่อให้แน่ใจว่าการกำหนดค่า VPN ใหม่ของคุณเริ่มต้นแล้ว รีบูทเครื่องหรือโหลด rc.local และรีสตาร์ท openvpn ด้วยตนเอง
ตอนนี้คุณพร้อมที่จะทดสอบการตั้งค่าของคุณ:
# ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=50.4 ms
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=51.1 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=51.1 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=51.1 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=52.0 ms
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=52.2 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=53.0 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=53.1 ms (DUP!)
--- 10.10.0.1 ping statistics ---
2 packets transmitted, 2 received, +6 duplicates, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 50.428/51.786/53.160/0.955 ms
หากทุกอย่างเป็นไปด้วยดีและเส้นดีคุณจะเห็นสี่คำตอบสำหรับทุกแพ็คเกจ ICMP: แพคเกจของคุณจะถูกทำซ้ำที่ฝั่งท้องถิ่น สิ่งนี้จะไม่เป็นปัญหาสำหรับการเชื่อมต่อ TCP เนื่องจาก TCP จะเพิกเฉยต่อการทำซ้ำทั้งหมด
นี่เป็นปัญหาสำหรับแพ็คเก็ต UDP เนื่องจากมันขึ้นอยู่กับซอฟต์แวร์ในการจัดการรายการที่ซ้ำกัน ตัวอย่างเช่นแบบสอบถาม DNS จะให้การตอบกลับสี่ครั้งแทนที่จะเป็นสองคำตอบที่คาดไว้ (และใช้แบนด์วิดท์ปกติสี่เท่าสำหรับการตอบสนองแทนสองครั้ง):
# tcpdump -i bond0 -n port 53
listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:30:39.870740 IP 10.10.0.2.59330 > 10.7.0.1.53: 59577+ A? serverfault.com. (33)
13:30:40.174281 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)
13:30:40.174471 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)
13:30:40.186664 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)
13:30:40.187030 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)
โชคดี!