为什么折腾?
接下来的工作需要用到天融信的 VPN 接入,已知客户端会安装根证书、即使卸载也会残留一些进程,清理一向是一件痛苦的事情,那么把这种软件封装起来放到虚拟化的平台上,就显得非常合理。
踩过的坑
路由器上的 docker
因为目前使用的网关路由是 Openwrt
软路由,安装一个 docker
跑在路由器上似乎是一个非常合理的选择,但是最后没能完成。原因说起来挺搞笑的,装完 docker
没重启,结果网络接口没应用不知道,导致容器内没有接口可用,启动不了。这个等有空了再试试。
Windows 上的 docker
有一说一,以前没怎么用过 docker
,不知道原来 docker 的官方应用有这么难用,这玩意儿的启动速度,实在是慢的令人发指,一度出现了十分钟没打开的盛况(),于是逐渐抛弃这个想法。
一个想法的萌芽
Windows 版本 docker 的 backend 默认是基于 wsl 的,既然我本身就在用 wsl2,为啥不直接用它呢?但是,似乎维护起来也不是特别的好用,这会儿就想起来了以前隔离一些流氓软件用的 hyper-v
虚拟机了。这个东西好用啊,性能损失小,跟 Windows 集成度高。
然而又一个弯路
听同门描述,尝试了docker 底包轻量化 linux 发行版——Alpine,下载的时候看到大小 19xxxx... 感叹一下这也不小啊,真下载加上单位的时候愣住了,不是 1900+MB,是 190+MB!简单安装之后,噩梦开始了,这玩意儿为了轻量化,好多包和命令并不是完整版,本来就更容易遇到问题,在遇到问题时的调试也变得困难,最终还是换回 Ubuntu Server
。在换的时候,突然意识到,已经是虚拟机了,为什么还要套一层 docker
呢?直接用不就好了,于是乎终于走上了正途。
正片
一点前置知识
VPN 客户端普遍是添加一个虚拟网卡设备,接管系统上的所有流量,再在客户端内进行加密、封装,然后发送。如果要让另一台设备使用这个连接,直接 NAT 当然也是可选的,但代价未免太大了点...于是就有这个从 dockerfile
里借鉴的方法,使用 danted
开出一个 socks
服务器,然后再把这些连接通过虚拟接口发出去。
各种依赖
去官网下 TopSAP
的 deb
二进制包,只能说不愧是最出名的发行版,连安装包都显然经过验证(没有同门在其他发行版遇到过的问题)。直接 dpkg -i
解决,手动确认一切正常。然后就是 danted
以及 expect
(用于自动化认证登录)
expect 脚本
从 docker file
抄的,因为不像 docker
会存储创建时的参数配置,就直接用环境变量存了,所以对 expect
脚本做了一点更改,$env(xxx)
就是读环境变量了。
spawn /opt/TopSAP/topvpn login
expect "Input your server address"
send "$env(SERVER_ADDRESS)\n"
expect "Choose the Login_mode:"
send "1\n"
expect "Please enter user and password"
send "$env(USER_NAME)\n"
expect "Password:"
send "$env(PASSWORD)\n"
expect eof
danted 配置
默认配置文件路径是 /etc/danted.conf
,由于跑在虚拟机,只有连接要用的服务才会挂上 socks
,所以 danted
的配置并不需要基于 cidr
的分流,直接 0.0.0.0/0
,然后 external
写虚拟接口,因为要从宿主机访问,监听绑定的ip也设为了 0.0.0.0
,设置好端口就完成了, 直接运行 danted
,没问题就退出然后用 service
启动就好。
hyper-v 虚拟机固定ip
hyper-v
的虚拟机有一个不太方便的特性,每次重启虚拟机都会导致 ip 的变化,而作为需要写入 ssh config
的配置,肯定不希望经常去修改,这就需要想办法固定虚拟机的 ip。不过这个很简单,只需要在 hpyer-v管理器
中新建一个虚拟交换机,选择内部,然后在网络适配器的管理界面中找到新的虚拟网卡,改一个固定的ip,宿主机就成为了一个网关。由于要保留虚拟机的联网能力,我这里直接添加了第二张网卡给它,也就是挂在新的内部虚拟交换机上的接口。然后在虚拟机中编辑 /etc/netplan/xxx.yaml
,给这张新网卡一个固定 ip(跟宿主机上那个同一个网段,添加只在这个网段的路由规则,不然会影响原来那张网卡导致没网)
network:
ethernets:
eth0:
dhcp4: true
eth1:
dhcp4: false
addresses:
- 10.0.1.2/24
routes:
- to: 10.0.1.0/24
via: 10.0.1.1
version: 2
像我这个配置,就可以在宿主机上直接使用 10.0.1.2
访问虚拟机了,并且不用担心 ip 变化的问题。
ssh 挂代理
这个不是什么新鲜的东西,但是还是踩了一些坑,尤其是我本意是使用 vscode
来进行。这主要是因为过代理需要 netcat
,即 nc
命令,这在很多 Linux
发行版中是自带的,但是 Windows
并没有,需要手动去安装,考虑到以后可能会用,我直接装了整个 nmap
,在 ssh config
对这个服务器加了一条 ProxyCommand ncat -x 10.0.1.2:1080 %h %p
,到这一步,使用 cmd
已经可以正常访问了。但是,不出意外的话,就又要出意外了,vscode
用不了,总是提示试图写入的管道不存在。一番搜索后发现是 nmap
的版本问题,新版本不能用,虽然我也并不清楚更深层次的原因,好在换到 7.7.0
版本后,一切恢复正常。
总结
至此,踩坑基本上完成,还有关于虚拟机开机启动服务,还有一些小问题没有解决,但现在这样也能用,以后一定修复,先这样吧。
噂嘟假嘟,让我通过!