最后更新于2023年3月24日 09:36:40
v*n不等于翻墙!
v*n不等于翻墙!
v*n不等于翻墙!
项目背景和概念定义
机器人使用5g模块(跟个路由器似的,能插一张5g电话卡,可以理解为手机开移动数据)上网;
5g卡是定向卡,定死了只能访问某个外网ip,这里设定是只能访问我们的云服务器;
阿里云服务器,下面简称CLD,因为这里跟v*n服务器很容易混淆;
v*n服务器,是一个托管在docker上的,负责提供ipsec-PSK,用户名,密码来让客户端连接到它;这里的客户端就是小车、红绿灯啥的。
要解决的问题
类似于我能上百度,但是百度上不了我:我就想让CLD主动访问小车,但是由于上面提到的限制,CLD是找不到小车的ip的。
大体思路
在CLD上使用hwdsl2/ipsec-vpn-server,创建基于docker容器的v*n服务器,再将机器人和云服务器设成客户端;
第一步:确定做v*n服务器的开源库
选择hwdsl2/ipsec-vpn-server
做v*n服务器。
第二步:加深协议了解
经过多方拉扯,学到了一点姿势:
L当我们提到L2TP的时候,一定要分清,是L2TPv2,还是L2TP over ipsec,还是L2TPv3。
1、v3在商用上很少,暂不做考虑;
2、L2TPv2在很多语境下(尤其是跟深谙此道的5g模块供应商交流的情况下)也被简称为L2TP,是最普通的vn协议,如果发现连接这个L2TP的vn时,没地方填写ipsec pre-shared key,那八成是这种;
3、ipsec和L2TP一样,都是vn协议,L2TP over ipsec相当于在L2TP的基础上多包装了一层ipsec,相当于两层vn,对信息进行了加密,此时就需要用到ipsec pre-shared key(PSK)进行额外验证。
第三步:修改v*n服务器源码 & 编译docker镜像
机器人使用的5g模块仅支持L2TP协议(不使用ipsec的这种),但是hwdsl2/ipsec-vpn-server
这个库考虑到安全性,是默认不支持L2TP-without-ipsec的,因此我们要对源码做些修改,请完全参考该github-issue,从源码开始编译docker镜像:l2tp without IPSec
总结一下是:
# 在docker-ipsec-vpn-server/run.sh里面,删除这两句
$ipi 1 -p udp --dport 1701 -m policy --dir in --pol none -j DROP
$ipi 6 -p udp --dport 1701 -j DROP
# 在docker-ipsec-vpn-server/Dockerfile.debian里面,暴露1701端口
EXPOSE 500/udp 4500/udp 1701/udp
里面有个小坑是:在docker build
一个debian-based的镜像时,应该修改源码中的Dockerfile.debian
这个文件,而不是Dockerfile
。
编译语句是:
docker build -f Dockerfile.debian -t ${image-tag-name}:${image-tag-version} .
第四步:根据docker镜像创建容器
这是我编译好的镜像:
不使用ipsec的情况下,是不支持--network=host
这种网络模式的,不然我就不用把CLD设置成客户端了。
创建vpn.env文件,在里面设置PSK,用户名,密码,路径问题可以参考github上的内容:
VPN_IPSEC_PSK=${32位以下随便填一个字符串}
VPN_USER=${yonghuming}
VPN_PASSWORD=${mima}
运行容器的命令是:sudo docker run -d --privileged -p 1701:1701/udp -p 500:500/udp -p 4500:4500/udp --name vpn-container --restart=always --env-file ./vpn.env -v /lib/modules:/lib/modules:ro l2tp-no-ipsec
注意要把500, 1701, 4500端口全部打开,不要被防火墙拦截了。
完成后,用sudo docker logs vpn-container
可以看到PSK,用户名,密码,拿这三个就可以在客户端登录力!不建议windows和linux登录,因为还要做额外配置;手机登录时建议使用高贵的华为或者荣耀,因为小米跟红米不支持L2TP,蒸虾头。
第五步:额外步骤,将CLD配置为客户端
这一步是因为,在默认的bridge模式下,从CLD无法直接ping到小车:
vn服务器的网络如图:
~~这里的ppp1 interface就是一个点到点的vn,可以把192.168.42.11看作是机器人的ip,而因为netmask是32,所以再怎么设置路由,从CLD也是没办法ping通机器人的。~~
将CLD设置为客户端,请参考:https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md
添加路由规则:route add -net 192.168.42.0 netmask 255.255.255.0 gw 192.168.42.1
最新更新:上述方法广义上可行,但是狭义上,不适合我们使用的5g模块,因此直接把机器人配成v*n客户端
DONE
以下内容均已废弃,用这个路由转发的方式转了半天搞不出来
阿里云主机通过Docker安装L2TP
按照这个来,但是创建容器的地方改一下。
在做l2tp 服务器映射,用桥接的方式把容器内部的客户端ip映射出来
sudo docker run --name l2tp-vpn-server --env-file ./vpn.env --net=host --restart=always -p 500:500/udp -p 4500:4500/udp -d --privileged hwdsl2/ipsec-vpn-server
创建容器的时候用这个来建。
如果需要不通过ipsec的l2tp,可以参考这个issue:https://github.com/hwdsl2/docker-ipsec-vpn-server/issues/191