प्रसंग
मैं काइल मन्ना ( https://github.com/kylemanna/docker-openvpn ) से बहुत अच्छे डॉकटर कंटेनर का उपयोग कर रहा हूं । मैं अपने OpenVPN सर्वर को सेट करने के लिए तथाकथित "पैरानॉयड" प्रलेखन का उपयोग कर रहा हूं, लेकिन मेरे विचार में यह मानक तरीका होना चाहिए न कि पैरानॉयड तरीका।
विन्यास
चयनित डॉकटर कंटेनरों और वीपीएन ग्राहकों के बीच द्वि-दिशात्मक कनेक्शन की अनुमति देने के लिए, आपको एक डॉकर नेटवर्क बनाने की आवश्यकता है, जिस पर आप कंटेनर संलग्न करने जा रहे हैं, जिसे वीपीएन ग्राहकों द्वारा एक्सेस करने की अनुमति दी जानी चाहिए। वीपीएन सर्वर उन कंटेनरों में से एक होने जा रहा है।
VPN सर्वर होना चाहिए client-to-client
, topology subnet
, dev tun0
(या अन्य tun डिवाइस) और push "route <docker net IP> <docker net mask>"
कॉन्फ़िगर किया गया।
वीपीएन सर्वर के होस्ट को एक सबनेट से दूसरे में आईपी पैकेट को अग्रेषित करने के लिए कॉन्फ़िगर किया जाना चाहिए। इसका मतलब है कि sysctl ip_forward को 1 पर सेट करना (यह होना चाहिए अगर आपके पास डॉकर इंस्टॉल है), ट्यून डिवाइस से पैकेट को iptables फॉरवर्ड चेन से गुजरने और उचित रूटिंग सेट करने की अनुमति देता है। इसे इन आदेशों के साथ संक्षेप में प्रस्तुत किया जा सकता है:
$ 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
ठोस उदाहरण
मैं अब एक ठोस उदाहरण लूंगा। इस उदाहरण में, मैं होस्ट vpn.example.com पर डॉकर के अंदर उपर्युक्त ओपनवीपीएन सर्वर चलाऊंगा। यह कंटेनर डोकर नेटवर्क डोकर-नेट-वीपीएन से जुड़ा हुआ है। यहां कमांड हैं (इस उदाहरण में मैं सर्वर पर सीधे सर्वर कॉन्फ़िगरेशन उत्पन्न करता हूं और मैं सीए पीढ़ी को छोड़ देता हूं, कृपया इसके बजाय उपरोक्त उल्लेख परियोजना के पागल दस्तावेज़ का पालन करें):
$ 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 सर्वर बनाता है। यह नए बनाए गए डॉकर नेटवर्क से जुड़ा है और एक फिक्स आईपी का उपयोग करता है।
चौथा और पांचवां आदेश आईपी अग्रेषण को कॉन्फ़िगर करता है।
अंतिम कमांड ओपन वीपीएन कंटेनर फिक्स्ड आईपी के माध्यम से वीपीएन क्लाइंट कॉन्फ़िगरेशन की ओर एक नया मार्ग जोड़ता है।
ध्यान दें
मैंने इसकी कोशिश नहीं की है, लेकिन यह संभव है कि iptables के लिए FORWARD नियम को प्रतिबंधित किया जाए। डॉकर नेटवर्क निर्माण ने एक नया ब्रिज डिवाइस बनाया। इस पुल का नाम br-<ID>
ID के साथ Docker नेटवर्क ID के पहले 12 अक्षर हैं। इस आईडी से प्राप्त किया जा सकता है 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 घंटे से अधिक काम कर रहा हूं, जो अब तक सफल नहीं हुआ है।