在提供商NAT后面启动VPN服务器

本文是关于我如何在家庭提供者的NAT(无白色IP地址)后面启动VPN服务器的方法。 我将立即进行预订: 此实施性能直接取决于您的提供商以及路由器使用的NAT类型
因此,我需要从我的Android智能手机连接到我的家用计算机,两个设备都通过提供商NAT连接到Internet,再加上计算机通过还具有NAT连接的家用路由器连接。
出于多种原因,未考虑使用带有白色IP地址的租用VPS / VDS以及从提供商那里租用白色IP地址的经典方案。
根据以前的文章经验,已经与STUN和NAT提供程序进行了几次实验。 我决定通过在运行OpenWRT固件的家用路由器上运行命令来进行一个小实验:
$ stun stun.sipnet.ru 

得到了结果:
STUN客户端版本0.97
主:独立映射,独立过滤器,随机端口,将发夹
返回值为0x000002

直译:
独立映射-独立映射
独立过滤器-独立过滤器
随机端口-随机端口
将发夹-将有一个发夹
在PC上执行了类似的命令后,我得到了:
STUN客户端版本0.97
主:独立映射,端口依赖过滤器,随机端口,将发夹
返回值为0x000006

端口相关过滤器-端口相关过滤器
命令输出的差异表明家用路由器为从Internet广播数据包的过程做出了贡献,这一事实体现在以下事实:在计算机上执行命令:
 stun stun.sipnet.ru -p 11111 -v 

我得到了结果:
...
MappedAddress = XX.1XX.1X4.2XX:4398
...
此时,UDP会话打开了一段时间,如果在那一刻发送了UDP请求(例如:netcat XX.1XX.1X4.2XX 4398 -u),则该请求到达了本地路由器,并由运行在其上的TCPDump确认,但是该请求未到达计算机-IPtables将其作为NAT转换器放置在路由器上。

但是,UDP请求通过ISP NAT传递的事实给成功带来了希望。 由于路由器在我的管辖范围内,因此我通过将UDP / 11111端口重定向到计算机来解决此问题:
 iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX 
因此,我能够启动UDP会话并从Internet接收来自任何IP地址的请求。 此时,我启动了OpenVPN服务器(配置后),监听UDP / 11111端口,在智能手机上指示了外部IP地址和端口(XX.1XX.1X4.2XX:4398),并成功从智能手机连接到计算机。 但是在此实现中出现了一个问题,有必要以某种方式维护UDP会话,直到OpenVPN客户端连接到服务器为止,我不喜欢定期启动STUN客户端的选项-我不想浪费STUN服务器。
还提请注意条目“ 将发夹-将有一个发夹 ”,此模式
发夹使局域网中的一台机器通过NAT可以在路由器的外部地址访问同一网络上的另一台机器。

图片
结果,维护UDP会话的问题得以简单解决-我在与服务器相同的计算机上启动了客户端。
它像这样工作:
  • 使用本地端口11111启动了STUN客户端
  • 收到带有外部IP地址和端口XX.1XX.1X4.2XX的响应:4398
  • 使用外部IP地址和端口发送数据以发送到智能手机上配置的邮件(可以进行任何其他服务)
  • 在具有UDP / 11111端口侦听的计算机上启动了OpenVPN服务器
  • 在计算机上启动XX.1XX.1X4.2XX:4398的OpenVPN客户端以进行连接
  • 任何时候我都可以使用IP地址和端口(在我的情况下,IP地址没有更改)在智能手机上启动OpenVPN客户端以进行连接


因此,我有机会从智能手机连接到我的计算机。 此实现使您可以连接任何OpenVPN客户端。

练习


您将需要:
 # apt install openvpn stun-client sendemail 

在编写了几个脚本,几个配置文件之后,生成了必要的证书(由于智能手机上的客户端仅使用证书),因此获得了OpenVPN服务器的常规实现。

计算机上的主要脚本


 # 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 

用于将数据发送到邮件的脚本:
 # 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" 

服务器配置文件:
 # 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 

客户端配置文件:
 # 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 

本文上执行了证书生成。
脚本运行:
 # ./vpn11.sh 

以前使其可执行
 # chmod +x vpn11.sh 

在智能手机的侧面


安装适用于AndroidOpenVPN应用程序后,复制配置文件,证书并进行设置,结果如下:
我在智能手机上检查邮件

我在设置中更正了端口号

我启动客户端并连接


在撰写本文的过程中,我将配置从计算机转移到Raspberry Pi 3,并试图在LTE调制解调器上运行整个程序,但是没有用! 团队成绩
 # stun stun.ekiga.net -p 11111 

STUN客户端版本0.97
主:独立映射,端口依赖过滤器,随机端口,将发夹
返回值为0x000006
端口相关过滤器”的值不允许系统启动。
但是家庭提供程序没有任何问题,可以启动Raspberry Pi 3系统。
与网络摄像头一起使用,通过VLC
从网络摄像头创建RTSP流
 $ 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 


和智能手机上的VLC进行查看(rtsp流://10.2.0.1:8554 /),结果证明远距离视频监控系统还不错,您还可以举起Samba并交换文件,通过VPN路由流量,
远程控制电脑
还有更多...

结论


如实践所示,要组织VPN服务器,您无需使用要支付的外部IP地址以及租用的VPS / VDS就可以进行操作。 但这一切都取决于提供者。 当然,我想获得有关各种提供商和所用NAT类型的更多信息,但这只是开始...
感谢您的关注!

Source: https://habr.com/ru/post/zh-CN482888/


All Articles