关于我如何设法在位于NAT提供程序后面的两台计算机之间组织直接VPN隧道的
文章的继续。 上一篇文章介绍了使用第三方(中介(租用的VPS充当STUN服务器和用于连接的节点数据的发送者))来组织连接的过程。 在本文中,我将告诉您如何在不使用VPS的情况下进行操作,但是中介仍然存在,它们是STUN服务器和Yandex.Disk ...

引言
阅读上一篇文章的评论后,我意识到该实现的主要缺点是使用中介-第三方(VPS),该中介指示节点的当前参数,连接的位置和方式。 根据使用此STUN的建议(有
很多建议 )来确定当前的连接参数。 首先,我决定在STUN服务器与客户端一起使用并且接收到完全不可读的内容时,使用TCPDump查看数据包的内容。 仔细搜索该协议,发现
一篇描述该协议的
文章 。 我意识到我自己无法实现对STUN服务器的请求,并将其放入“远方”。
理论
我最近不得不通过软件包在Debian上安装STUN服务器
在依赖项中,我看到了stun-client程序包,但不知何故对此没有任何重视。 但是后来,我想起了stun-client软件包,并决定通过谷歌搜索和收到的Poindeksiv弄清楚它是如何工作的:
作为回应,我收到了:
STUN客户端版本0.97
使用fd 3打开端口21234
使用FD 4打开端口21235
编码眩晕消息:
编码ChangeRequest:0
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
收到的眩晕消息:92个字节
MappedAddress = <我的IP>:2885
源地址= 216.93.246.18//478
ChangedAddress = 216.93.246.17lla479
未知属性:32800
ServerName = Vovida.org 0.98-CPC
收到的257 id = 1类型的消息
编码眩晕消息:
编码ChangeRequest:0
即将发送len 28的消息到216.93.246.17lla478
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:0
即将len 28的消息发送到<我的IP>:2885
收到的眩晕消息:28个字节
ChangeRequest = 0
收到的类型1 id = 11的消息
编码眩晕消息:
编码ChangeRequest:0
即将发送len 28的消息到216.93.246.17lla478
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
收到的眩晕消息:92个字节
MappedAddress = <我的IP>:2885
SourceAddress = 216.93.246.17lla479
ChangedAddress = 216.93.246.18 {478
未知属性:32800
ServerName = Vovida.org 0.98-CPC
收到的257 id = 10类型的消息
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码变更请求:4
即将发送len 28的消息到216.93.246.18 opin478
编码眩晕消息:
编码ChangeRequest:2
即将发送len 28的消息到216.93.246.18 opin478
测试I = 1
测试II = 0
测试III = 0
测试I(2)= 1
是nat = 1
映射IP相同= 1
发夹= 1
保留端口= 0
主:独立映射,端口依赖过滤器,随机端口,将发夹
返回值为0x000006
带值的字符串
MappedAddress = <我的IP>:2885
正是您所需要的! 它在本地UDP端口21234上显示了连接的当前状态。但这仅是成功的一半,出现了如何将数据传输到远程主机并建立VPN连接的问题。 使用邮件协议,也许是电报? 有很多选择,因此我决定使用Yandex.Disk,因为我遇到
了一篇有关如何使用Yandex.Disk通过WebDav进行Curl工作的文章 。 在考虑了实现之后,我来到了这个方案:
- 通过在Yandex.disk上带有时间戳的特定文件来发出信号,表明节点已准备好建立连接;
- 如果节点准备就绪,则从STUN服务器获取当前参数;
- 将当前参数上传到Yandex.Disk;
- 检查可用性并从Yandex.Disk上的文件读取远程站点的参数;
- 使用OpenVPN建立与远程主机的连接。
练习
经过一番思考,考虑到上一篇文章的经验,我编写了一个快速脚本。 我们将需要:
实际上脚本本身:
初始选项
要运行脚本,您需要:
- 复制到剪贴板并粘贴到编辑器中,例如:
- 从Yandex.Disk指定用户名和密码。
- 在字段“ --ifconfig 10.45.54。(1或2)255.255.255.252”中,指定接口的内部IP地址
- 使用以下命令创建secret.key :
- 使脚本可执行:
- 运行脚本:
其中nZbVGBuX5dtturD是此处生成的连接ID
在远程节点上,除生成secret.key和ID连接外,请执行相同的操作,它们必须相同。
更新版本(为了正确操作,应该同步时间):
cat vpn10.sh
要运行脚本,您需要:
- 复制到剪贴板并粘贴到编辑器中,例如:
- 从Yandex.Disk指定登录名(第二行)和密码(第三行)。
- 指定隧道的内部IP地址(第4行)。
- 使脚本可执行:
- 运行脚本:
其中nZbVGBuX5dtturD是此处生成的连接ID
在远程节点上,执行相同的操作,指定隧道的相应内部IP地址和ID连接。
要在启动时启动脚本,我使用文件/etc/rc.local中包含的命令“ nohup / <脚本路径> /vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2> / dev / null&”
结论
该脚本可以正常工作,并已在Ubuntu 18.04和Debian 9上进行了测试。您可以将任何其他服务用作传输器,但出于经验,我使用了Yandex.Disk。
在实验过程中,发现某些类型的NAT提供程序不允许进行连接。 通常是在种子被阻止的移动运营商那里。
我计划在以下方面完成:
- 每次启动时都会自动生成secret.key,将其加密并复制到Yandex.Disk以传输到远程主机(在更新版本中已记入帐户)
- 自动分配接口IP地址
- 数据加密,然后再上传到Yandex.Disk
- 代码优化
可能每个家庭都有IPv6!