1 (edytowany przez gimbus109 2015-12-25 10:54:17)

Temat: OpenVPN i sieci rutowane poradnik/przemyślenia (długie)

Postanowiłem podzielić się moimi doświadczeniami z rutowanymi sieciami i OpenVPN.
Konfiguracja nastepująca:
1. "Centrala" - sieć za DSL-em, stały publiczny adres IP.
Adresy prywatne podsieci za NAT-em - 192.168.200.0/24
Router VPN - dd-wrt, IP servera VPN: 10.0.0.1, podsieć VPN 10.0.0.0/24

2. Satelita nr 1 - sieć 192.168.201.0/24
Dostęp do internetu - modem HiLink, modowany, adres IP modemu
192.168.202.1, bez publicznie dostępnego adresu IP WAN.
CN klienta VPN: Sat1

3. Satelita nr 2 - sieć 192.168.203.0/24
Dostęp do internetu - modem HiLink, modowany, adres IP modemu
192.168.204.1, bez publicznie dostępnego adresu IP WAN.
CN klienta VPN: Sat2

4. Komputery klientów VPN - CN odpowiednio Komp1 i Komp2, łaczą się z VPN
poprzez kienta zainstalowanego bezpośrednio na tych komputerach.

Obydwa satelity pracują za routerem TP-Link 3420 z Gargoyle, extroot na pendrivie, hub aktywny z dobrym zasilaczem, też modowany - przecięta ścieżka łącząca +5V zasilania z +5V kabla USB idącego do modemu.

