En artikel om, hvordan det lykkedes mig at køre en VPN-server bag NAT fra en hjemmeudbyder (uden en hvid IP-adresse). Lad mig fortælle dig med det samme: ydelsen af denne implementering afhænger direkte af typen af NAT, der bruges af din udbyder, såvel som routeren.
Så jeg havde et behov for at oprette forbindelse fra min Android-smartphone til min hjemmecomputer, begge enheder er forbundet til internettet via udbyderens NAT'er, plus at computeren er forbundet via en hjemmerouter, som også er NAT-forbindelser.
Den klassiske ordning med en leaset VPS/VDS med hvid IP-adresse, samt leje af en hvid IP-adresse hos udbyderen, blev ikke overvejet af flere grunde.
Tage med i overvejelse
$ stun stun.sipnet.ru
fik resultatet:
STUN-klientversion 0.97
Primær: Uafhængig kortlægning, uafhængigt filter, tilfældig port, vil hårnåle
returværdi er 0x000002
Ordret oversættelse:
Uafhængig kortlægning - uafhængig visning
Uafhængigt filter - uafhængigt filter
random port - random port
vil hårnål - der vil være en hårnål
Efter at have kørt en lignende kommando på min pc, fik jeg:
STUN-klientversion 0.97
Primær: Uafhængig kortlægning, portafhængigt filter, tilfældig port, vil hårnåle
returværdi er 0x000006
Portafhængigt filter - portafhængigt filter
Forskellen i resultaterne af outputtet af kommandoerne indikerede, at hjemmerouteren ydede "sit bidrag" til processen med at udsende pakker fra internettet, dette blev manifesteret i det faktum, at når kommandoen blev udført på computeren:
stun stun.sipnet.ru -p 11111 -v
jeg fik resultatet:
...
MappedAddress = XX.1XX.1X4.2XX:4398
...
i det øjeblik blev en UDP-session åbnet i et stykke tid, hvis der i det øjeblik blev sendt en UDP-anmodning (for eksempel: netcat XX.1XX.1X4.2XX 4398 -u), så kom anmodningen til hjemmerouteren, som var bekræftet af TCPDump, der kører på den, men anmodningen nåede ikke computeren - IPtables som NAT-oversætter på routeren droppede den.
Men selve det faktum at sende en UDP-anmodning gennem udbyderens NAT gav håb om succes. Da routeren er i min jurisdiktion, løste jeg problemet ved at omdirigere UDP / 11111-porten til computeren:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Jeg fik således mulighed for at starte en UDP-session og modtage anmodninger fra internettet fra enhver IP-adresse. I dette øjeblik lancerede jeg OpenVPN-serveren (efter at have konfigureret den) og lyttede til UDP/11111-porten, indikerede den eksterne IP-adresse og porten (XX.1XX.1X4.2XX:4398) på smartphonen og tilsluttede med succes fra smartphonen til computer. Men i denne implementering opstod der et problem, det var nødvendigt at vedligeholde UDP-sessionen på en eller anden måde, indtil OpenVPN-klienten var forbundet til serveren, jeg kunne ikke lide muligheden for periodisk at starte STUN-klienten - jeg ønskede ikke at indlæse STUN-servere forgæves.
gjorde også opmærksom på indlægget "
Hårnåle gør det muligt for en maskine på et lokalt netværk bag NAT at få adgang til en anden maskine på det samme netværk på routerens eksterne adresse.
Som et resultat løste jeg problemet med at opretholde en UDP-session simpelthen - jeg startede klienten på den samme computer med serveren.
Det virkede sådan her:
- lanceret STUN-klient med lokal port 11111
- modtaget svar med ekstern IP-adresse og port XX.1XX.1X4.2XX:4398
- sendte data med en ekstern IP-adresse og port til mailen (enhver anden tjeneste er mulig) konfigureret på smartphonen
- lancerede en OpenVPN-server på en computer, der lytter på UDP/11111-porten
- lancerede en OpenVPN-klient på en computer, der angiver XX.1XX.1X4.2XX:4398 for at forbinde
- til enhver tid lancerede OpenVPN-klienten på smartphonen med angivelse af IP-adressen og porten (i mit tilfælde ændrede IP-adressen sig ikke) for at oprette forbindelse
Dermed fik jeg mulighed for at forbinde til min computer fra en smartphone. Denne implementering giver dig mulighed for at forbinde enhver OpenVPN-klient.
Praksis
Du skal bruge:
# apt install openvpn stun-client sendemail
Efter at have skrevet et par scripts, et par konfigurationsfiler, genereret de nødvendige certifikater (da klienten på smartphonen kun fungerer med certifikater), fik vi den sædvanlige implementering af OpenVPN-serveren.
Hovedscript på computer
# cat vpn11.sh
#!/bin/bash
until [[ -n "$iftosrv" ]]; do echo "$(date) Определяю сетевой интерфейс"; iftosrv=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk '{print $1}'`; sleep 5; done
ABSOLUTE_FILENAME=`readlink -f "$0"`
DIR=`dirname "$ABSOLUTE_FILENAME"`
localport=11111
until [[ $a ]]; do
address=`stun stun.sipnet.ru -v -p $localport 2>&1 | grep "MappedAddress" | sort | uniq | head -n 1 | sed 's/:/ /g' | awk '{print $3" "$4}'`
ip=`echo "$address" | awk {'print $1'}`
port=`echo "$address" | awk {'print $2'}`
srv="openvpn --config $DIR/server.conf --port $localport --daemon"
$srv
echo "$(date) Сервер запущен с внешним адресом $ip:$port"
$DIR/sendemail.sh "OpenVPN-Server" "$ip:$port"
sleep 1
openvpn --config $DIR/client.conf --remote $ip --port $port
echo "$(date) Cоединение клиента с сервером разорвано"
for i in `ps xa | grep "$srv" | grep -v grep | awk '{print $1}'`; do
kill $i && echo "$(date) Завершен процесс сервера $i ($srv)"
done
echo "Жду 15 сек"
sleep 15
done
Script til afsendelse af e-mail:
# cat sendemail.sh
#!/bin/bash
from="От кого"
pass="Пароль"
to="Кому"
theme="$1"
message="$2"
server="smtp.yandex.ru:587"
sendEmail -o tls=yes -f "$from" -t "$to" -s "$server" -xu "$from" -xp "$pass" -u "$theme" -m "$message"
Serverkonfigurationsfil:
# cat server.conf
proto udp
dev tun
ca /home/vpn11-srv/ca.crt
cert /home/vpn11-srv/server.crt
key /home/vpn11-srv/server.key
dh /home/vpn11-srv/dh2048.pem
server 10.2.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
tls-server
tls-auth /home/vpn11-srv/ta.key 0
tls-timeout 60
auth SHA256
cipher AES-256-CBC
client-to-client
keepalive 10 30
comp-lzo
max-clients 10
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-server.log
verb 3
mute 20
Klientkonfigurationsfil:
# cat client.conf
client
dev tun
proto udp
ca "/home/vpn11-srv/ca.crt"
cert "/home/vpn11-srv/client1.crt"
key "/home/vpn11-srv/client1.key"
tls-client
tls-auth "/home/vpn11-srv/ta.key" 1
auth SHA256
cipher AES-256-CBC
auth-nocache
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-clent.log
verb 3
mute 20
ping 10
ping-exit 30
Certifikater blev genereret iflg
Kørsel af scriptet:
# ./vpn11.sh
Gør det eksekverbart først
# chmod +x vpn11.sh
På smartphone-siden
Ved at installere applikationen Åbn VPN til Android, kopiering af konfigurationsfilen, certifikater og konfiguration af den, blev det sådan her:
Tjekker e-mail på min smartphone
Jeg redigerer portnummeret i indstillingerne
Jeg starter klienten og forbinder
I processen med at skrive artiklen overførte jeg konfigurationen fra computeren til Raspberry Pi 3 og forsøgte at køre det hele på et LTE-modem, men det virkede ikke! kommando resultat
# stun stun.ekiga.net -p 11111
STUN-klientversion 0.97
Primær: Uafhængig kortlægning, portafhængigt filter, tilfældig port, vil hårnåle
returværdi er 0x000006
значение Portafhængigt filter forhindrede systemet i at starte.
Men hjemmeudbyderen lod systemet køre på Raspberry Pi 3 uden problemer.
I forbindelse med et webcam, med VLC til
oprettelse af en RTSP-stream fra et webcam
$ cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{vcodec=x264,venc=x264{preset=ultrafast,profile=baseline,level=31},vb=2048,fps=12,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://10.2.0.1:8554/}' --no-sout-all --sout-keep
og VLC på en smartphone til visning (stream rtsp://10.2.0.1:8554/), viste det sig ikke at være et dårligt videoovervågningssystem på afstand, du kan også opsætte Samba, dirigere trafik gennem VPN, fjernstyre en computer og meget mere ...
Output
Som praksis har vist, for at organisere en VPN-server, kan du undvære en ekstern IP-adresse, som du skal betale for, såvel som for en lejet VPS / VDS. Men det hele afhænger af udbyderen. Selvfølgelig ønskede jeg at få mere information om de forskellige udbydere og typer af NAT'er, der bruges, men dette er kun begyndelsen ...
Tak for din opmærksomhed!
Kilde: www.habr.com