บริบท
ฉันใช้คอนเทนเนอร์ Docker ที่ดีมากจาก Kyle Manna ( https://github.com/kylemanna/docker-openvpn ) ฉันใช้เอกสารที่เรียกว่า "หวาดระแวง" เพื่อตั้งค่าเซิร์ฟเวอร์ OpenVPN ของฉัน แต่ในมุมมองของฉันนี่ควรเป็นวิธีมาตรฐานไม่ใช่วิธีหวาดระแวง
องค์ประกอบ
ในการอนุญาตการเชื่อมต่อแบบสองทิศทางระหว่างคอนเทนเนอร์ Docker ที่เลือกและไคลเอนต์ VPN คุณต้องสร้างเครือข่าย Docker ที่คุณจะแนบคอนเทนเนอร์ซึ่งควรได้รับอนุญาตให้เข้าถึงโดยไคลเอนต์ VPN เซิร์ฟเวอร์ VPN จะเป็นหนึ่งในคอนเทนเนอร์เหล่านั้น
เซิร์ฟเวอร์ VPN ควรมีclient-to-client
, topology subnet
, dev tun0
(หรืออุปกรณ์ถังอื่น ๆ ) และpush "route <docker net IP> <docker net mask>"
การกำหนดค่า
โฮสต์ของเซิร์ฟเวอร์ VPN ควรได้รับการกำหนดค่าให้รองรับการส่งต่อแพ็กเก็ต IP จากเครือข่ายย่อยหนึ่งไปยังอีกเครือข่ายหนึ่ง ซึ่งหมายความว่าการตั้งค่า sysctl ip_forward เป็น 1 (ควรเป็นกรณีนี้หากคุณมีตัวติดตั้ง Docker) อนุญาตให้แพ็กเก็ตจากอุปกรณ์รับสัญญาณผ่านเครือข่าย iptables FORWARD และตั้งค่าการจัดเส้นทางที่เหมาะสม สามารถสรุปได้ด้วยคำสั่งเหล่านี้:
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via <IP address of OpenVPN server container>
อย่างไรก็ตามนี่คือตัวเลือกที่ฉันใช้ในการตั้งค่าเซิร์ฟเวอร์:
$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://<FQDN> -N -d -c -p "route <docker net IP> <docker net range>" -e "topology subnet"
สิ่งนี้ควรสร้างไฟล์กำหนดค่าเซิร์ฟเวอร์ที่คล้ายกับ:
server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/vpn.example.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/vpn.example.com.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun
proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log
user nobody
group nogroup
client-to-client
### Push Configurations Below
push "dhcp-option DNS 8.8.8.8"
push "route 172.20.20.0 255.255.255.0"
### Extra Configurations Below
topology subnet
ตัวอย่างคอนกรีต
ตอนนี้ฉันจะยกตัวอย่างที่เป็นรูปธรรม ในตัวอย่างนี้ฉันจะเรียกใช้เซิร์ฟเวอร์ OpenVPN ข้างต้นภายใน Docker บนโฮสต์ vpn.example.com คอนเทนเนอร์นี้เชื่อมต่อกับเครือข่าย Docker docker-net-vpn นี่คือคำสั่ง (ในตัวอย่างนี้ฉันสร้างการกำหนดค่าเซิร์ฟเวอร์โดยตรงบนเซิร์ฟเวอร์และฉันข้ามการสร้าง CA โปรดปฏิบัติตามเอกสารหวาดระแวงของโครงการที่กล่าวถึงข้างต้นแทน):
$ docker network create --attachable=true --driver=bridge --subnet=172.20.20.0/24 --gateway=172.20.20.1 docker-net-vpn
$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://vpn.example.com -N -d -c -p "route 172.20.20.0 255.255.255.0" -e "topology subnet"
$ docker run --detach --name openvpn -v $PWD/files/openvpn:/etc/openvpn --net=docker-net-vpn --ip=172.20.20.2 -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via 172.20.20.2
คำสั่งแรกสร้างเครือข่ายนักเทียบท่าใหม่โดยเฉพาะซึ่งกำหนดซับเน็ตใหม่ เราจะแนบเซิร์ฟเวอร์ OpenVPN กับเครือข่ายนี้
อันที่สองสร้างการกำหนดค่า OpenVPN โดยใช้ซับเน็ตเดียวกันตามที่กำหนดไว้ในคำสั่งที่ 1
อันที่สามสร้างเซิร์ฟเวอร์ OpenVPN มันเชื่อมต่อกับเครือข่าย Docker ที่สร้างขึ้นใหม่และใช้ fix IP
คำสั่งที่สี่และห้ากำหนดค่าการส่งต่อ IP
คำสั่งสุดท้ายเพิ่มเส้นทางใหม่ไปสู่การกำหนดค่าไคลเอนต์ VPN ผ่าน IP คงที่ของ OpenVPN คอนเทนเนอร์
บันทึก
ฉันไม่ได้ลอง แต่น่าจะเป็นไปได้ที่จะ จำกัด กฎ FORWARD สำหรับ iptables การสร้างเครือข่ายนักเทียบท่าสร้างอุปกรณ์บริดจ์ใหม่ บริดจ์นี้มีชื่อว่าbr-<ID>
ID ซึ่งเป็นอักขระ 12 ตัวแรกของ ID เครือข่าย Docker docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
รหัสนี้สามารถรับกับ ดังนั้นคำสั่งต่อไปนี้อาจจะเข้มงวดมากขึ้น (เพื่อความปลอดภัยที่ดีกว่า) แต่ก็ควรอนุญาตให้ทราฟฟิกของเราส่ง
$ NET_VPN_BRIDGE="br-$(docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12)"
$ sudo iptables -A FORWARD -i tun+ -o ${NET_VPN_BRIDGE} -j ACCEPT
tap
นัทtun
ฉันได้ทำงานกับมันมานานกว่า 12 ชั่วโมงโดยที่ไม่ประสบความสำเร็จจนถึงตอนนี้