Wyobraźmy sobie, że posiadamy dedykowane serwery z kilkoma wirtualnymi hostami, które potrzebują bezpiecznej komunikacji między sobą. Jak ją zapewnić? Są na to dwa proste sposoby.
Opcja pierwsza: możemy poprosić naszego dostawcę usług o wydzielony vlan lub spięcie serwerów do jednego switcha, nie rzadko jednak niesie to ze sobą dodatkowe koszty.
Opcja druga: Zestawienie połączeń VPN. Oczywiście można eksperymentować np. z OpenVPN lub tunelami IPsec. Niestety, moim zdaniem poziom skomplikowania konfiguracji tych połączeń rośnie wraz z ilością serwerów włączonych do sieci VPN(oczywiście pod warunkiem, braku centralnego serwera, kiedy to każdy serwer musi mieć połączenie do reszty serwerów) . Wtedy z pomocą przychodzi nam tincd, bardzo prosty daemon VPN, który zapewnia szyfrowanie połączenia oraz topologie sieci mesh (nie ma mastera, a wszystkie daemony komunikują się ze sobą i dbają o to, aby hosty mogły ze sobą rozmawiać).
A więc do dzieła! Zajmijmy się konfiguracją tinc'a i topologii sieci mesh.
Do testów wykorzystałem 3 maszyny z zainstalowanym Centosem7.
1. Instalacja dodatkowych repozytoriów
yum -y install epel-release
2. Teraz daemona tinc
yum -y install tinc
3. Konfiguracja nazwy sieci, nazwijmy ją "mesh"
mkdir -p /etc/tinc/mesh
4. Generacja pary kluczy RSA, prywatnego oraz publicznego dla każdego klienta połączonego do sieci "mesh"
[root@host1 ~]# tincd -n mesh -K
Cannot open config file /etc/tinc/mesh/tinc.conf: No such file or directory
Failed to read `/etc/tinc/mesh/tinc.conf': No such file or directory
Generating 2048 bits keys:
.......... ......+++ p
.............. .............+++ q
Done.
Please enter a file to save private RSA key to [/etc/tinc/mesh/rsa_key.priv]:
Please enter a file to save public RSA key to [/etc/tinc/mesh/rsa_key.pub]:
[root@host1 ~]#
Na każdym hoście tworzymy skrypt o nazwie tinc-up w katalogu /etc/tinc/mesh/, który służy do podnoszenia interfejsu VPN po nawiązaniu połączenia (skrypt musi mieć prawa do wykonywania)
[root@host1 mesh]# cat /etc/tinc/mesh/tinc-up
#!/bin/sh
ifconfig $INTERFACE 172.22.1.1 netmask 255.255.255.0
Analogicznie dla dla reszty hostów ip 172.22.1.2 oraz 172.22.1.3
5. Tworzenie konfiguracji głównej dla każdego klienta
[root@host1 modules]# cat /etc/tinc/mesh/tinc.conf
Name = host1
AddressFamily = any
Device = /dev/net/tun
Mode = switch
ConnectTo = host2
ConnectTo = host3
Name - nazwa hosta
ConnectTo - nazwa konfiguracji klienta to jakiego ma się połączyć
6. Konfiguracja klientów
[root@host1 hosts]# mkdir -p /etc/tinc/mesh/hosts
[root@host1 hosts]# cat host1
Address = 192.168.75.128-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAlfs+rYzENzwQFisgGjsuLIkEsIgOdyK+AxlNSH6QxfLvApY759J4
NvHWbW4cH3JIDspnGaSIzwuT8Z1JqHBpt0LZLTTc01rU6h8RoL1g6lrq6TpORwxQ
e+3hzdXMESJ0hcqU5tCxtVsNyiJFIbwSAtuLcc65PVMzShheO4n1RU9yJ6piyg77
8DrjFYavoiGABFpLuj490cIFJsd3B2yZZeMjg+YehJNzwQuOQ/Zi8afxqNh9TDE5
Y7TWHkhLaB0hxVkXBJ1fASz0snXNsuGRgDfoMoStqrbeLLdcXfx0YfcTRvSxZcyh
TD6d1zhY538uQ5PNHXm6qAlc7TJ08ekElQIDAQAB
-----END RSA PUBLIC KEY-----
Musimy stworzyć konfiguracje dla każdego klienta, gdzie powinna zostać zawarta informacja o adresie IP oraz jego klucz publiczny, wygenerowany w punkcie 4.
Topologia połączenia hostów powinna wyglądać następująco:
7. Uruchomienie sieci VPN
[root@host1 mesh]# systemctl start tincd@mesh
8. Sprawdzenie połączenie np. na host1
[root@host1 mesh]# ip a s dev mesh
9: mesh: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
link/ether 62:82:e5:e7:e6:c1 brd ff:ff:ff:ff:ff:ff
inet 172.22.1.1/24 brd 172.22.1.255 scope global mesh
valid_lft forever preferred_lft forever
inet6 fe80::6082:e5ff:fee7:e6c1/64 scope link
valid_lft forever preferred_lft forever[root@host1 mesh]# ping 172.22.1.2
PING 172.22.1.2 (172.22.1.2) 56(84) bytes of data.
64 bytes from 172.22.1.2: icmp_seq=1 ttl=64 time=0.342 ms
64 bytes from 172.22.1.2: icmp_seq=2 ttl=64 time=0.452 ms
^C
--- 172.22.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.342/0.397/0.452/0.055 ms
[root@host1 mesh]# ping 172.22.1.3
PING 172.22.1.3 (172.22.1.3) 56(84) bytes of data.
64 bytes from 172.22.1.3: icmp_seq=1 ttl=64 time=0.328 ms
64 bytes from 172.22.1.3: icmp_seq=2 ttl=64 time=0.382 ms
64 bytes from 172.22.1.3: icmp_seq=3 ttl=64 time=0.423 ms
^C
--- 172.22.1.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.328/0.377/0.423/0.044 ms
[root@host1 mesh]#
To wszystko. W następnej części znajdziecie opis konfiguracji dotyczący rozbudowania sieci VPN. Powodzenia!