Hei alle sammen, jeg leste nylig
Oppgave
Det er en TP-Link WDR3500-ruter og en Orange Pi Zero H2. Vi vil at Orange Pi skal kryptere tunnelene som vanlig, og hvis noe skjer med den, vil VPN-behandlingen gå tilbake til ruteren. Alle brannmurinnstillinger på ruteren skal fungere som før. Og generelt bør det å legge til ekstra maskinvare være gjennomsiktig og umerkelig for alle. OpenVPN fungerer over TCP, TAP-adapteren er i bromodus (serverbro).
beslutning
I stedet for å koble til via USB, bestemte jeg meg for å bruke én port på ruteren og koble alle subnett som har en VPN-bro til Orange Pi. Det viser seg at maskinvaren fysisk vil henge i de samme nettverkene som VPN-serveren på ruteren. Etter det installerer vi nøyaktig de samme serverne på Orange Pi, og på ruteren setter vi opp en slags proxy slik at den sender alle innkommende tilkoblinger til den eksterne serveren, og hvis Orange Pi er død eller utilgjengelig, deretter til intern reserveserver. Jeg tok HAProxy.
Det viser seg slik:
- En klient kommer
- Hvis den eksterne serveren ikke er tilgjengelig, som før, går tilkoblingen til den interne serveren
- Hvis tilgjengelig, aksepteres klienten av Orange Pi
- VPN på Orange Pi dekrypterer pakker og spytter dem tilbake i ruteren
- Ruteren ruter dem et sted
Implementeringseksempel
Så la oss si at vi har to nettverk på ruteren - hoved(1) og gjest(2), for hver av dem er det en OpenVPN-server for ekstern tilkobling.
Nettverkskonfigurasjon
Vi må rute begge nettverkene gjennom én port, så vi lager 2 VLAN.
På ruteren, i Nettverk/Switch-delen, opprett VLAN-er (for eksempel 1 og 2) og aktiver dem i tagget modus på ønsket port, legg til de nyopprettede eth0.1 og eth0.2 til de tilsvarende nettverkene (for eksempel, legg dem til brigde).
På Orange Pi lager vi to VLAN-grensesnitt (jeg har Archlinux ARM + netctl):
/etc/netctl/vlan-main
Description='Main VLAN on eth0'
Interface=vlan-main
Connection=vlan
BindsToInterfaces=eth0
VLANID=1
IP=no
/etc/netctl/vlan-gjest
Description='Guest VLAN on eth0'
Interface=vlan-guest
Connection=vlan
BindsToInterfaces=eth0
VLANID=2
IP=no
Og vi lager umiddelbart to broer for dem:
/etc/netctl/br-main
Description="Main Bridge connection"
Interface=br-main
Connection=bridge
BindsToInterfaces=(vlan-main)
IP=dhcp
/etc/netctl/br-gjest
Description="Guest Bridge connection"
Interface=br-guest
Connection=bridge
BindsToInterfaces=(vlan-guest)
IP=dhcp
Aktiver autostart for alle 4 profilene (netctl aktiver). Nå etter en omstart vil Orange Pi henge på de to nødvendige nettverkene. Vi konfigurerer grensesnittadressene på Orange Pi i Static Leases på ruteren.
ip addr show
4: vlan-main@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-main state UP group default qlen 1000
link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
inet6 fe80::42:f0ff:fef8:23c8/64 scope link
valid_lft forever preferred_lft forever
5: vlan-guest@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-guest state UP group default qlen 1000
link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
inet6 fe80::42:f0ff:fef8:23c8/64 scope link
valid_lft forever preferred_lft forever
6: br-main: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:c7:0f:89:71:6e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic noprefixroute br-main
valid_lft 29379sec preferred_lft 21439sec
inet6 fe80::50c7:fff:fe89:716e/64 scope link
valid_lft forever preferred_lft forever
7: br-guest: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ee:ea:19:31:34:32 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.3/24 brd 192.168.2.255 scope global br-guest
valid_lft forever preferred_lft forever
inet6 fe80::ecea:19ff:fe31:3432/64 scope link
valid_lft forever preferred_lft forever
VPN-oppsett
Deretter kopierer vi innstillingene for OpenVPN og nøkler fra ruteren. Innstillinger kan vanligvis finnes i /tmp/etc/openvpn*.conf
Som standard holder openvpn som kjører i TAP-modus og server-bridge grensesnittet inaktivt. For at alt skal fungere, må du legge til et skript som kjører når tilkoblingen er aktivert.
/etc/openvpn/main.conf
dev vpn-main
dev-type tap
client-to-client
persist-key
persist-tun
ca /etc/openvpn/main/ca.crt
cert /etc/openvpn/main/main.crt
cipher AES-256-CBC
comp-lzo yes
dh /etc/openvpn/main/dh2048.pem
ifconfig-pool-persist /etc/openvpn/ipp_main.txt
keepalive 10 60
key /etc/openvpn/main/main.key
port 443
proto tcp
push "redirect-gateway"
push "dhcp-option DNS 192.168.1.1"
server-bridge 192.168.1.3 255.255.255.0 192.168.1.200 192.168.1.229
status /tmp/openvpn.main.status
verb 3
setenv profile_name main
script-security 2
up /etc/openvpn/vpn-up.sh
/etc/openvpn/vpn-up.sh
#!/bin/sh
ifconfig vpn-${profile_name} up
brctl addif br-${profile_name} vpn-${profile_name}
Som et resultat, så snart tilkoblingen oppstår, vil vpn-main-grensesnittet bli lagt til br-main. For gjestenettet - på samme måte opp til grensesnittnavnet og adressen i server-bridge.
Ruting forespørsler eksternt og proxying
På dette trinnet er Orange Pi allerede i stand til å godta tilkoblinger og koble klienter til de nødvendige nettverkene. Alt som gjenstår er å konfigurere proxying av innkommende tilkoblinger på ruteren.
Vi overfører ruterens VPN-servere til andre porter, installerer HAProxy på ruteren og konfigurerer:
/etc/haproxy.cfg
global
maxconn 256
uid 0
gid 0
daemon
defaults
retries 1
contimeout 1000
option splice-auto
listen guest_vpn
bind :444
mode tcp
server 0-orange 192.168.2.3:444 check
server 1-local 127.0.0.1:4444 check backup
listen main_vpn
bind :443
mode tcp
server 0-orange 192.168.1.3:443 check
server 1-local 127.0.0.1:4443 check backup
Nyt
Hvis alt gikk etter planen, vil klientene bytte til Orange Pi og ruterens prosessor vil ikke lenger varmes opp, og VPN-hastigheten vil øke betydelig. Samtidig vil alle nettverksregler som er registrert på ruteren forbli relevante. I tilfelle en ulykke på Orange Pi vil den falle av og HAProxy vil overføre klienter til lokale servere.
Takk for oppmerksomheten, forslag og rettelser er velkomne.
Kilde: www.habr.com