Tôi muốn cho phép người dùng OpenVPN tiếp cận tất cả các bộ chứa Docker là một phần của mạng Lớp phủ như thể chúng ở trong cùng một mạng LAN. Ví dụ đơn giản nhất là 3 vùng chứa được phân phối trên 2 máy chủ và các máy chủ được kết nối thông qua mạng lớp phủ và cả 3 vùng chứa đều là một phần của mạng lớp phủ đó.
Để làm được điều đó, tôi đã chuẩn bị một bộ chứa OpenVPN (OpenVPN ở chế độ cầu nối với bộ điều hợp TAP) và trong bộ chứa đó, tôi đã tạo một cầu nối br0 và kết nối các giao diện eth0 và tap0 với br0. Bằng cách này, tôi muốn nói rằng tôi đã kết nối TAP của mình và tất cả các máy khách OpenVPN với mạng lớp phủ (tôi không chắc liệu tuyên bố này có đúng không).
Cho đến nay, khi người dùng OpenVPN của tôi kết nối với OpenVPN và cố gắng ping Dummy Container 1 (trên cùng một máy chủ với bộ chứa OpenVPN), người dùng có thể ping Dummy Container 1 (và tất nhiên có thể ping bộ chứa OpenVPN Mà còn). Càng xa càng tốt!
Tuy nhiên, người dùng không thể ping Dummy Container 2, tồn tại trên một khác biệt máy chủ lưu trữ (nhưng là một phần của cùng lớp phủ với bộ chứa OpenVPN như đã đề cập ở trên).
Vì vậy, tóm lại, người dùng VPN được kết nối với bộ chứa OpenVPN (được kết nối với mạng lớp phủ Docker) và cố gắng ping các bộ chứa khác chỉ có thể ping các bộ chứa trên cùng một máy chủ, không phải trên máy chủ khác, như thể bắc cầu chỉ hoạt động trên cục bộ cầu chứ không phải với mạng Lớp phủ.
Cũng cần phải nói rằng từ bên trong bộ chứa OpenVPN, tôi có thể ping Bộ chứa giả 2 (và tất nhiên cả Bộ chứa giả 1).
Con số này samarize toàn bộ câu chuyện tôi đã kể ở trên. Lưu ý mũi tên màu đỏ biểu thị kết nối mà tôi muốn đạt được nhưng hiện tại không hoạt động (Người dùng VPN kết nối với Máy chủ 1 qua OpenVPN sau đó thử ping Dummy Container 2).
Một số thông tin kỹ thuật chi tiết
Bộ chứa OpenVPN
/etc/openvpn # địa chỉ ip
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 trạng thái qdisc noqueue nhóm UNKNOWN mặc định qlen 1000
liên kết/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
máy chủ phạm vi inet 127.0.0.1/8 lo
hợp lệ_lft mãi mãi ưa thích_lft mãi mãi
2: tap0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 trạng thái UP nhóm mặc định qlen 1000
liên kết/ether 06:9b:33:89:85:81 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 trạng thái qdisc noqueue UP nhóm mặc định qlen 1000
liên kết/ether 02:42:0a:08:00:04 brd ff:ff:ff:ff:ff:ff
inet 10.8.0.4/24 phạm vi toàn cầu br0
hợp lệ_lft mãi mãi ưa thích_lft mãi mãi
74: eth0@if75: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 trạng thái Nhóm LÊN mặc định
liên kết/ether 02:42:0a:08:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
76: eth1@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 trạng thái qdisc noqueue Nhóm LÊN mặc định
liên kết/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 172.18.0.4/16 brd 172.18.255.255 phạm vi toàn cầu eth1
hợp lệ_lft mãi mãi ưa thích_lft mãi mãi
/etc/openvpn # tuyến ip
mặc định qua 172.18.0.1 dev eth1
10.8.0.0/24 dev br0 liên kết phạm vi kernel proto src 10.8.0.4
172.18.0.0/16 dev eth1 liên kết phạm vi kernel proto src 172.18.0.4
Cấu hình máy chủ OpenVPN:
cổng 1194
proto udp
nhà phát triển tap0
ca ca.crt
máy chủ chứng chỉ.crt
key server.key # Tệp này phải được giữ bí mật
dh dh.pem
ifconfig-pool-persist ipp.txt
khách hàng đến khách hàng
lưu giữ 10 120
mật mã AES-256-GCM
nén lz4-v2
đẩy "nén lz4-v2"
phím kiên trì
kiên trì điều chỉnh
trạng thái /var/log/openvpn-status.log
động từ 3
rõ ràng-thoát-thông báo 1
##### Xác thực #####
# Chứng chỉ ứng dụng khách không bắt buộc. Khách hàng chỉ cần xác thực bằng tên người dùng/mật khẩu.
verify-client-cert không có
# Vô hiệu hóa đàm phán lại khóa. Giá trị mặc định là một giờ, ngắt kết nối người dùng mỗi giờ và khiến người dùng cuối bị thách thức ủy quyền lại bằng OTP mới.
reneg-giây 0
# Tải và sử dụng cấu hình plugin LDAP.
plugin /usr/lib/openvpn/plugins/openvpn-auth-ldap.so /etc/openvpn/auth-ldap.conf
# Tải và sử dụng plugin PAM-auth (chủ yếu cho 2FA).
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so "đăng nhập openvpn TÊN NGƯỜI DÙNG mật khẩu Mã pin MẬT KHẨU OTP"
Kết nối được thực hiện như thế này:
openvpn --mktun --dev tap0
ip link set tap0 promisc on up
liên kết ip thêm tên br0 loại cầu
thiết lập liên kết ip dev br0 lên
bộ liên kết ip dev tap0 master br0
bộ liên kết ip dev eth0 master br0
ip addr flush dev eth0
địa chỉ ip thêm 10.8.0.4/24 dev br0
OpenVPN được bắt đầu bằng lệnh
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 \
--cầu nối máy chủ $VPN_SERVER_HOST_IP_ADDRESS $VPN_NETMASK $VPN_POOL_START_IP_ADDRESS $VPN_POOL_END_IP_ADDRESS
My Dummy Container 2 (rất giống với Dummy Container 1 nhưng khác IP):
/ # địa chỉ ip
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
liên kết/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
máy chủ phạm vi inet 127.0.0.1/8 lo
hợp lệ_lft mãi mãi ưa thích_lft mãi mãi
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc trạng thái mới hàng đợi LÊN
liên kết/ether 02:42:0a:08:00:05 brd ff:ff:ff:ff:ff:ff
inet 10.8.0.5/24 brd 10.8.0.255 phạm vi toàn cầu eth0
hợp lệ_lft mãi mãi ưa thích_lft mãi mãi
37: eth1@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc trạng thái mới hàng đợi LÊN
liên kết/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 phạm vi toàn cầu eth1
hợp lệ_lft mãi mãi ưa thích_lft mãi mãi
/ # ip lộ trình
mặc định qua 172.18.0.1 dev eth1
10.8.0.0/24 liên kết phạm vi dev eth0 src 10.8.0.5
172.18.0.0/16 liên kết phạm vi dev eth1 src 172.18.0.3