Chạy máy chủ VPN đằng sau NAT của nhà cung cấp

Một bài viết về cách tôi quản lý để chạy máy chủ VPN đằng sau NAT của nhà cung cấp dịch vụ gia đình của tôi (không có địa chỉ IP màu trắng). Cho tôi đặt chỗ ngay nhé: đó hiệu suất của việc triển khai này trực tiếp phụ thuộc vào loại NAT được nhà cung cấp của bạn sử dụng cũng như bộ định tuyến.
Vì vậy, tôi cần kết nối từ điện thoại thông minh Android với máy tính ở nhà, cả hai thiết bị đều được kết nối với Internet thông qua NAT của nhà cung cấp, cộng với máy tính được kết nối thông qua bộ định tuyến gia đình, cũng là kết nối NAT.
Kế hoạch cổ điển sử dụng VPS/VDS thuê có địa chỉ IP màu trắng cũng như thuê địa chỉ IP trắng từ nhà cung cấp đã không được xem xét vì một số lý do.
Tính kinh nghiệm từ các bài viết trước, đã tiến hành một số thử nghiệm với STUN và NAT của các nhà cung cấp. Tôi quyết định thực hiện một thử nghiệm nhỏ bằng cách chạy lệnh trên bộ định tuyến gia đình chạy chương trình cơ sở OpenWRT:

$ stun stun.sipnet.ru

có kết quả:

Máy khách STUN phiên bản 0.97
Chính: Ánh xạ độc lập, Bộ lọc độc lập, cổng ngẫu nhiên, sẽ kẹp tóc
Giá trị trả về là 0x000002

Bản dịch theo nghĩa đen:
Bản đồ độc lập - bản đồ độc lập
Bộ Lọc Độc Lập - bộ lọc độc lập
cổng ngẫu nhiên - cổng ngẫu nhiên
sẽ kẹp tóc - sẽ có một chiếc kẹp tóc
Chạy một lệnh tương tự trên PC của tôi, tôi nhận được:

Máy khách STUN phiên bản 0.97
Chính: Ánh xạ độc lập, Bộ lọc phụ thuộc cổng, cổng ngẫu nhiên, sẽ kẹp tóc
Giá trị trả về là 0x000006

Bộ lọc phụ thuộc cổng - bộ lọc phụ thuộc cổng
Sự khác biệt trong kết quả đầu ra lệnh cho thấy rằng bộ định tuyến gia đình đang "đóng góp" vào quá trình truyền các gói từ Internet, điều này được thể hiện ở chỗ khi thực hiện lệnh trên máy tính:

stun stun.sipnet.ru -p 11111 -v

Tôi đã nhận được kết quả:

...
Địa chỉ được ánh xạ = XX.1XX.1X4.2XX:4398
...

tại thời điểm này, phiên UDP đã được mở trong một thời gian, nếu tại thời điểm này bạn gửi yêu cầu UDP (ví dụ: netcat XX.1XX.1X4.2XX 4398 -u), thì yêu cầu sẽ đến bộ định tuyến gia đình, đó là được xác nhận bởi TCPDump đang chạy trên nó, nhưng yêu cầu không đến được máy tính - IPtables, với tư cách là trình dịch NAT trên bộ định tuyến, đã loại bỏ yêu cầu đó.
Chạy máy chủ VPN đằng sau NAT của nhà cung cấp
Nhưng thực tế là yêu cầu UDP được chuyển qua NAT của nhà cung cấp đã mang lại hy vọng thành công. Vì bộ định tuyến nằm trong phạm vi quyền hạn của tôi nên tôi đã giải quyết vấn đề bằng cách chuyển hướng cổng UDP/11111 sang máy tính:

iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX

Do đó, tôi có thể bắt đầu phiên UDP và nhận yêu cầu từ Internet từ bất kỳ địa chỉ IP nào. Tại thời điểm này, tôi đã khởi chạy OpenVPN-server (đã định cấu hình trước đó) nghe cổng UDP/11111, chỉ ra địa chỉ IP và cổng bên ngoài (XX.1XX.1X4.2XX:4398) trên điện thoại thông minh và kết nối thành công từ điện thoại thông minh với máy tính. Nhưng trong quá trình triển khai này, một vấn đề đã nảy sinh: cần phải bằng cách nào đó duy trì phiên UDP cho đến khi máy khách OpenVPN kết nối với máy chủ; Tôi không thích tùy chọn khởi chạy định kỳ máy khách STUN - Tôi không muốn lãng phí tải vào các máy chủ STUN.
Tôi cũng nhận thấy mục “sẽ kẹp tóc - sẽ có một chiếc kẹp tóc", chế độ này

Hairpinning cho phép một máy trên mạng cục bộ phía sau NAT truy cập vào một máy khác trên cùng mạng tại địa chỉ bên ngoài của bộ định tuyến.

