天融信TopSAP客户端折腾

杂七杂八的小寄巧

为什么折腾?

接下来的工作需要用到天融信的 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 服务器,然后再把这些连接通过虚拟接口发出去。

各种依赖

去官网下 TopSAPdeb 二进制包,只能说不愧是最出名的发行版,连安装包都显然经过验证(没有同门在其他发行版遇到过的问题)。直接 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 版本后,一切恢复正常。

总结

至此,踩坑基本上完成,还有关于虚拟机开机启动服务,还有一些小问题没有解决,但现在这样也能用,以后一定修复,先这样吧。

1 thought on “天融信TopSAP客户端折腾”

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据