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
tap
, hạttun
, tôi đã làm việc trên 12 giờ mà không có thành công cho đến bây giờ.