= ΑΣΦΑΛΕΙΑ ΔΙΚΤΥΩΝ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ANTONIOU KALLIOPI 47441
// Metadata:
:description: ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ 
:keywords: doc
:data-uri:
:toc: right
:toc-title: Πίνακας περιεχομένων
:toclevels: 4
:source-highlighter: highlight
:icons: font
:sectnums: 

// RUNNING COMMAND: asciidoctor ex1.adoc 

{empty} +



[[cheat-clone]]



== Shorewall
Το Shorewall είναι ένα εργαλείο τείχους προστασίας ανοιχτού κώδικα για το Linux που βασίζεται στο σύστημα Netfilter (iptables / ipchains) ενσωματωμένο στον πυρήνα του Linux, διευκολύνοντας τη διαχείριση πιο περίπλοκων σχημάτων διαμόρφωσης παρέχοντας ένα υψηλότερο επίπεδο αφαίρεσης για την περιγραφή κανόνων χρησιμοποιώντας αρχεία κειμένου.

image::./1.png[]

== Docker
Το Docker είναι ένα πρόγραμμα εικονικοποίησης επιπέδου λειτουργικού συστήματος το οποίο αναπτύχθηκε από την Docker Inc.
Docker είναι ένα λογισμικό εικονικοποίησης σε επίπεδο OS και υποστηρίζει λειτουργικό σύστημα Linux και Windows. Για να χρησιμοποιήσετε το Docker σε Linux, πρέπει να χρησιμοποιηθεί το Ubuntu. Πρέπει να διασφαλιστεί η σωστή έκδοση του πυρήνα του Linux πριν την εγκατάσταση του Docker σε λειτουργικό σύστημα Linux. Το Docker διαθέτει επίσης ένα διανομέα Docker Registry ο οποίος διαθέτει μια λίστα υπηρεσιών πριν το χρησιμοποιήσετε.

image::./2.png[]

== SSH TUNNELING
Μια σήραγγα Secure Shell (SSH) αποτελείται από μια κρυπτογραφημένη σήραγγα που δημιουργείται μέσω μιας σύνδεσης πρωτοκόλλου SSH. Οι χρήστες μπορούν να ρυθμίσουν σήραγγες SSH για να μεταφέρουν μη κρυπτογραφημένη κίνηση μέσω δικτύου μέσω κρυπτογραφημένου καναλιού. Μπορεί να χρησιμοποιηθεί και για την υλοποίηση VPN δικτύων και για πρόβαση σε υπηρεσίες intranet _(εσωτερικών δικτύων)_ σε τείχη προστασίας. Παρέχει ένα τρόπο για να εξασφαλίσει την κυκλοφορία δεδομένων οποιασδήποτε συγκεκριμένης εφαρμογής,χρησιμοποιώντας τη σήραγγα οποιασδήποτε θύρας TCP/IP μέσω SSH.

image::./3.png[]

== VPN
Το εικονικό ιδιωτικό δίκτυο (VPN) είναι ένας τρόπος με τον οποίο δύο ή περισσότερα εταιρικά δίκτυα μπορούν να συνδεθούν μέσω δημόσιου δικτύου για να σχηματίσουν ένα φαινομενικά ιδιωτικό δίκτυο. Σήμερα, ο ορισμός του VPN έχει επεκταθεί ώστε να περιλαμβάνει μεμονωμένους απομακρυσμένους σταθμούς εργασίας συνδεδεμένους σε εταιρικό δίκτυο. Ένα VPN συνήθως απαιτεί από τους απομακρυσμένους χρήστες του δικτύου πιστοποίηση και συχνά ασφαλίζει τα δεδομένα με τεχνολογίες κρυπτογράφησης για να εμποδιστεί η υποκλοπή και η διάδοση ιδιωτικών πληροφοριών σε χρήστες που δεν είναι συνδεδεμένοι _(μη εξουσιοδοτημένοι χρήστες)_.

image::./4.png[]

