文章介绍:使用当前最新滚动版vyos-1.5.0部署AnyLink SSLVPN,AnyLink是一个企业级SSLVPN软件,可以支持多人同时在线使用。基于 openconnect 协议开发,并且借鉴了 ocserv 的开发思路,可以完全兼容 AnyConnect 客户端,AnyLink 使用 TLS/DTLS 进行数据加密,因此需要 RSA 或 ECC 证书,可以通过 Let's Encrypt 和 TrustAsia 申请免费的 SSL 证书,AnyLink 服务端支持Centos,Ubuntu,Debian等系统,如需要安装在其他系统,需要服务端支持 tun/tap 功能、ip 设置等命令。
本期将详细介绍不同网络模式的配置方式,包括以下(tun模式:开启iptables_nat、不开启iptables_nat、arp代理;桥接模式:macvtap)。
一、项目来源 {#一-项目来源}
1.1、Gitee-bjdgyc {#1-1-Gitee-bjdgyc}
1.2、GitHub-bjdgyc {#1-2-GitHub-bjdgyc}
二、部署准备 {#二-部署准备}
2.1、vyos镜像 {#2-1-vyos镜像}
vyos-1.5-rolling-202408250024-generic-amd64.iso vyos-1.5-rolling-202408250024-generic-amd64.iso
2.2、anylink服务端 {#2-2-anylink服务端}
anylink-0.12.2-linux-amd64.tar.gz anylink-0.12.2-linux-amd64.tar.gz
2.3、一个域名(可选) {#2-3-一个域名-可选-}
最新版本v0.12.2支持不用域名连接,可以直接用IP+端口模式连接,如果是企业使用建议用域名,并申请安全证书。
Namesilo最便宜的域名一年不到15元(申请后托管cloudflare)
ClouDNS,每个账户提供一个免费的二级域名(申请后托管cloudflare)
2.4、一个公网IP(可选) {#2-4-一个公网IP-可选-}
如果你安装AnyLink只是在内网使用可以没有公网IP,如果你要从公网拨号访问内网,则需要公网IP,如果你的公司出口没有公网IP,你可以选择使用FRP,NPS等内网穿透工具,本期不做介绍。
2.5、VPN客户端 {#2-5-VPN客户端}
2.5.1、Cisco Secure Client {#2-5-1-Cisco-Secure-Client}
下面的链接由博主提供免费Cisco官网的最新客户端软件,和免费开源的OpenConnect客户端下载地址,以及使用指导。
2.5.2、AnyLink Client {#2-5-2-AnyLink-Client}
该软件是GitHub一位项目开发者专门为AnyLink开发的客户端(仅支持Windwos,macOS,Linux)。
2.6、TOTP动态令牌 {#2-6-TOTP动态令牌}
AnyLink SSLVPN支持用户名密码+六位数字动态令牌认证。
2.6.1、安卓动态令牌 {#2-6-1-安卓动态令牌}
Andoid
2.6.2、苹果动态令牌 {#2-6-2-苹果动态令牌}
iOS
2.7、SSH工具 {#2-7-SSH工具}
三、安装VyOS {#三-安装VyOS}
3.1、安装 {#3-1-安装}
如果你不会使用VMware安装vyos系统,请先查看如下教程。
3.2、基础配置 {#3-2-基础配置}
configure
set interfaces ethernet eth0 address '192.168.6.117/24'
set protocols static route 0.0.0.0/0 next-hop 192.168.6.254
set service ntp server ntp1.aliyun.com
set service ssh port '22'
set system host-name 'AnyLink'
set system login banner post-login 'Welcome YYDY-AnyLink-SSLVPN'
set system login user sslvpn authentication encrypted-password anylink
set system name-server '192.168.100.3'
set system name-server '192.168.100.4'
set system time-zone 'Asia/Shanghai'
commit
save
四、安装AnyLink {#四-安装AnyLink}
4.1、进入root模式 {#4-1-进入root模式}
sudo -i
4.2、拉取文件 {#4-2-拉取文件}
sudo wget -P /tmp https://gitee.com/bjdgyc/anylink/releases/download/v0.12.2/anylink-0.12.2-linux-amd64.tar.gz
sudo wget -P /tmp https://github.com/bjdgyc/anylink/releases/download/v0.12.2/anylink-0.12.2-linux-amd64.tar.gz
4.3、解压文件 {#4-3-解压文件}
sudo tar -zxvf /tmp/anylink-0.12.2-linux-amd64.tar.gz
4.4、移动文件 {#4-4-移动文件}
sudo mv anylink-deploy/ /usr/local/
4.5、赋予权限 {#4-5-赋予权限}
sudo chmod +x /usr/local/anylink-deploy/anylink
4.6、复制服务文件 {#4-6-复制服务文件}
sudo cp /usr/local/anylink-deploy/deploy/anylink.service /etc/systemd/system
4.7、赋予权限 {#4-7-赋予权限}
sudo chmod +x /etc/systemd/system/anylink.service
4.8、开机自启 {#4-8-开机自启}
sudo systemctl enable anylink
五、自定义AnyLink {#五-自定义AnyLink}
5.1、进入文件目录 {#5-1-进入文件目录}
sudo cd /usr/local/anylink-deploy
5.2、创建新密码(必改) {#5-2-创建新密码-必改-}
请把你的"Passwd:"后面的都复制到记事本,这就是abc@123加密后的密文,稍后需要用来替换服务端配置文件。
./anylink tool -p abc@123
Passwd:$2a$10$eO7aH3twg6xzsw/oY29ki9Joic8wrsF4ZhufVmGxVkC38h0jtn.dbK
5.3、创建jwt密钥(必改) {#5-3-创建jwt密钥-必改-}
请把你的"Secret:"后面的都复制到记事本,这就是jwt加密后的密文,稍后需要用来替换服务端配置文件。
./anylink tool -s
Secret:sjjP3Me68K-ppXe-au4MppLifqbEgLu19gc1fl7DrZpBcE5donOPCgqer
5.4、创建动态令牌(可选) {#5-4-创建动态令牌-可选-}
如果开启了totp动态令牌认证登录,则登录AnyLink控制台的密码将变成:abc@123+六位数字(中间没有:"+"号)
请把你的"Otp:"后面的都复制到记事本,这就是totp加密后的密文,稍后需要用来替换服务端配置文件。
./anylink tool -o
Otp:35TQE2F2AHYR6B3CKOXZVSZGGKLNLIM5HJ6VDG2TOEVRAGY3SVF5A
六、TUN网络模式,开启NAT {#六-TUN网络模式-开启NAT}
6.1、进入conf目录 {#6-1-进入conf目录}
sudo cd conf/
6.2、拷贝模版 {#6-2-拷贝模版}
sudo cp server-sample.toml server.toml
6.3、编辑server.toml {#6-3-编辑server-toml}
sudo nano server.toml
6.3.1、修改profile_name(建议) {#6-3-1-修改profile-name-建议-}
这个profile_name的用处是当你有多台AnyLink服务器时,可以定义好客户端显示的连接名称,当客户端第一次连接后,会下载一个名为:profile_vpn_tun.xml的配置文件,这个文件可以提前在AnyLink服务端中配置好,请参考拓展部分。
profile_name = "vpn_tun"
6.3.2、开启日志(可选) {#6-3-2-开启日志-可选-}
log_path = "./log"
6.3.3、修改issuer(建议) {#6-3-3-修改issuer-建议-}
issuer = "YYDY-AnyLink-SSLVPN"
6.3.4、修改管理员账户(可选) {#6-3-4-修改管理员账户-可选-}
admin_user = "yydy"
6.3.5、修改密码(必改) {#6-3-5-修改密码-必改-}
把上面5.2步骤的密文复制到双引号里面,把旧的删除。
admin_pass = "$2a$10$UQ7C.EoPifDeJh6d8.31TeSPQU7hM/NOM2nixmBucJpAuXDQNqNke"
6.3.6、修改jwt(必改) {#6-3-6-修改jwt-必改-}
把上面5.3步骤的密文复制到双引号里面,把旧的删除。
jwt_secret = "abcdef.0123456789.abcdef"
6.3.7、开启otp(可选) {#6-3-7-开启otp-可选-}
把上面5.4步骤的密文复制到双引号里面。
admin_otp = ""
6.3.8、修改TCP监听端口(可选) {#6-3-8-修改TCP监听端口-可选-}
server_addr = ":10443"
6.3.9、修改DTLS(可选) {#6-3-9-修改DTLS-可选-}
如果选择:true开启,则dtls端口建议和tcp业务端口一致
#开启 DTLS
server_dtls = true
#UDP监听地址
server_dtls_addr = ":10443"
6.3.10、修改控制台端口(可选) {#6-3-10-修改控制台端口-可选-}
admin_addr = ":8800"
6.3.11、tcp代理协议(可选) {#6-3-11-tcp代理协议-可选-}
保持默认即可,这个功能猜测是为了日志审计用的
proxy_protocol = false
6.3.12、网络模式 {#6-3-12-网络模式}
link_mode = "tun"
6.3.13、客户端虚拟IP(可选) {#6-3-13-客户端虚拟IP-可选-}
默认是192.168.90.0/24,如果和内网冲突请修改,vyos部署时下面的ipv4_master默认就是eth0,如果是linux部署,请使用"ip ad"查看服务器上网网卡名称
ipv4_master = "eth0"
ipv4_cidr = "100.64.64.0/24"
ipv4_gateway = "100.64.64.254"
ipv4_start = "100.64.64.1"
ipv4_end = "100.64.64.253"
6.3.14、客户端接入数(可选) {#6-3-14-客户端接入数-可选-}
max_client = 200
6.3.15、单用户并发数(可选) {#6-3-15-单用户并发数-可选-}
max_user_client = 3
6.3.16、IP租赁时间(可选) {#6-3-16-IP租赁时间-可选-}
ip_lease = 86400
6.3.17、默认用户组(可选) {#6-3-17-默认用户组-可选-}
这个用户组是稍后去控制台自定义的,此处定义客户端拨号默认连接内网LAN
default_group = "LAN"
6.3.18、客户端失效检测时间(可选) {#6-3-18-客户端失效检测时间-可选-}
默认即可,dpd > keepalive
cstp_keepalive = 3
cstp_dpd = 20
mobile_keepalive = 4
mobile_dpd = 60
6.3.19、最大传输单元(可选) {#6-3-19-最大传输单元-可选-}
mtu = 1460
6.3.20、默认搜索域(可选) {#6-3-20-默认搜索域-可选-}
有内网域名时填写内网域名的主域名
default_domain = "yangpin.link"
6.3.21、超时断开时间(可选) {#6-3-21-超时断开时间-可选-}
idle_timeout = 0
6.3.22、会话过期时间(可选) {#6-3-22-会话过期时间-可选-}
session_timeout = 3600
6.3.23、认证超时时间(可选) {#6-3-23-认证超时时间-可选-}
auth_timeout = 0
6.3.24、审计间隔时间(可选) {#6-3-24-审计间隔时间-可选-}
audit_interval = 600
6.3.25、查看数据库(可选) {#6-3-25-查看数据库-可选-}
show_sql = false
6.3.26、添加nat(开启) {#6-3-26-添加nat-开启-}
当选择true时,拨号客户端访问内网时将被nat成192.168.6.117,内网系统看到的访问源是192.168.6.117
iptables_nat = true
configure
set nat source rule 1000 outbound-interface name 'eth0'
set nat source rule 1000 source address '100.64.64.0/24'
set nat source rule 1000 translation address 'masquerade'
save
6.3.27、压缩(可选) {#6-3-27-压缩-可选-}
开启压缩可以节省带宽和加快传输速度,网络延迟大网络带宽小建议开启,但开启会增加服务器的 CPU 负载,因为压缩和解压缩操作需要额外的计算资源。
compression = false
no_compress_limit = 256
6.3.28、客户端显示详细错误信息(可选) {#6-3-28-客户端显示详细错误信息-可选-}
线上环境慎开启。
display_error = false
6.3.29、排除出口ip路由(可选) {#6-3-29-排除出口ip路由-可选-}
默认开启也就是排除,当客户端流量全局走隧道时需要用到这里,如果关闭会导致拨号的IP地址123.123.123.123,除了拨号端口10433能通外,其余端口都不通。
exclude_export_ip = true
6.4、开启服务 {#6-4-开启服务}
sudo systemctl start anylink
6.5、重启服务 {#6-5-重启服务}
sudo systemctl restart anylink
七、TUN网络模式,关闭NAT {#七-TUN网络模式-关闭NAT}
关闭NAT模式,除了iptables_nat 是 false之外,其他配置与上面的模版皆相同。
7.1、网络模式 {#7-1-网络模式}
link_mode = "tun"
7.2、关闭nat(不开启) {#7-2-关闭nat-不开启-}
当选择false时,拨号客户端访问内网时将用虚拟地址100.64.64.150为源IP,此时需要在内网网关设备上添加回程路由
iptables_nat = false
说明:VyOS不开启NAT方式就是下面的命令不配置。
~~set nat source rule 1000 outbound-interface name 'eth0'~~
~~set nat source rule 1000 source address '100.64.64.0/24'~~
~~set nat source rule 1000 translation address 'masquerade'~~
7.3、华为交换机添加静态路由 {#7-3-华为交换机添加静态路由}
去目标网段100.64.64.0/24下一跳丢给anylink服务器的eth0口ip
ip route-static 100.64.64.0 255.255.255.0 192.168.6.117 description to-anylink-virtual-ip
7.4、开启服务 {#7-4-开启服务}
sudo systemctl start anylink
7.5、重启服务 {#7-5-重启服务}
sudo systemctl restart anylink
八、TUN网络模式,ARP代理 {#八-TUN网络模式-ARP代理}
ARP代理模式,除了NAT要求关闭和客户端虚拟IP跟上面的不一样以外,其他与上面的配置模版皆相同。
8.1、网络模式 {#8-1-网络模式}
link_mode = "tun"
8.2、关闭nat(不开启) {#8-2-关闭nat-不开启-}
iptables_nat = false
说明:VyOS不开启NAT方式就是下面的命令不配置。
~~set nat source rule 1000 outbound-interface name 'eth0'~~
~~set nat source rule 1000 source address '100.64.64.0/24'~~
~~set nat source rule 1000 translation address 'masquerade'~~
8.3、客户端虚拟IP {#8-3-客户端虚拟IP}
使用ARP代理模式时,客户端虚拟IP地址需要保持和vyos的eth0口同网段,也就是和内网同网段,ipv4_gateway不能是网关地址,是eth0口网段的一个随机地址例如:192.168.6.252(且192.168.6.252这个地址也不能提前被内网占用),ipv4_start和ipv4_end地址范围自定义,但是需要在华为核心交换机中把anylink下发的这个地址范围做排除下发,否则会导致IP地址冲突,如果华为核心交换机中对192.168.6.0/24网段没有配置dhcp,可以忽略,此时用户拨号连接内网就相当于一根网线直连华为核心交换机。
ipv4_master = "eth0"
ipv4_cidr = "192.168.6.0/24"
ipv4_gateway = "192.168.6.252"
ipv4_start = "192.168.6.150"
ipv4_end = "192.168.6.250"
8.4、开启ARP代理 {#8-4-开启ARP代理}
8.4.1、vyos命令 {#8-4-1-vyos命令}
configure
set system sysctl parameter net.ipv4.conf.all.proxy_arp value 1
commit
save
8.4.2、linux命令 {#8-4-2-linux命令}
echo "net.ipv4.conf.all.proxy_arp = 1" | sudo tee -a /etc/sysctl.conf
8.5、开启服务 {#8-5-开启服务}
sudo systemctl start anylink
8.6、重启服务 {#8-6-重启服务}
sudo systemctl restart anylink
九、BR桥接模式,macVTAP {#九-BR桥接模式-macVTAP}
桥接模式,1、NAT要求关闭,2、客户端虚拟IP,3、网络模式不同,其他与上面的配置模版皆相同。
9.1、ESXi开启ETH0口混杂模式 {#9-1-ESXi开启ETH0口混杂模式}
9.2、VyOS开启ETH0口混杂模式 {#9-2-VyOS开启ETH0口混杂模式}
sudo ip link set dev eth0 promisc on
9.3、关闭nat(不开启) {#9-3-关闭nat-不开启-}
iptables_nat = false
说明:VyOS不开启NAT方式就是下面的命令不配置。
~~set nat source rule 1000 outbound-interface name 'eth0'~~
~~set nat source rule 1000 source address '100.64.64.0/24'~~
~~set nat source rule 1000 translation address 'masquerade'~~
9.4、网络模式 {#9-4-网络模式}
link_mode = "macvtap"
9.5、客户端虚拟IP {#9-5-客户端虚拟IP}
当网络模式选择桥接模式时,客户端虚拟IP地址需要保持和vyos的eth0口同网段,也就是和内网同网段,ipv4_gateway必须是网关地址,也就是图中vlanif6:192.168.6.254,ipv4_start和ipv4_end地址范围自定义,但是需要在华为核心交换机中把anylink下发的这个地址范围做排除下发,否则会导致IP地址冲突,如果华为核心交换机中对192.168.6.0/24没有配置dhcp,可以忽略,此时用户拨号连接内网就相当于一根网线直连华为核心交换机。
ipv4_master = "eth0"
ipv4_cidr = "192.168.6.0/24"
ipv4_gateway = "192.168.6.254"
ipv4_start = "192.168.6.150"
ipv4_end = "192.168.6.250"
9.6、开启服务 {#9-6-开启服务}
sudo systemctl start anylink
9.7、重启服务 {#9-7-重启服务}
sudo systemctl restart anylink
十、Web功能配置 {#十-Web功能配置}
主要介绍部分实用功能,其他未介绍的功能请看官方文档。
10.1、基础信息配置 {#10-1-基础信息配置}
这里以qq邮箱为例。
10.1.1、邮箱配置 {#10-1-1-邮箱配置}
10.1.2、证书设置 {#10-1-2-证书设置}
这里我是使用Let's Encrypt,使用托管到cloudflare的域名进行证书申请,我直接截图重点位置,就是DNS的token获取,下面所有操作完后,点击保存获得到一串token字段,请保存好。
10.1.3、其他设置 {#10-1-3-其他设置}
10.2、创建用户组列表 {#10-2-创建用户组列表}
把里面默认的俩个删除(all和ops),然后自己新建。
10.2.1、删除默认组 {#10-2-1-删除默认组}
10.2.2、创建内网用户组 {#10-2-2-创建内网用户组}
普通用户组只下发内网明细路由走隧道。
通用
DNS说明
认证方式
路由设置
权限控制
域名拆分隧道
10.2.3、创建全局用户组 {#10-2-3-创建全局用户组}
全局用户组下发八个零的默认路由,全部路由走隧道。
10.2.4、创建域名分流用户组 {#10-2-4-创建域名分流用户组}
域名用户组指定域名走隧道。
10.3、创建用户 {#10-3-创建用户}
戌、客户端测试 {#戌-客户端测试}
11.1、tun模式,开启nat {#11-1-tun模式-开启nat}
访问内网和访问公网,源地址都是192.168.6.117
11.1.1、测试LAN组 {#11-1-1-测试LAN组}
LAN用户权限只能访问内网192.168.6.0/24网段,且不能访问192.168.6.254的tcp23端口,访问192.168.6.254其他端口正常。
11.1.1.1、tracert测试 {#11-1-1-1-tracert测试}
11.1.1.2、ping测试 {#11-1-1-2-ping测试}
11.1.1.3、tcping测试 {#11-1-1-3-tcping测试}
11.1.2、测试ALL组 {#11-1-2-测试ALL组}
ALL用户权限是所有流量都走vpn隧道。
11.1.2.1、tracert测试 {#11-1-2-1-tracert测试}
11.1.3、测试FAST组 {#11-1-3-测试FAST组}
FAST组用户权限是只有指定的FAST域名流量如谷歌和油管走vpn,其他默认走本地。
11.1.3.1、tracert测试 {#11-1-3-1-tracert测试}
11.2、tun模式,关闭nat {#11-2-tun模式-关闭nat}
访问内网,源地址为100.64.64.0/24(如果要访问公网,需要在出口路由器网关上配置回程路由,并配置SNAT,否则全局模式无法上网)
11.2.1、测试LAN组 {#11-2-1-测试LAN组}
访问内网一台PC的3389端口,然后抓包看源地址。
11.3、tun模式,arp代理 {#11-3-tun模式-arp代理}
访问内网和公网源地址都是192.168.6.0/24网段,和内网是二层直连模式。
11.3.1、测试LAN组 {#11-3-1-测试LAN组}
11.3.1.1、tracert测试 {#11-3-1-1-tracert测试}
11.3.1.2、ping测试 {#11-3-1-2-ping测试}
11.3.1.3、tcping测试 {#11-3-1-3-tcping测试}
11.3.2、测试ALL组 {#11-3-2-测试ALL组}
11.3.2.1、tracert测试 {#11-3-2-1-tracert测试}
11.3.3、测试FAST组 {#11-3-3-测试FAST组}
11.3.3.1、tracert测试 {#11-3-3-1-tracert测试}
11.4、br模式,macvtap {#11-4-br模式-macvtap}
访问内网和公网源地址都是192.168.6.0/24网段,和内网是二层直连模式。
11.4.1、测试LAN组 {#11-4-1-测试LAN组}
11.4.1.1、tracert测试 {#11-4-1-1-tracert测试}
11.4.1.2、ping测试 {#11-4-1-2-ping测试}
11.4.1.3、tcping测试 {#11-4-1-3-tcping测试}
11.4.2、测试ALL组 {#11-4-2-测试ALL组}
11.4.2.1、tracert测试 {#11-4-2-1-tracert测试}
11.4.3、测试FAST组 {#11-4-3-测试FAST组}
11.4.3.1、tracert测试 {#11-4-3-1-tracert测试}
打、拓展 {#打-拓展}
12.1、DNS解析问题 {#12-1-DNS解析问题}
关于AnyLink下发的客户端DNS与内网域名、隧道拆分域名的关系请参考下图。
在客户端上测试域名解析时,请避免使用nslookup,相反,请依赖浏览器的nslookup(1、chrome://net-internals/#dns;2、edge://net-internals/#dns)或使用ping命令。这是因为nslookup不依赖于操作系统DNS解析器。AnyConnect不会通过特定接口强制DNS请求,但根据拆分DNS配置允许或拒绝该请求。为了强制DNS解析器尝试请求的可接受DNS服务器,切分DNS测试必须仅对依赖本地DNS解析器进行域名解析的应用程序(例如,除nslookup、dig和自身处理DNS解析的类似应用程序之外的所有应用程序)执行。
12.2、profile_name配置 {#12-2-profile-name配置}
sudo cd /usr/local/anylink-deploy/conf
sudo nano profile.xml
定义好HostName,以及HostAddress然后保存。
客户端拨号成功后,会自动下载配置文件到客户端本地
C:\ProgramData\Cisco\Cisco Secure Client\VPN\Profile
/opt/cisco/anyconnect/profile
12.3、全局模式打不开网页 {#12-3-全局模式打不开网页}
客户端全局模式拨号成功后,发现在cmd内ping域名正常,网页用ip访问正常,但是用域名无法访问,请在vyos的上网口添加mtu和mss。
set interfaces ethernet eth0 mtu 1476
set interfaces ethernet eth0 ip adjust-mss 1200