-
todo
+
Σκοπός του ζητούμενου είναι η δημιουργία Virtual Private Network καθώς και η σύνδεση των μελών του Σμήνους σε αυτό.
+
+
+
+
+
+
+ |
+
+Τα πρώτα βήματα για την υλοποίηση του VPN εκτελούνται στο σύστημα που φιλοξενεί το docker και όχι μέσα στο Σμήνος.
+ |
+
+
+
+
+
Αρχικά τροποποιούμε το αρχείο extra_lines κατάλληλα.
+
+
+
+
client
+nobind
+dev tun
+comp-lzo
+resolv-retry infinite
+keepalive 15 60
+
+remote-cert-tls server
+remote 192.168.1.169 1194 udp <-- Αλλάζουμε την IP σε αυτήν του κανονικού μας συστήματος.
+float
+
+
+
+
Στην συνέχεια εκτελούμε από το δικό μας σύστημα το script initiate-vpn.sh το οποίο έχει συνταχθεί σύμφωνα με τις οδηγίες του εργαστηρίου
+
+
+
initiate-vpn.sh
+
+
#!/bin/bash
+IP=127.0.0.1 # Server IP
+P=1194 # Server Port
+OVPN_SERVER='10.80.0.0/16' # VPN Network
+
+#vpn_data=/var/lib/swarmlab/openvpn/openvpn-services/ # Dir to save data ** this must exist **
+vpn_data=$PWD/openvpn-services/
+if [ ! -d $vpn_data ]; then
+ mkdir -p $vpn_data
+fi
+
+NAME=swarmlab-vpn-services # name of docker service
+DOCKERnetwork=swarmlab-vpn-services-network # docker network
+docker=registry.vlabs.uniwa.gr:5080/myownvpn # docker image
+
+docker stop $NAME #stop container
+sleep 1
+docker container rm $NAME #rm container
+
+# rm config files
+rm -f $vpn_data/openvpn.conf.*.bak
+rm -f $vpn_data/openvpn.conf
+rm -f $vpn_data/ovpn_env.sh.*.bak
+rm -f $vpn_data/ovpn_env.sh
+
+# create network
+sleep 1
+docker network create --attachable=true --driver=bridge --subnet=172.50.0.0/16 --gateway=172.50.0.1 $DOCKERnetwork
+
+#run container see ovpn_genconfig
+docker run --net=none -it -v $vpn_data:/etc/openvpn -p 1194:1194 --rm $docker ovpn_genconfig -u udp://$IP:1194 \
+-N -d -c -p "route 172.50.20.0 255.255.255.0" -e "topology subnet" -s $OVPN_SERVER
+
+# create pki see ovpn_initpki
+docker run --net=none -v $vpn_data:/etc/openvpn --rm -it $docker ovpn_initpki
+
+# see ovpn_copy_server_files
+#docker run --net=none -v $vpn_data:/etc/openvpn --rm $docker ovpn_copy_server_files
+
+#create vpn see --cap-add=NET_ADMIN
+sleep 1
+docker run --detach --name $NAME -v $vpn_data:/etc/openvpn --net=$DOCKERnetwork --ip=172.50.0.2 -p $P:1194/udp --cap-add=NET_ADMIN $docker
+
+sudo sysctl -w net.ipv4.ip_forward=1
+
+#show created
+docker ps
+
+echo -e "\nEnter the full path of the directory you want to copy the .ovpn files to: "
+read path
+for USERNAME in master worker_1 worker_2 worker_3 worker_4
+do
+
+ docker run -v $vpn_data:/etc/openvpn --rm -it $docker easyrsa build-client-full $USERNAME nopass
+ docker run -v $vpn_data:/etc/openvpn --log-driver=none --rm $docker ovpn_getclient $USERNAME > $USERNAME.ovpn
+
+ tail -n +8 $USERNAME.ovpn > temp && cat temp > $USERNAME.ovpn
+ cat $USERNAME.ovpn > temp && cat extra_lines > $USERNAME.ovpn && cat temp >> $USERNAME.ovpn
+
+ mv $USERNAME.ovpn $path
+
+done
+
+
+
+
Το script initiate-vpn.sh αναλαμβάνει την κατασκευή του VPN καθώς και την δημιουργία χρηστών για αυτό. Δημιουργούνται συνολικά πέντε χρήστες που αντιστοιχούν στα μέλη του σμήνους ενώ στην
+συνέχεια πραγματοποιούνται οι κατάλληλες τροποποιήσεις πάνω στα .ovpn αρχεία του καθενός. Τέλος τα .ovpn αρχεία μεταφέρονται στον κοινόχρηστο φάκελο του Σμήνους.
+
+
+
+
+
+
+
+ |
+
+Τα επόμενα βήματα εκτελούνται από τα μέλη του Σμήνους
+ |
+
+
+
+
+
transfer_vpn_files.sh
+
+
#!/bin/bash
+
+network=$(ifconfig | grep 255.255.0.0 | awk '{print $2}' | cut -d '.' -f1-3)
+network="$network.*"
+
+cp /project/vpn_files/master.ovpn /home/docker/myvpn.ovpn
+for host in worker_1 worker_2 worker_3 worker_4
+do
+ ip=$(nmap -sP $network | grep $host | awk '{print $6}' | cut -d ')' -f1 | cut -d '(' -f2)
+ scp /project/vpn_files/$host.ovpn docker@$ip:/home/docker/myvpn.ovpn
+done
+
+
+
+
Ο master κόμβος αναλαμβάνει τον διαμοιρασμό των .ovpn αρχείων στα μέλη του Σμήνους με τέτοιο τρόπο ώστε κάθε host να έχει στο δικό του home directory το μοναδικό .ovpn αρχείο που
+του αντιστοιχεί. Αξίζει να σημειωθεί ότι τα αρχεία μαζί με την μεταφορά τους μετονομάζονται σε myvpn.ovpn ώστε να είναι δυνατή η σύνδεση όλων των host στο VPN με μία μόνο εκτέλεση μέσω ansible.
+
+
+
+
Εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 6 με αποτέλεσμα το ansible να εκτελέσει το playbook install_openvpn.yml
+
+
+
install_openvpn.yml
+
+
---
+- name: Install openvpn on all hosts
+ hosts: all_hosts
+ become: true
+ become_user: root
+
+ tasks:
+ - name: Installing openvpn
+ apt:
+ name: openvpn
+ state: present
+
+
+
+
Το playbook install_openvpn.yml αναλαμβάνει την εγκατάσταση του εργαλείου openvpn σε όλα τα μέλη του σμήνους(συμπεραλαμβανομένου του master).
+
+
+
+
connect_to_vpn.sh
+
+
#!/bin/bash
+
+nohup openvpn --config /home/docker/myvpn.ovpn &
+
+
+
+
Το script connect_to_vpn.sh συνδέει τον host που το εκτελεί στο VPN χρησιμοποιώντας το .ovpn file του.
+
+
+
+
Στη συνέχεια εκτελούμε το script execute_playbook.sh και στο μενού επιλογών εισάγουμε τον αριθμό 7 με αποτέλεσμα το ansible να εκτελέσει το playbook connect_to_vpn.yml.
+
+
+
connect_to_vpn.yml
+
+
- name: Connect to VPN
+ hosts: all_hosts
+ become: true
+ become_user: root
+
+ tasks:
+ - name: Transferring script connect_to_vpn.sh to every host
+ copy: src=/project/worker_scripts/connect_to_vpn.sh dest=/home/docker mode=0777
+
+ - name: Connecting to VPN
+ command: sh /home/docker/connect_to_vpn.sh
+
+
+
+
Το playbook connect_to_vpn.yml αναλαμβάνει την μεταφορά του script connect_to_vpn.sh στο οποίο αναφερθήκαμε νωρίτερα σε όλους τους hosts του σμήνους και το εκτελεί. Αποτέλεσμα είναι
+η σύνδεση όλων των μελών στο VPN με αυτοματοποιημένο τρόπο.
+
+
+
+
Εκτελούμε την εντολή ifconfig στον master
+
+
+
+
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
+ inet 172.19.0.2 netmask 255.255.0.0 broadcast 172.19.255.255
+ ether 02:42:ac:1b:00:02 txqueuelen 0 (Ethernet)
+ RX packets 26486 bytes 44006148 (44.0 MB)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 29110 bytes 9171697 (9.1 MB)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
+ inet 127.0.0.1 netmask 255.0.0.0
+ loop txqueuelen 1000 (Local Loopback)
+ RX packets 21670 bytes 2146681 (2.1 MB)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 21670 bytes 2146681 (2.1 MB)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
+ inet 10.80.0.2 netmask 255.255.0.0 destination 10.80.0.2
+ unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
+ RX packets 0 bytes 0 (0.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 0 bytes 0 (0.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+
+
+
Παρατηρούμε πως έχει δημιουργηθεί νέα κάρτα δικτύου τύπου tun και ότι ο master κατέχει την IP 10.80.0.2 στο VPN.
+
+
+
+
Στη συνέχεια εκτελούμε την εντολή ifconfig στον worker_1
+
+
+
+
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
+ inet 172.19.0.3 netmask 255.255.0.0 broadcast 172.19.255.255
+ ether 02:42:ac:1b:00:03 txqueuelen 0 (Ethernet)
+ RX packets 28626 bytes 32895662 (32.8 MB)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 14334 bytes 1342048 (1.3 MB)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
+ inet 127.0.0.1 netmask 255.0.0.0
+ loop txqueuelen 1000 (Local Loopback)
+ RX packets 10 bytes 877 (877.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 10 bytes 877 (877.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
+ inet 10.80.0.5 netmask 255.255.0.0 destination 10.80.0.5
+ unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
+ RX packets 0 bytes 0 (0.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 0 bytes 0 (0.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+
+
+
Πραγματοποιούμε ping ανάμεσα στους δύο host.
+
+
+
+
docker@7953b53e4903:~$ ping 10.80.0.2
+PING 10.80.0.2 (10.80.0.2) 56(84) bytes of data.
+64 bytes from 10.80.0.2: icmp_seq=1 ttl=64 time=0.312 ms
+64 bytes from 10.80.0.2: icmp_seq=2 ttl=64 time=1.38 ms
+64 bytes from 10.80.0.2: icmp_seq=3 ttl=64 time=0.704 ms
+64 bytes from 10.80.0.2: icmp_seq=4 ttl=64 time=0.696 ms
+64 bytes from 10.80.0.2: icmp_seq=5 ttl=64 time=0.409 ms
+64 bytes from 10.80.0.2: icmp_seq=6 ttl=64 time=1.32 ms
+64 bytes from 10.80.0.2: icmp_seq=7 ttl=64 time=0.659 ms
+64 bytes from 10.80.0.2: icmp_seq=8 ttl=64 time=0.515 ms
+64 bytes from 10.80.0.2: icmp_seq=9 ttl=64 time=1.27 ms
+64 bytes from 10.80.0.2: icmp_seq=10 ttl=64 time=1.34 ms
+
+
+
+
Επομένως το VPN έχει υλοποιηθεί με επιτυχία.