AnyLink 是一款 SSL VPN 软件,它可以兼容 AnyConnect 以满足对企业内网的接入。另外你也可以像 x-ui 那样分配用户组以及规则,总之在 Clash 纷纷删库后使用三层VPN当梯子确实是个退而求其次的方案。本文以CentOS 7为例,简单介绍 AnyLink 的部署及使用技巧。
准备工作
- CentOS 7 服务器(AnyLink 服务端仅在 CentOS 7、CentOS 8、Ubuntu 18.04、Ubuntu 20.04 测试通过,因此奶昔选择 CentOS 7)
- 获取 anylink-deploy.tar.gz 并上传至服务器
- 获取域名证书(腾讯云、阿里云都可以免费签一年)
确认好网络环境
AnyLink 的 link_mode 参数有 tun、macvtap和tap模式。**当然作者不推荐使用tap模式,实际测试下性能确实会大幅衰减。**区别tun和macvtap这俩模式主要取决于环境,这边简单描述下就懂了。
tun模式
一般是云服务器使用,你可以理解成 NAT 了一层。(VMware中的NAT模式)
即VPN客户端能访问服务器内网,但服务器内网不能访问VPN客户端,就像在公司网络中放了一台路由器,VPN客户端则是这台二级路由下的一个主机。被代理的IP段叫做安全路由(router),不被代理的IP段叫做非安全路由(norouter)。
为了方便演示我购买了一台云服务器,按 AnyLink 默认配置 192.168.90.0/24 (与服务器内网不同段)为例VPN客户端分配的IP为 192.168.90.100-200,其网卡为 eth0 并出于 172.24.135.36/20 这个VPC中。
VPN客户端连接的地址会以 /conf/server.toml 中所设定的内网(默认为 192.168.90.0/24)进行分配并作为安全路由,例如要访问服务器的VPC网络,在部署完成后需在面板添加 172.24.135.0/20 为安全路由。
macvtap模式
与 tun 模式不同的是,macvtap 模式少了一层NAT,直接接在服务器内网上(VMware中的桥接模式)
VPN客户端在连上后分配的是服务器内网同段的地址,相当于是直接连接物理网络。因此 /conf/server.toml 中的网络参数需与服务器网卡一致,区别在于IP分配范围以避免IP冲突问题。
如何给VPN客户端发公网IP
扯个题外话,例如我有宿迁移动 221.131.165.129/25 所有IP地址的使用权,但除业务外只有 200 - 254 属于空闲IP。那么使用macvtap模式设置的VPN客户端分配的IP地址池应为:
#客户端分配的ip地址池
ipv4_master = "eth0"
ipv4_cidr = "221.131.165.129/25"
ipv4_gateway = "221.131.165.129"
ipv4_start = "221.131.165.200"
ipv4_end = "221.131.165.254"
当连接成功后,服务器将会分配 221.131.165.200-254 (按顺序或管理面板固定IP)给VPN客户端。若内网环境为公网,则可以做到发公网IP的目的。
服务器设置
安全组又叫防火墙,云厂商默认开启的东西。AnyLink需要开放443和8800,分别用于连接和管理面板,有安全考虑的同学可以自行放行,一般我简单粗暴设置全放行。
安全组开放后,要关闭系统中的 selinux 和防火墙
如果你是本地机房也需要开放一个公网IP地址+端口供客户端远程连接,并且关闭selinux和firewalld
-
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭selinux(重启后生效) setenforce 0 # 临时关闭selinux(不需要重启,立即生效)
-
关闭firewalld
systemctl stop firewalld # 临时关闭防火墙 systemctl disable firewalld # 永久关闭防火墙
部署 AnyLink
安装和配置
-
下载anylink,点击获取 anylink-deploy.tar.gz ,然后上传到服务器
-
SSH连接到,解压二进制包到/usr/local目录
tar -xzvf anylink-deploy.tar.gz -C /usr/local/
-
进入anylink目录
cd /usr/local/anylink-deploy
-
生成密码
password
的密文,请修改为你自己要设置的密码注意密码不能有
$
符号,会被当成变量,也可以用单引号包起来./anylink tool -p password
记录下 Passwd: 后的密钥,等会改配置文件要用
-
生成jwt密钥
./anylink tool -s
记录下 Secret: 后的密钥,等会改配置文件要用
修改 server.toml 文件
打开 https://github.com/bjdgyc/anylink/blob/main/server/conf/server-sample.toml 下载配置模板,然后重命名为 server.toml,开始修改配置文件:
#系统名称
issuer = "XX公司VPN"
#后台管理用户
admin_user = "admin"
#pass 123456
admin_pass = "$2a$10$UQ7C.EoPifDeJh6d8.31TeSPQU7hM/NOM2nixmBucJpAuXDQNqNke"
# 留空表示不开启 otp, 开启otp后密码为 pass + 6位otp
# 生成 ./anylink tool -o
admin_otp = ""
jwt_secret = "abcdef.0123456789.abcdef"
系统名称在等会会用到,可以带空格。另外建议把后台用户名 admin_user 改掉,使用 admin 可能会存在风险。然后将上一步, Passwd: 后和 Secret: 后的密钥依次替换admin_pass和jwt_secret对应引号的内容。
往下有个 link_mode ,若为NAT模式则保持tun即可,想桥接到内网中请改为macvtap。将 ipv4_master 的 eth0 设置为服务器网卡,使用 ip addr 指令就能看到,一般不是eth0就是ens192。
接下来找到发布默认域,改成你的域名。例如 vpn.itxe.net (与后面的证书保持一致),这个等下改下发配置文件也会用到,与系统名称一样要记住。
# 要发布的默认域
default_domain = " vpn.itxe.net"
最后是启用压缩功能,这个吃CPU算力。默认配置文件中不开,但正常的服务器开了反而节流也不会影响到速度,能相对的提升小包的转发性能。
修改 profile.xml 文件
从这个文件的23行开始看:
<BackupServerList>
<HostAddress>localhost</HostAddress>
</BackupServerList>
</ClientInitialization>
<ServerList>
<HostEntry>
<HostName>VPN Server</HostName>
<HostAddress>localhost</HostAddress>
</HostEntry>
</ServerList>
我们需要修改两个 HostAddress 为上面的发布默认域,另外我司sslvpn使用的是443端口,则写作
<HostAddress>vpn.itxe.net:443</HostAddress>
另外将 HostName 改为刚刚写的名称:
<HostName>XX公司VPN</HostName>
当VPN客户端首次连接后,AnyLink服务器会向客户端下发该配置文件,以确保下次连接时可以直接在列表中选择该服务器~~,如你有多个sslvpn服务器请用 xx公司VPN - xxx 来区别,并将 中放入其他服务器。~~
传SSL证书
选择签发证书的nginx格式,会得到fullchaim.pem和private.key俩文件。fullchaim.pem重命名为vpn_cert.crt,private.key重命名为vpn_cert.key并上传至 /usr/local/anylink-deploy/conf 中。这个证书可以考虑配置好后吊销,因为AnyLink内置了 Let’s Encrypt 证书且定时更新。
启动前需要设置的内容
tun
-
开启服务器ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
-
立即生效
sysctl -p
-
设置nat,请替换网卡名称为前面查看的内网网卡名称,另外,如果server.toml文件里面客户端的IP地址池不是默认的192.168.90.0/24,也请修改为对应的IP地址池
iptables -t nat -A POSTROUTING -s 192.168.90.0/24 -o eth0 -j MASQUERADE
- 查看设置是否生效
iptables -nL -t nat
若显示上面配的规则,则ipv4转发生效
- 安装iptables-services,用于保存iptables配置,永久生效
yum install -y iptables-services
- 设置开机自启
systemctl enable iptables.service
- 保存当前iptables设置
service iptables save
若提示 iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ] 则说明配置成功
macvtap
若选择桥接模式,请在 server.toml 中禁用NAT
#是否自动添加nat
iptables_nat = false
创建日志文件目录
请修改为自己配置的日志路径,不创建会启动失败,如果没有打开日志输出,可以跳过
mkdir /usr/local/anylink-deploy/log
启动 AnyLink
-
复制service文件到系统中
cp /usr/local/anylink-deploy/systemd/anylink.service /usr/lib/systemd/system/
-
启动anylink
systemctl start anylink systemctl enable anylink
-
查看启动状态
systemctl status anylink
看到绿色的 Active: active (running) 则说明AnyLink启动成功。
配置管理面板
访问地址公网IP+端口(默认8800),输入账号(admin)和 密码(password)点击登录
http://vpn.itxe.net:8800
自定义 SSL VPN
选择 其他设置 - VPN 对外地址,修改为配置文件中写的默认域
修改 Banner 信息及自定义首页,Banner信息将会在登录成功后在客户端显示
配置自动更新证书
选择 其他设置 - 证书设置 - Let’s Encrypt证书,按照api填写就好了。这样就不用担心证书过期而报信任错误,每3个月将会自动续期一次。
企业配置项
如果你想搞统一认证账号,我推荐你搭个WinRadius(搞AD域再弄,或是freeredius指令我想对于小白是并不友好的),然后交给 Radius 服务器来认证
WinRadius下载: https://www.123pan.com/s/WekeVv-SKSY3.html
由于该软件并不支持第三方登录的OTP,在此我配置了公司的LDAP:
另外默认是sqlite3存储数据库,可能较为简单的是mysql数据库对接?但我还没尝试过,还请其他dalao研究以后在底下评论区告知。
客户端指引下载
访问 https://devops-100tal.oss-cn-beijing.aliyuncs.com/vpnuserguide/vpnuserguide.htm 里面教程写的清清楚楚,这里就不多赘述可以自己慢慢看
Windows 客户端
win10 ARM64(Surface pro X/Raspberry Pi) 版
macOS 客户端
mac 客户端(10.11 以上/ 支持OS 11 Big Sur 版)
mac 客户端(Maverick 10.9 版/Yosemite 10.10 版)
注:更新客户端版本时,先按照如下方法卸载掉老客户端后再安装,不要直接把程序仍到回收站,否则会出现无法安装的情况
打开桌面“访达 ”,选择左边的 “应用程序 ”,找到 “Cisco”文件夹下的 “Uninstall Anyconnect”,双击卸载时输入电脑的开机密码即可完成卸载
Android
Android用户
https://play.google.com/store/apps/details?id=com.cisco.anyconnect.vpn.android.avf&hl=zh
iOS
登录 app store,搜索“cisco anyconnect”,下载安装 VPN客户端
https://apps.apple.com/cn/app/cisco-secure-client/id1135064690