Aby uzyskać połączenie z urządzeniami w sieci satelickiej, kombinowałem początkowo z przekierowaniami portów VPN->LAN, (o tu: http://eko.one.pl/forum/viewtopic.php?p … 01#p154901), ale doszedłem do wniosku, że zdecydowanie lepszym rozwiązaniem będzie zrobienie jednej dużej rutowanej sieci w której z każdego urządzenia w sieci będę miał dostęp do dowolnego innego urządzenia bez względu na jego lokalizację.

Dokumentacja OpenVPN podaje, że aby uzyskać łącznośc pomiędzy klientami należy ustawić w konfiguracji serwera opcję
client-to-client. Filozofia OpenVPN jest taka, że ma ona swoją wewnętrzną tabelę routingu, odpowiedzialną za trasowanie ruchu do pomiędzy podsiecią VPN a innymi podsieciami.
Po bojach i poszukiwaniach w necie doszedłem do wniosku, że lepszym rozwiązaniem jest - paradoksalnie - wyłączenie opcji
client-to-client
i rozwiązanie trasowania poprzez konfigurację trasowania w tablicach routingu routerów VPN. Daje to większą kontrolę i elastycznośc konfiguracji.

Po kolei:
1. Na wszystkich routerach włączamy forwardowanie pakietów VPN<->LAN
2. Na serwerze OpenVPN dodajemy w pliku konfiguracyjnym serwera VPN wpisy:

topology subnet
route 192.168.201.0 255.255.255.0 10.0.0.1  # LAN Satelita 1
route 192.168.202.0 255.255.255.0 10.0.0.1  # WAN Satelita 1
route 192.168.203.0 255.255.255.0 10.0.0.1  # LAN Satelita 2
route 192.168.204.0 255.255.255.0 10.0.0.1  # WAN Satelita 2

push "route 192.168.200.0 255.255.255.0"    # LAN Centrala
push "route 192.168.201.0 255.255.255.0"    # LAN Satelita 1
push "route 192.168.202.0 255.255.255.0"    # WAN Satelita 1
push "route 192.168.203.0 255.255.255.0"    # LAN Satelita 2
push "route 192.168.204.0 255.255.255.0"    # WAN Satelita 2

linie "route..." informują router (serwer) VPN, że trasa do podsieci 192.168.201.0 i kolejnych wiedzie poprzez tunel VPN.
Linie "push route ..." informują klientów VPN, że trasa do podsieci 192.168.200.0, 192.168.201.0 i kolejnych  wiedzie poprzez tunel VPN.

3. W konfiguracji serwera OpenVPN dodajemy wpis:

client-config-dir /sciezka/do/konfiguracji/openvpn/ccd

Katalog ccd będzie zawierał pliki konfiguracyjne specyficzne dla każdego klienta OpenvPN.

4. W katalogu ccd umieszczamy pliki Sat1, Sat2, Komp1 i Komp2 (nazwy plików są takie, jak CN klienta VPN):

Sat1:

ifconfig-push 10.0.0.2 255.255.255.0
iroute 192.168.201.0 255.255.255.0
iroute 192.168.202.0 255.255.255.0

Sat2:

ifconfig-push 10.0.0.3 255.255.255.0
iroute 192.168.203.0 255.255.255.0
iroute 192.168.204.0 255.255.255.0

Komp1:

ifconfig-push 10.0.0.4 255.255.255.0

Komp2:

ifconfig-push 10.0.0.5 255.255.255.0

Linie "ifconfig push.." przydzielają każdemu klientowi adres IP z podsieci VPN.
Linie "iroute.." dotyczą wewnętrznego routingu VPN (internal route) i informują serwer VPN, że klient Sat1 o adresie VPN 10.0.0.2 ma za sobą 2 podsieci:
192.168.201.0/24 i 192.168.202.0/24
i odpowiednio dla klienta Sat2 - podsieci 192.168.203.0/24 i 192.168.204.0/24


Tabela routingu serwera openVPN po uruchomieniu demona VPN:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 vlan2
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun2
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
192.168.200.0   0.0.0.0         255.255.255.0   UG    0      0        0 br0
192.168.201.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun2
192.168.202.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun2
192.168.203.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun2
192.168.204.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun2

Czyli serwer wie, że trasa do podsieci 192.168.201.0 i kolejnych wiedzie poprzez tunel VPN (interfejs tun2)


Przy takiej konfiguracji tabela routingu na kliencie Komp1 przed zestawieniem tunelu VPN do serwera wygląda następująco:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.101.254 0.0.0.0         UG    0      0        0 wlan18
192.168.101.0   0.0.0.0         255.255.255.0   U     9      0        0 wlan18

192.168.101.0/24 to sieć, w której w tym momencie jest Komp1. Brama w tej sieci ma adres 192.168.101.254 i przez nią jest kierowany cały ruch na zewnątrz.

Po zestawieniu tunelu VPN tabela routingu wygląda następująco:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.101.254 0.0.0.0         UG    0      0        0 wlan18
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
w.x.y.z         192.168.101.254 255.255.255.255 UGH   0      0        0 wlan18
192.168.200.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun0
192.168.201.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun0
192.168.202.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun0
192.168.203.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun0
192.168.204.0   10.0.0.1        255.255.255.0   UG    0      0        0 tun0
192.168.101.0   0.0.0.0         255.255.255.0   U     9      0        0 wlan18

Widać wyraźnie, że:
- trasa do w.x.y.z to trasa do publicznego IP serwera VPN
- trasa do podsieci VPN 10.0.0.0 wiedzie poprzez interfejs tun0 czyli tunel
VPN jest aktywny
- trasa do podsieci 192.168.200.0 i kolejnych wiedzie poprzez adres IP serwera
VPN z puli wirtualnych adresów podsieci VPN
- ruch lokalny (do podsieci 192.168.101.0) pozostał bez zmian
- cały pozostały ruch pozostał bez zmian, czyli przez bramę 192.168.101.254

Tada !!!! smile
Wszystkie urządzenia w sieci widzą siebie nawzajem, każdy może pingować każdego.
Teraz czas na ograniczenia dostępu wink
Prostota tego rozwiązania polega na tym, że całą konfigurację od tego momentu przeprowadzamy na serwerze OpenVPN, poprzez modyfikację reguł firewalla.

# Zezwalamy na cały ruch już wcześniej zainicjowany
# iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#Chcemy, aby Komp2 nie miał dostępu do podsieci Sat2:
# iptables -A FORWARD -s 10.0.0.5 -d 192.168.203.0/24 -j DROP
# iptables -A FORWARD -s 10.0.0.5 -d 192.168.204.0/24 -j DROP

#Chcemy, aby Komp1 miał pełen dostęp do wszystkiego:
# iptables -A FORWARD -s 10.0.0.4 -d 192.168.0.0/16 -j ACCEPT
# iptables -A FORWARD -s 192.168.0.0/16 -d 10.0.0.4 -m conntrack --ctstate NEW -j ACCEPT

#Wszyscy z podsieci Sat1 mają dostęp do Sat2 ale tylko wtedy gdy sami zainicjują połączenie:
# iptables -A FORWARD -s 192.168.201.0/24 -d 192.168.203.0/24 -m conntrack --ctstate NEW -j ACCEPT
# iptables -A FORWARD -s 192.168.201.0/24 -d 192.168.204.0/24 -m conntrack --ctstate NEW -j ACCEPT

#Blokujemy cały pozostały ruch:
# iptables -A FORWARD -j DROP     

Mam nadzieję, że ułatwi to niektórym konfigurację VPN.
Pozdrawiam
Gimbus109