Artikel tentang bagaimana saya berhasil menjalankan server VPN di belakang NAT penyedia rumah saya (tanpa alamat IP putih). Izinkan saya membuat reservasi segera: itu kinerja implementasi ini secara langsung bergantung pada jenis NAT yang digunakan oleh penyedia Anda, serta routernya.
Jadi, saya perlu terhubung dari ponsel pintar Android saya ke komputer di rumah saya, kedua perangkat terhubung ke Internet melalui penyedia NAT, ditambah komputer terhubung melalui router rumah, yang juga koneksi NAT.
Skema klasik menggunakan VPS/VDS sewaan dengan alamat IP putih, serta menyewa alamat IP putih dari penyedia, tidak dipertimbangkan karena beberapa alasan.
Mempertimbangkan
$ stun stun.sipnet.ru
mendapat hasilnya:
Klien STUN versi 0.97
Utama: Pemetaan Independen, Filter Independen, port acak, akan jepit rambut
Nilai kembaliannya adalah 0x000002
Terjemahan harfiah:
Pemetaan Independen - pemetaan independen
Filter Independen - filter independen
port acak - port acak
akan jepit rambut - akan ada jepit rambut
Menjalankan perintah serupa di PC saya, saya mendapatkan:
Klien STUN versi 0.97
Utama: Pemetaan Independen, Filter Ketergantungan Port, port acak, akan jepit rambut
Nilai kembaliannya adalah 0x000006
Filter Tergantung Port - filter bergantung pada port
Perbedaan hasil keluaran perintah menunjukkan bahwa router rumah memberikan “kontribusinya” terhadap proses transmisi paket dari Internet; hal ini diwujudkan dalam kenyataan bahwa ketika menjalankan perintah di komputer:
stun stun.sipnet.ru -p 11111 -v
Saya mendapatkan hasilnya:
...
Alamat yang Dipetakan = XX.1XX.1X4.2XX:4398
...
pada saat ini sesi UDP dibuka untuk beberapa waktu, jika saat ini Anda mengirim permintaan UDP (misalnya: netcat XX.1XX.1X4.2XX 4398 -u), maka permintaan tersebut datang ke router rumah, yaitu dikonfirmasi oleh TCPDump yang berjalan di atasnya, tetapi permintaan tersebut tidak sampai ke komputer - IPtables, sebagai penerjemah NAT di router, menjatuhkannya.
Namun fakta bahwa permintaan UDP melewati NAT penyedia memberikan harapan untuk sukses. Karena router berada di yurisdiksi saya, saya memecahkan masalah dengan mengarahkan port UDP/11111 ke komputer:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Dengan demikian, saya dapat memulai sesi UDP dan menerima permintaan dari Internet dari alamat IP mana pun. Pada saat ini, saya meluncurkan server OpenVPN (setelah mengkonfigurasinya sebelumnya) mendengarkan port UDP/11111, menunjukkan alamat IP eksternal dan port (XX.1XX.1X4.2XX:4398) pada ponsel cerdas dan berhasil terhubung dari ponsel cerdas ke komputer. Namun dalam implementasi ini muncul masalah: entah bagaimana perlu mempertahankan sesi UDP hingga klien OpenVPN terhubung ke server; Saya tidak suka opsi untuk meluncurkan klien STUN secara berkala - saya tidak ingin menyia-nyiakan beban pada server STUN.
Saya juga memperhatikan entri “
Hairpinning memungkinkan satu mesin di jaringan lokal di belakang NAT mengakses mesin lain di jaringan yang sama di alamat eksternal router.
Hasilnya, saya hanya memecahkan masalah mempertahankan sesi UDP - saya meluncurkan klien di komputer yang sama dengan server.
Ini bekerja seperti ini:
- meluncurkan klien STUN pada port lokal 11111
- menerima respons dengan alamat IP eksternal dan port XX.1XX.1X4.2XX:4398
- mengirim data dengan alamat IP eksternal dan port ke email (layanan lain dimungkinkan) yang dikonfigurasi pada ponsel cerdas
- meluncurkan server OpenVPN di komputer yang mendengarkan port UDP/11111
- meluncurkan klien OpenVPN di komputer yang menentukan XX.1XX.1X4.2XX:4398 untuk terhubung
- kapan saja meluncurkan klien OpenVPN di ponsel cerdas yang menunjukkan alamat IP dan port (dalam kasus saya, alamat IP tidak berubah) untuk terhubung
Dengan cara ini saya dapat terhubung ke komputer saya dari ponsel cerdas saya. Implementasi ini memungkinkan Anda menghubungkan klien OpenVPN apa pun.
Praktek
Anda akan membutuhkan:
# apt install openvpn stun-client sendemail
Setelah menulis beberapa skrip, beberapa file konfigurasi, dan menghasilkan sertifikat yang diperlukan (karena klien pada ponsel cerdas hanya bekerja dengan sertifikat), kami mendapatkan implementasi biasa dari server OpenVPN.
Skrip utama di komputer
# 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 untuk mengirim data melalui email:
# 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"
File konfigurasi server:
# 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
File konfigurasi klien:
# 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
Sertifikat dihasilkan menggunakan
Menjalankan skrip:
# ./vpn11.sh
Dengan terlebih dahulu membuatnya dapat dieksekusi
# chmod +x vpn11.sh
Di sisi ponsel pintar
Dengan menginstal aplikasi OpenVPN untuk Android, setelah menyalin file konfigurasi, sertifikat dan mengkonfigurasinya, ternyata seperti ini:
Aku memeriksa emailku di ponsel pintarku
Saya mengedit nomor port di pengaturan
Saya meluncurkan klien dan terhubung
Saat menulis artikel ini, saya mentransfer konfigurasi dari komputer saya ke Raspberry Pi 3 dan mencoba menjalankan semuanya pada modem LTE, tetapi tidak berhasil! Hasil Perintah
# stun stun.ekiga.net -p 11111
Klien STUN versi 0.97
Utama: Pemetaan Independen, Filter Ketergantungan Port, port acak, akan jepit rambut
Nilai kembaliannya adalah 0x000006
nilai Filter Tergantung Port tidak mengizinkan sistem untuk memulai.
Tetapi penyedia rumah mengizinkan sistem untuk memulai pada Raspberry Pi 3 tanpa masalah.
Dalam hubungannya dengan webcam, dengan VLC untuk
membuat aliran RTSP dari 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
dan VLC di ponsel cerdas untuk dilihat (stream rtsp://10.2.0.1:8554/), ternyata merupakan sistem pengawasan video jarak jauh yang bagus, Anda juga dapat menginstal Samba, merutekan lalu lintas melalui VPN, mengontrol komputer Anda dari jarak jauh dan banyak lagi lagi...
Keluaran
Seperti yang telah ditunjukkan oleh praktik, untuk mengatur server VPN, Anda dapat melakukannya tanpa alamat IP eksternal yang harus Anda bayar, seperti halnya VPS/VDS sewaan. Tapi itu semua tergantung penyedianya. Tentu saja, saya ingin mendapatkan informasi lebih lanjut tentang berbagai penyedia dan jenis NAT yang digunakan, tapi ini baru permulaan...
Terima kasih!
Sumber: www.habr.com