Cho phép các container Docker kết nối với các máy khách OpenVPN trên giao diện đường hầm máy chủ


11

Tôi có các thiết lập sau:

  • Một máy chủ CentOS chạy dịch vụ docker
  • Một mạng cầu nối được xác định bởi người dùng
  • 2 Docker container được kết nối với mạng cầu được xác định bởi người dùng đó
  • Cài đặt OpenVPN (hiện đang chạy trên máy chủ. Cũng có thể chạy trong bộ chứa docker)
  • Một số khách hàng được kết nối với OpenVPN

Làm cách nào tôi có thể cho phép các container docker trên mạng cầu docker giao tiếp với các máy khách openvpn trên mạng tun0?

Tôi muốn có thể có giao tiếp dựa trên tcp giữa docker1 (10.10.0.3) và các máy khách được kết nối với vpn (phạm vi 172.19.0.x) một cách minh bạch.

Tôi cần gì để thiết lập ở phía docker (mạng / iptables / ...) và trên máy chủ (iptables?)


1
Có thể muộn, nhưng trong trường hợp của bạn tôi tin rằng bạn cần tap, hạt tun, tôi đã làm việc trên 12 giờ mà không có thành công cho đến bây giờ.
Mohammed Noureldin

@MohammedNoureldin các bạn đã tìm ra giải pháp chưa? Tôi cũng đang xem xét bây giờ sẽ đi đến thiết bị. Điều đáng thất vọng là từ trong thùng chứa ovpn tôi có thể truy cập các máy khách vpn. Và từ các máy khách vpn tôi có thể truy cập các container khác trên cùng một mạng Docker. Nhưng việc chuyển tiếp giữa các dòng sản phẩm của eth0 và tun0 bên trong thùng chứa ovpn không hoạt động. Tôi đoán đó là do tính chất tun0 so với tap.
Huygens

@Huygens, vâng tôi đã giải quyết nó, xin vui lòng đặt một câu hỏi riêng và đưa ra một tài liệu tham khảo cho tôi và tôi sẽ làm hết sức mình để giúp bạn.
Mohammed Noureldin

1
Xin chào @MohammedNoureldin Tôi đã tìm thấy 2 hướng dẫn còn thiếu để nó hoạt động. Họ đã ở trong trang người đàn ông openvpn 👍. Tôi sẽ sớm trả lời câu hỏi này cho người khác.
Huygens

1
@Huygens, thật tốt khi biết, thực sự tôi chưa có thời gian để đăng câu trả lời, nhưng tôi quan tâm để xem những gì đã làm việc cho trường hợp của bạn.
Mohammed Noureldin

Câu trả lời:


7

Bối cảnh

Tôi đã sử dụng bộ chứa Docker rất tốt từ Kyle Manna ( https://github.com/kylemanna/docker-openvpn ). Tôi đang sử dụng tài liệu được gọi là "hoang tưởng" để thiết lập máy chủ OpenVPN của mình, nhưng theo quan điểm của tôi thì đây phải là cách tiêu chuẩn chứ không phải là cách hoang tưởng.

Cấu hình

Để cho phép kết nối hai chiều giữa các bộ chứa Docker đã chọn và các máy khách VPN, bạn cần tạo một mạng Docker mà bạn sẽ đính kèm bộ chứa mà các máy khách VPN được phép truy cập. Máy chủ VPN sẽ là một trong những container đó.

Các máy chủ VPN nên có client-to-client, topology subnet, dev tun0(hoặc thiết bị tun khác) và push "route <docker net IP> <docker net mask>"cấu hình.

Máy chủ của máy chủ VPN phải được cấu hình để hỗ trợ chuyển tiếp các gói IP từ mạng con này sang mạng con khác. Điều này có nghĩa là đặt sysctl ip_forward thành 1 (nên là trường hợp nếu bạn đã cài đặt Docker), cho phép các gói từ thiết bị điều chỉnh đi qua chuỗi FORWARD của iptables và thiết lập định tuyến thích hợp. Điều này có thể được tóm tắt với các lệnh sau:

$ 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>

Dù sao, đây là các tùy chọn tôi đã sử dụng để thiết lập máy chủ:

$ 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"

Điều này sẽ tạo ra một tệp cấu hình máy chủ tương tự như:

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

Ví dụ cụ thể

Bây giờ tôi sẽ lấy một ví dụ cụ thể. Trong ví dụ này, tôi sẽ chạy máy chủ OpenVPN được đề cập ở trên bên trong Docker trên máy chủ vpn.example.com. Container này được gắn vào docker mạng docker-net-vpn. Dưới đây là các lệnh (trong ví dụ này tôi tạo cấu hình máy chủ trực tiếp trên máy chủ và tôi bỏ qua việc tạo CA, vui lòng làm theo tài liệu hoang tưởng của dự án đề cập ở trên):

$ 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

Lệnh đầu tiên tạo ra một mạng Docker mới dành riêng xác định một mạng con mới. Chúng tôi sẽ đính kèm máy chủ OpenVPN vào mạng này.

Cái thứ hai tạo cấu hình OpenVPN bằng cách sử dụng cùng một mạng con như được định nghĩa trong lệnh thứ nhất.

Cái thứ ba tạo ra máy chủ OpenVPN. Nó được gắn vào mạng Docker mới được tạo và sử dụng IP sửa lỗi.

Các lệnh thứ tư và thứ năm cấu hình chuyển tiếp IP.

Lệnh cuối cùng thêm một tuyến mới hướng tới cấu hình máy khách VPN thông qua IP cố định vùng chứa OpenVPN.

Ghi chú

Tôi đã không thử nó, nhưng có thể hạn chế quy tắc FORWARD cho iptables. Việc tạo mạng Docker đã tạo ra một thiết bị cầu mới. Cây cầu này được đặt tên br-<ID>với ID là 12 ký tự đầu tiên của ID mạng Docker. ID này có thể được lấy với docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12. Do đó, lệnh sau có thể hạn chế hơn (vì vậy bảo mật tốt hơn) nhưng vẫn cho phép lưu lượng truy cập của chúng tôi được định tuyến:

$ 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

Xin chào, không thể làm việc này được, tôi có thể theo dõi 192.168.255.6 và tôi nhận được: 1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !Hnhưng tôi không thể ping hoặc tiếp cận các cổng mở.
GuySoft

Xin chào @GuySoft những gì traceroute đang báo cáo là bước cuối cùng của bạn (172.20.20.1) không thể đến máy chủ 192.168.255.6. Vì vậy, nó có nghĩa là bảng định tuyến của bạn có thể không chính xác. Chúng ta có thể trò chuyện để xem vấn đề ở đâu không?
Huygens

Nó bắt đầu hoạt động, tôi nghĩ điều đáng mừng là cả hai máy đều đã cài đặt docker và cả hai đều có mạng con 172.20.20.1, khiến mọi thứ xung đột, tôi cần tìm cách tạo docker không tạo mạng con có thể đụng độ trên máy khách .
GuySoft

Nếu bạn sử dụng Docker Compose, bạn có thể chỉ định dải địa chỉ IP mà mạng sẽ sử dụng. Xem tài liệu Soạn thảo. Cũng có thể làm điều đó từ dòng lệnh với docker network….
Huygens

Tôi nghĩ rằng tôi không nhận được phần kết nối đến máy chủ (cổng ip + cổng openvpn) đang được chuyển đến vùng chứa openvpn (172.20.20.2)
jtomasrl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.