อนุญาตให้คอนเทนเนอร์ Docker เชื่อมต่อกับไคลเอนต์ OpenVPN บนอินเตอร์เฟสช่องสัญญาณโฮสต์


12

ฉันมีการตั้งค่าต่อไปนี้:

  • โฮสต์ CentOS กำลังเรียกใช้บริการนักเทียบท่า
  • เครือข่ายบริดจ์นักเทียบท่าที่ผู้ใช้กำหนด
  • 2 คอนเทนเนอร์นักเทียบท่าที่เชื่อมต่อกับเครือข่ายบริดจ์ที่ผู้ใช้กำหนด
  • การติดตั้ง OpenVPN (กำลังทำงานบนโฮสต์ขณะนี้สามารถเรียกใช้ในคอนเทนเนอร์นักเทียบท่า)
  • ไคลเอ็นต์บางตัวเชื่อมต่อกับ OpenVPN

ฉันจะอนุญาตให้คอนเทนเนอร์นักเทียบท่าบนเครือข่ายสะพานนักเทียบท่าสื่อสารกับลูกค้า openvpn ในเครือข่าย tun0 ได้อย่างไร

ฉันต้องการให้สามารถสื่อสารด้วย tcp ระหว่าง docker1 (10.10.0.3) และไคลเอนต์ที่เชื่อมต่อกับ vpn (ช่วง 172.19.0.x) อย่างโปร่งใส

ฉันต้องตั้งค่าอะไรบนฝั่งนักเทียบท่า (ระบบเครือข่าย / iptables / ... ) และบนโฮสต์ (iptables?)


1
อาจจะสาย แต่ในกรณีของคุณฉันเชื่อว่าคุณต้องการtapนัทtunฉันได้ทำงานกับมันมานานกว่า 12 ชั่วโมงโดยที่ไม่ประสบความสำเร็จจนถึงตอนนี้
Mohammed Noureldin

@MohammedNoureldin พวกคุณค้นพบวิธีแก้ปัญหาแล้วหรือยัง? ฉันยังคิดว่าตอนนี้จะไปแตะอุปกรณ์ สิ่งที่น่าผิดหวังคือจากภายในคอนเทนเนอร์ ovpn ฉันสามารถเข้าถึงไคลเอนต์ vpn ได้ และจากไคลเอนต์ VPN ฉันสามารถเข้าถึงคอนเทนเนอร์อื่นบนเครือข่าย Docker เดียวกัน แต่การส่งต่อระหว่าง“ eth0” และ tun0 ภายในคอนเทนเนอร์ ovpn ไม่ทำงาน ฉันเดาว่าเป็นเพราะ tun0 nature เทียบกับแตะ
Huygens

@Huygens ใช่ฉันแก้ไขได้โปรดถามคำถามแยกต่างหากและให้การอ้างอิงกับฉันและฉันจะทำอย่างดีที่สุดเพื่อช่วยให้คุณ
Mohammed Noureldin

1
สวัสดี @MohammedNoureldin ฉันพบคำแนะนำที่หายไป 2 ข้อเพื่อให้ใช้งานได้ พวกเขาอยู่ในหน้าคน openvpn 👍 ฉันจะโพสต์คำตอบสำหรับคำถามนี้สำหรับคนอื่นในไม่ช้า
Huygens

1
@Huygens ดีที่จะรู้จริง ๆ แล้วฉันยังไม่ได้มีเวลาที่จะโพสต์คำตอบ แต่ฉันสนใจที่จะดูสิ่งที่เหมาะกับกรณีของคุณ
Mohammed Noureldin

คำตอบ:


7

บริบท

ฉันใช้คอนเทนเนอร์ 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

เฮ้ไม่สามารถทำงานนี้ได้ฉันสามารถติดตามไปที่ 192.168.255.6 และฉันได้: 1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !Hแต่ฉันไม่สามารถ ping หรือไปถึงพอร์ตที่เปิดอยู่
GuySoft

สวัสดี @GuySoft สิ่งที่ traceroute กำลังรายงานคือการกระโดดครั้งสุดท้ายของคุณ (172.20.20.1) ไม่สามารถเข้าถึงโฮสต์ 192.168.255.6 ดังนั้นหมายความว่าตารางเส้นทางของคุณอาจไม่ถูกต้อง เราสามารถแชทเพื่อดูว่ามีปัญหาอยู่ที่ไหน?
Huygens

มันเริ่มทำงานฉันคิดว่าสิ่งที่เกิดขึ้นคือทั้งสองเครื่องติดตั้งนักเทียบท่าและทั้งคู่มีซับเน็ต 172.20.20.1 ซึ่งทำให้สิ่งต่าง ๆ ขัดแย้งกันฉันต้องหาวิธีที่จะทำให้นักเทียบท่าไม่ได้สร้างซับเน็ตที่จะปะทะกับเครื่องไคลเอนต์ .
GuySoft

หากคุณใช้ Docker Compose คุณสามารถระบุช่วงที่อยู่ IP ที่เครือข่ายควรใช้ ดูเอกสารประกอบการเขียน docker network…นอกจากนี้ยังเป็นไปได้ที่จะทำมันได้จากบรรทัดคำสั่งด้วย
Huygens

ฉันคิดว่าฉันไม่ได้รับส่วนที่เชื่อมต่อกับโฮสต์ (โฮสต์ ip + พอร์ต openvpn) จะถูกส่งไปยังภาชนะ openvpn (172.20.20.2)
jtomasrl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.