Chạy máy chủ VPN đằng sau NAT của nhà cung cấp
Kết quả là tôi đã giải quyết được vấn đề duy trì phiên UDP một cách đơn giản - tôi đã khởi chạy ứng dụng khách trên cùng một máy tính với máy chủ.
Nó hoạt động như thế này:

  • khởi chạy ứng dụng khách STUN trên cổng cục bộ 11111
  • đã nhận được phản hồi có địa chỉ IP bên ngoài và cổng XX.1XX.1X4.2XX:4398
  • đã gửi dữ liệu có địa chỉ IP bên ngoài và cổng tới email (có thể sử dụng bất kỳ dịch vụ nào khác) được định cấu hình trên điện thoại thông minh
  • đã khởi chạy máy chủ OpenVPN trên máy tính nghe cổng UDP/11111
  • đã khởi chạy ứng dụng khách OpenVPN trên máy tính chỉ định XX.1XX.1X4.2XX:4398 để kết nối
  • bất cứ lúc nào khởi chạy ứng dụng khách OpenVPN trên điện thoại thông minh cho biết địa chỉ IP và cổng (trong trường hợp của tôi, địa chỉ IP không thay đổi) để kết nối

Chạy máy chủ VPN đằng sau NAT của nhà cung cấp
Bằng cách này, tôi có thể kết nối với máy tính từ điện thoại thông minh của mình. Việc triển khai này cho phép bạn kết nối bất kỳ máy khách OpenVPN nào.

Tập luyện

Bạn sẽ cần:

# apt install openvpn stun-client sendemail

Sau khi viết một vài tập lệnh, một vài tệp cấu hình và tạo các chứng chỉ cần thiết (vì ứng dụng khách trên điện thoại thông minh chỉ hoạt động với các chứng chỉ), chúng tôi đã có cách triển khai máy chủ OpenVPN thông thường.

Kịch bản chính trên máy tính

# 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 gửi dữ liệu qua 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"

Tập tin cấu hình máy chủ:

# 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

Tệp cấu hình máy khách:

# 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

Chứng chỉ được tạo bằng cách sử dụng bài viết này.
Chạy tập lệnh:

# ./vpn11.sh

Bằng cách đầu tiên làm cho nó có thể thực thi được

# chmod +x vpn11.sh

Về phía điện thoại thông minh

Bằng cách cài đặt ứng dụng OpenVPN cho Android, sau khi sao chép tệp cấu hình, chứng chỉ và định cấu hình nó, nó thành ra như thế này:
Tôi kiểm tra email trên điện thoại thông minh của mìnhChạy máy chủ VPN đằng sau NAT của nhà cung cấp
Tôi chỉnh sửa số cổng trong cài đặtChạy máy chủ VPN đằng sau NAT của nhà cung cấp
Tôi khởi chạy ứng dụng khách và kết nốiChạy máy chủ VPN đằng sau NAT của nhà cung cấp

Trong khi viết bài này, tôi đã chuyển cấu hình từ máy tính của mình sang Raspberry Pi 3 và cố gắng chạy toàn bộ trên modem LTE, nhưng nó không hoạt động! Kết quả lệnh

# stun stun.ekiga.net -p 11111

Máy khách STUN phiên bản 0.97
Chính: Ánh xạ độc lập, Bộ lọc phụ thuộc cổng, cổng ngẫu nhiên, sẽ kẹp tóc
Giá trị trả về là 0x000006

giá trị Bộ lọc phụ thuộc vào cổng không cho phép hệ thống khởi động.
Nhưng nhà cung cấp dịch vụ gia đình đã cho phép hệ thống khởi động trên Raspberry Pi 3 mà không gặp vấn đề gì.
Kết hợp với webcam, với VLC cho
tạo luồng RTSP từ 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

và VLC trên điện thoại thông minh để xem (stream rtsp://10.2.0.1:8554/), hóa ra đây là một hệ thống giám sát video từ xa tốt, bạn cũng có thể cài đặt Samba, định tuyến lưu lượng truy cập qua VPN, điều khiển máy tính của bạn từ xa và hơn thế nữa hơn...

Đầu ra

Như thực tế đã chỉ ra, để tổ chức một máy chủ VPN, bạn có thể thực hiện mà không cần địa chỉ IP bên ngoài mà bạn cần phải trả tiền, giống như đối với VPS/VDS thuê. Nhưng tất cả phụ thuộc vào nhà cung cấp. Tất nhiên, tôi muốn biết thêm thông tin về các nhà cung cấp và loại NAT khác nhau được sử dụng, nhưng đây mới chỉ là khởi đầu...
Cảm ơn bạn!

Nguồn: www.habr.com

Thêm một lời nhận xét