ฉันต้องการอนุญาตให้ผู้ใช้ OpenVPN เข้าถึงคอนเทนเนอร์ Docker ทั้งหมดที่เป็นส่วนหนึ่งของเครือข่ายโอเวอร์เลย์ราวกับว่าอยู่ใน LAN เดียวกัน ตัวอย่างที่ง่ายที่สุดคือ 3 คอนเทนเนอร์กระจายบน 2 โฮสต์ และโฮสต์เชื่อมต่อผ่านเครือข่ายโอเวอร์เลย์ และคอนเทนเนอร์ทั้ง 3 เป็นส่วนหนึ่งของเครือข่ายโอเวอร์เลย์นั้น
สำหรับสิ่งนั้น ฉันได้เตรียมคอนเทนเนอร์ OpenVPN หนึ่งคอนเทนเนอร์ (OpenVPN ในโหมดบริดจ์ด้วยอะแดปเตอร์ TAP) และในคอนเทนเนอร์นั้น ฉันสร้างบริดจ์ br0 และบริดจ์อินเทอร์เฟซ eth0 และ tap0 เป็น br0 จากนี้ฉันจะบอกว่าฉันเชื่อม TAP และไคลเอนต์ OpenVPN ทั้งหมดเข้ากับเครือข่ายโอเวอร์เลย์ (ฉันไม่แน่ใจว่าข้อความนี้ถูกต้องหรือไม่).
จนถึงตอนนี้ เมื่อผู้ใช้ OpenVPN ของฉันเชื่อมต่อกับ OpenVPN และพยายาม ping Dummy Container 1 (ซึ่งอยู่บนโฮสต์เดียวกันกับคอนเทนเนอร์ OpenVPN) ผู้ใช้สามารถ ping Dummy Container 1 ได้ (และแน่นอนว่าสามารถ ping คอนเทนเนอร์ OpenVPN ได้ อีกด้วย). จนถึงตอนนี้ดีมาก!
อย่างไรก็ตาม ผู้ใช้ไม่สามารถ ping Dummy Container 2 ซึ่งมีอยู่บน แตกต่าง โฮสต์ (แต่เป็นส่วนหนึ่งของการซ้อนทับเดียวกันกับคอนเทนเนอร์ OpenVPN ตามที่กล่าวไว้ข้างต้น)
กล่าวโดยย่อคือ ผู้ใช้ VPN ที่เชื่อมต่อกับคอนเทนเนอร์ OpenVPN (เชื่อมต่อกับเครือข่ายโอเวอร์เลย์ของ Docker) และพยายาม ping คอนเทนเนอร์อื่น ๆ จะสามารถ ping คอนเทนเนอร์บนโฮสต์เดียวกันเท่านั้น ไม่ใช่บนโฮสต์อื่น ราวกับว่าการบริดจ์จะทำงานบนโลคัลเท่านั้น บริดจ์และไม่ใช่กับเครือข่ายโอเวอร์เลย์
สิ่งสำคัญคือต้องบอกด้วยว่าจากภายในคอนเทนเนอร์ OpenVPN เอง ฉันสามารถ ping Dummy Container 2 ได้ (และแน่นอนว่า Dummy Container 1 ด้วย)
ตัวเลขนี้เชื่อมโยงเรื่องราวทั้งหมดที่ฉันบอกไว้ข้างต้น สังเกตลูกศรสีแดงที่แสดงถึงการเชื่อมต่อที่ฉันต้องการบรรลุ แต่ไม่สามารถใช้งานได้ในขณะนี้ (ผู้ใช้ VPN เชื่อมต่อกับโฮสต์ 1 ผ่าน OpenVPN จากนั้นลอง ping Dummy Container 2)
ข้อมูลทางเทคนิคโดยละเอียด
คอนเทนเนอร์ OpenVPN
/etc/openvpn # ไอพีแอดเดรส
1: จริง: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN กลุ่มเริ่มต้น qlen 1,000
ลิงค์ / ย้อนกลับ 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 ขอบเขตโฮสต์ lo
valid_lft ตลอดไป reserved_lft ตลอดไป
2: tap0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP กลุ่มเริ่มต้น qlen 1,000
ลิงค์/อีเธอร์ 06:9b:33:89:85:81 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP กลุ่มเริ่มต้น qlen 1000
ลิงค์/อีเธอร์ 02:42:0a:08:00:04 brd ff:ff:ff:ff:ff:ff
inet 10.8.0.4/24 ขอบเขต global br0
valid_lft ตลอดไป reserved_lft ตลอดไป
74: eth0@if75: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 สถานะเริ่มต้นของกลุ่ม UP
ลิงค์/อีเธอร์ 02:42:0a:08:00:04 brd ff:ff:ff:ff:ff:ff ลิงค์-netnsid 0
76: eth1@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue สถานะเริ่มต้นของกลุ่ม UP
ลิงค์/อีเธอร์ 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff ลิงค์-netnsid 1
inet 172.18.0.4/16 brd 172.18.255.255 ขอบเขต global eth1
valid_lft ตลอดไป reserved_lft ตลอดไป
/etc/openvpn # เส้นทาง ip
ค่าเริ่มต้นผ่าน 172.18.0.1 dev eth1
10.8.0.0/24 dev br0 ลิงก์ขอบเขตเคอร์เนลโปรโต src 10.8.0.4
172.18.0.0/16 dev eth1 ลิงก์ขอบเขตเคอร์เนลโปรโต src 172.18.0.4
การกำหนดค่าเซิร์ฟเวอร์ OpenVPN:
พอร์ต 1194
โปรโตคอล udp
ผู้พัฒนา tap0
แคลิฟอร์เนีย ca.crt
ใบรับรอง server.crt
คีย์ server.key # ไฟล์นี้ควรเก็บเป็นความลับ
dh dh.pem
ifconfig-pool-persist ipp.txt
ลูกค้าต่อลูกค้า
รักษาชีวิต 10 120
รหัส AES-256-GCM
บีบอัด lz4-v2
กด "บีบอัด lz4-v2"
คีย์คงอยู่
คงอยู่-tun
สถานะ /var/log/openvpn-status.log
กริยา 3
แจ้งออกอย่างชัดเจน 1
##### การรับรองความถูกต้อง #####
# ไม่จำเป็นต้องมีใบรับรองลูกค้า ลูกค้าจำเป็นต้องตรวจสอบโดยใช้ชื่อผู้ใช้/รหัสผ่านเท่านั้น
ตรวจสอบใบรับรองลูกค้าไม่มี
# ปิดใช้งานการเจรจาใหม่ของคีย์ ค่าเริ่มต้นคือหนึ่งชั่วโมง ซึ่งจะตัดการเชื่อมต่อผู้ใช้ทุกๆ ชั่วโมง และทำให้ผู้ใช้ปลายทางถูกท้าทายให้อนุญาตอีกครั้งโดยใช้ OTP ใหม่
reneg วินาที 0
# โหลดและใช้การกำหนดค่าปลั๊กอิน LDAP
ปลั๊กอิน /usr/lib/openvpn/plugins/openvpn-auth-ldap.so /etc/openvpn/auth-ldap.conf
# โหลดและใช้ปลั๊กอิน PAM-auth (สำหรับ 2FA เป็นหลัก)
ปลั๊กอิน /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so "openvpn เข้าสู่ระบบ รหัสผ่าน USERNAME PASSWORD PIN OTP"
Briding ทำได้ดังนี้:
openvpn --mktun --dev tap0
ip link ตั้ง tap0 promisc ขึ้น
ip link เพิ่มชื่อ br0 ชนิดบริดจ์
ลิงค์ ip ตั้งค่า dev br0 ขึ้น
ip link ตั้งค่า dev tap0 master br0
ip link ตั้ง dev eth0 master br0
ip addr ล้าง dev eth0
ip addr เพิ่ม 10.8.0.4/24 dev br0
OpenVPN เริ่มต้นโดยใช้คำสั่ง
VPN_SERVER_HOST_IP_ADDRESS=10.8.0.254
VPN_NETMASK=255.255.255.0
VPN_POOL_START_IP_ADDRESS=10.8.0.50
VPN_POOL_END_IP_ADDRESS=10.8.0.100
openvpn \
--config server.conf \
--สะพานเซิร์ฟเวอร์ $VPN_SERVER_HOST_IP_ADDRESS $VPN_NETMASK $VPN_POOL_START_IP_ADDRESS $VPN_POOL_END_IP_ADDRESS
My Dummy Container 2 (คล้ายกับ Dummy Container 1 แต่มี IP ต่างกัน):
/ # ไอพีแอดเดรส
1: จริง: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
ลิงค์ / ย้อนกลับ 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 ขอบเขตโฮสต์ lo
valid_lft ตลอดไป reserved_lft ตลอดไป
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue สถานะ UP
ลิงค์/อีเธอร์ 02:42:0a:08:00:05 brd ff:ff:ff:ff:ff:ff
inet 10.8.0.5/24 brd 10.8.0.255 ขอบเขต global eth0
valid_lft ตลอดไป reserved_lft ตลอดไป
37: eth1@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue สถานะ UP
ลิงค์/อีเธอร์ 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 ขอบเขต global eth1
valid_lft ตลอดไป reserved_lft ตลอดไป
/ # เส้นทางไอพี
ค่าเริ่มต้นผ่าน 172.18.0.1 dev eth1
10.8.0.0/24 dev eth0 ลิงค์ขอบเขต src 10.8.0.5
172.18.0.0/16 dev eth1 ลิงค์ขอบเขต src 172.18.0.3