'''


=== Δημιουργία δικτύων  στον docker HOST 
====
"create network frist"

Για τη δημιουργία δικτύων, μέσα στα Containers του  Docker, εκτελούμε τις εξής εντολές στο τερματικό :

docker network create --driver=bridge --subnet=*IP_subnet/Prefix*  *Network_name*
====


=== Δημιουργία δικτύων in docker container
====
"connect network created to container"

Με την παρακάτω εντολή καθορίζουμε σε ποια δίκτυα θα συνδεθούν τα container που θα δημιουργηθούν.

Εκτελούμε την εντολή docker container ps για να βρούμε το όνομα του container που θέλουμε να συνδεθούμε. Έπειτα γράφουμε:

docker network connect *Network_name*  *Container_name*
====

image::./5.png[]
image::./6.png[]

==== Για σύνδεση στο ίντερνετ
====
Ωστόσο για την σύνδεση των container με το  ίντερνετ, θα πρέπει να ρυθμίσουμε ως Gateway την κατάλληλη ip.
Με την παρακάτω εντολή:

ip route add default via  *Host_Network_ip*  dev  *interface*
====

image::./7.png[]

=== ΖΗΤΗΜΑΤΑ

==== Allow Internet connection 

==== Allow only connection from Network A -> B, B -> A  port 80

Eπικοινωνία Δικτύων Α -> Β, Β -> Α

Γι’ αυτή την επικοινωνία των δικτύων, θα χρειαστεί να ρυθμίσουμε το Shorewall.

Με την βοήθεια, της εντολής *nano*, ανοίγουμε τα  αρχεία: interfaces, zones, policy, masq, rules

- *nano /etc/shorewall/interfaces*

Προσθέτουμε το δίκτυο και την διεπαφή του.

[cols="4", options="header"]
|===
|ZONE
|INTERFACE
|BROADCAST
|OPTIONS

|net
|eth0
|detect
|tcpflags,nosmurfs

|*Network_name_for_A*
|ethA
|detect
|tcpflags,nosmurfs

|*Network_name_for_B*
|ethB
|detect
|tcpflags,nosmurfs
|===


- *nano /etc/shorewall/zones*

Προσθέτουμε το δίκτυο και τον τύπο του.

[cols="5", options="header"]
|===
|ZONE
|TYPE
|OPTIONS
|IN Options
|OUT Options

|fw
|firewall
|
|
|

|net
|ipv4
|
|
|

|*Network_name_A*
|ipv4
|
|
|

|*Network_name_B*
|ipv4
|
|
|
|===

- *nano /etc/shorewall/policy*

Προσθέτουμε τις επιτρεπόμενες κινήσεις από μέσα προς τα έξω και ανάποδα.

[cols="5", options="header"]
|===
|SOURCE
|DEST
|POLICY
|LOG LEVEL
|LIMIT:BURST

|net
|fw
|ACCEPT
|
|

|fw
|net
|ACCEPT
|
|

|*Network_name_A*
|net
|ACCEPT
|
|

|fw
|*Network_name_A*
|ACCEPT
|
|

|net
|*Network_name_A*
|ACCEPT
|
|

|*Network_name_A*
|fw
|ACCEPT
|
|

|*Network_name_A*
|*Network_name_B*
|ACCEPT
|
|

|*Network_name_B*
|*Network_name_A*
|ACCEPT
|
|

|net
|all
|DROP
|
|

|all
|all
|REJECT
|info
|
|===


- *nano /etc/shorewall/masq*

Γράφουμε τα ονόματα των διεπαφών.

[cols="2", options="header"]
|===
|INTERFACE
|SOURCE

|eth0
|ethA

|eth0
|ethB
|===

- *nano /etc/shorewall/rules*

Προσθέτουμε την πόρτα και το πρωτόκολλο που θα χρησιμοποιήσει η επιτρεπόμενη κίνηση.

(Προσθέτουμε τις ανάλογες γραμμές έτσι ώστε τα δίκτυα, να έχουν επικοινωνία στην πόρτα 80.)

[cols="5", options="header"]
|===
|ACTION
|SOURCE
|DEST
|PROTO
|DEST PORT

|ACCEPT
|Network_name_A
|Network_name_B
|tcp
|80

|ACCEPT
|Network_name_B
|Network_name_A
|tcp
|80
|===

*_Κάνουμε restart το shorewall και έπειτα κάνουμε ping στον worker και βλέπουμε ότι τρέχει._*

==== Open SSH Tunnel from NETWORK-A(port 80) -> MASTER(port 8080) and connect from HOST -> MASTER port 9000

====
Για να υλοποιήσουμε την παραπάνω σηράγγωση, πρέπει πρώτα να εγκαθιδρύσουμε μία σηράγγωση SSH _(local port forwarding)_ μεταξύ:

- του υπολογιστή μας _(HOST)_ και του master

- του master και του worker.

*ssh -t -L 9000:localhost:8080 <user>@<Master_IP_Address> ssh -L 8080:localhost:80 <user>@<Worker_IP_Address>*
====

image::./8.png[]

==== Create VPN

image::./9.png[]

_Δημιουργούμε  ένα VPN από την πλευρά του worker και φτιάχνουμε ένα χρήστη με τον οποίο θα συνδεθεί ο host στο VPN._

====
- *create network*

docker network create --attachable=true --driver=bridge --subnet=*Network_IP_Address/CIDR* --gateway=*Gateway_IP_Address* *docker_Network_name*
====

====
- *run container*

Δημιουργούμε ένα φάκελο τον οποίο θα χρησιμοποιήσουμε για το VPN.

docker run --net=none -it -v *Destination_file*:/etc/openvpn  --rm *ovpn_name* ovpn_genconfig  -u udp://*IP_Address_HOST:Port* \-N -d -c -p "route *container <Network_IP><Network_mask>*" -e "topology subnet" -s *Network_VPN_IP_Address/CIDR _(οι διευθύνσεις που παρέχονται από το VPN)_*
====

====
- *create pki*

Δημιουργία κλειδιού για σύνδεση χρήστη.

docker run --net=none -v *Destination_file*:/etc/openvpn  --rm -it *ovpn_name* ovpn_initpki
====

====
- *create vpn*

Δημιουργία εικονικού ιδιωτικού δικτύου.

docker run --detach --name *name_VPNSERVER* -v *Destination_file*:/etc/openvpn --net=*docker_Network_name* --ip=*IP_container_VPNSERVER* -p *PORT_VPN_(physical_port)_*:*<virtual_port>*/udp --cap-add=NET_ADMIN *ovpn_name*
====

====
- *create user*

Δημιουργία χρήστη.

docker run -v *Destination_file*:/etc/openvpn --rm -it *ovpn_name* easyrsa build-client-full *client_name_VPN* nopass
====

====
- Αποστολή ρυθμίσεων χρήστη σε αρχείο.

docker run -v *Destination_file*:/etc/openvpn --log-driver=none --rm *ovpn_name* ovpn getclient *<client_name_VPN><path/filename.ovpn>*
====

_NOTE: Για την αποστολή του αρχείου από τον host στον χρήστη VPN, για να μπορεί να συνδεθεί, ο χρήστης θα πρέπει να εκτελέσει την εντολή *openvpn –config _filename.ovpn_* .



