bjdgyc/anylink
GitHub: bjdgyc/anylink
基于 OpenConnect 协议的企业级 SSL VPN 服务端,兼容 AnyConnect 客户端,支持多种认证方式和细粒度权限管理,帮助团队快速搭建安全的远程内网访问通道。
Stars: 2250 | Forks: 509
# AnyLink
[](https://github.com/bjdgyc/anylink/actions)
[](https://pkg.go.dev/github.com/bjdgyc/anylink)
[](https://goreportcard.com/report/github.com/bjdgyc/anylink)
[](https://codecov.io/gh/bjdgyc/anylink)



[](https://hub.docker.com/r/bjdgyc/anylink)

AnyLink 是一个企业级远程办公 sslvpn 的软件,可以支持多人同时在线使用。
使用 AnyLink,你可以随时随地安全的访问你的内部网络。
使用 AnyLink,你可以随时随地安全地访问内部网络。
## 仓库
## 简介
AnyLink 基于 [ietf-openconnect](https://tools.ietf.org/html/draft-mavrogiannopoulos-openconnect-02)
协议开发,并且借鉴了 [ocserv](http://ocserv.gitlab.io/www/index.html) 的开发思路,使其可以同时兼容 AnyConnect 客户端。
AnyLink 使用 TLS/DTLS 进行数据加密,因此需要 RSA 或 ECC 证书,可以使用私有自签证书,可以通过 Let's Encrypt 和 TrustAsia
申请免费的 SSL 证书。
AnyLink 服务端仅在 CentOS7、CentOS8、Ubuntu18、Ubuntu20、Ubuntu22、Ubuntu24、AnolisOS8、OpenCloudOS8、Debian10、Debian11、Debian12、Debian13 测试通过,如需要安装在其他系统,需要服务端支持
tun/tap
功能、ip 设置命令、iptables命令。
## 截图

## 安装说明
### 使用问题
### 自行编译安装
```
git clone https://github.com/bjdgyc/anylink.git
# docker编译 参考软件版本(不需要安装)
# go 1.20.12
# node v16.20.2
# yarn 1.22.19
cd anylink
# 编译前端
bash build_web.sh
# 编译 anylink-deploy 发布文件
bash build.sh
# 注意使用root权限运行
cd anylink-deploy
sudo ./anylink
# 默认管理后台访问地址
# https://host:8800
# 默认账号 密码
# admin 123456
```
## 功能特性
- [x] IP 分配(实现 IP、MAC 映射信息的持久化)
- [x] TLS-TCP 通道
- [x] DTLS-UDP 通道
- [x] 兼容 AnyConnect
- [x] 兼容 OpenConnect
- [x] 基于 tun 设备的 nat 访问模式
- [x] 基于 tun 设备的桥接访问模式
- [x] 基于 macvtap 设备的桥接访问模式
- [x] 支持 [proxy protocol v1&v2](http://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) 协议
- [x] 用户组支持
- [x] 用户组策略支持
- [x] 多用户支持
- [x] 用户策略支持
- [x] TOTP 令牌支持
- [x] TOTP 令牌开关
- [x] 流量速率限制
- [x] 后台管理界面
- [x] 访问权限管理
- [x] 用户活动审计功能
- [x] IP 访问审计功能(支持多端口、连续端口)
- [x] 域名动态拆分隧道(域名路由功能)
- [x] radius认证支持
- [x] LDAP认证支持
- [x] 空闲链接超时自动断开
- [x] 流量压缩功能
- [x] 出口 IP 自动放行
- [x] 支持多服务的配置区分
- [x] 支持私有自签证书
- [x] 支持内网域名解析(指定的域名走内网dns)
- [x] 增加用户验证防爆功能(IP BAN)
- [x] 支持 docker 非特权模式
- [x] 支持自定义证书登录验证
- [x] 支持微信扫码登录
- [x] 支持客户端证书绑定设备的功能
- [x] 支持自动同步LDAP用户
- [ ] 基于 ipvtap 设备的桥接访问模式
## 配置
```
# 查看帮助信息
./anylink -h
# 生成后台密码
./anylink tool -p 123456
# 生成jwt密钥
./anylink tool -s
# 查看所有配置项
./anylink tool -d
```
| db_type | db_source |
|----------|----------------------------------------------------------------------------------------------------------------------|
| sqlite3 | ./conf/anylink.db |
| mysql | user:password@tcp(127.0.0.1:3306)/anylink?charset=utf8
user:password@tcp(127.0.0.1:3306)/anylink?charset=utf8mb4 | | postgres | postgres://user:password@localhost/anylink?sslmode=verify-full | | mssql | sqlserver://user:password@localhost?database=anylink&connection+timeout=30 | ## 升级 ## 设置说明 ### 依赖设置 ### link_mode 设置 网络模式选择,需要配置 `link_mode` 参数,如 `link_mode="tun"`,`link_mode="macvtap"` 等参数。 不同的参数需要对服务器做相应的设置。 建议优先选择 tun 模式,其次选择 macvtap 模式,因客户端传输的是 IP 层数据,无须进行数据转换。 tap 模式是在用户态做的链路层到 IP 层的数据互相转换,性能会有所下降。 如果需要在虚拟机内开启 tap 模式,请确认虚拟机的网卡开启混杂模式。 #### tun 设置 1. 开启服务器转发 ``` # 新版本支持自动设置ip转发 # 文件: /etc/sysctl.conf net.ipv4.ip_forward = 1 #执行如下命令 sysctl -w net.ipv4.ip_forward=1 # 查看设置是否生效 cat /proc/sys/net/ipv4/ip_forward ``` 2.1 设置 nat 转发规则(二选一) ``` systemctl stop firewalld.service systemctl disable firewalld.service # 新版本支持自动设置nat转发,如有其他需求可以参考下面的命令配置 # 请根据服务器内网网卡替换 eth0 # iptables -t nat -A POSTROUTING -s 192.168.90.0/24 -o eth0 -j MASQUERADE # 如果执行第一个命令不生效,可以继续执行下面的命令 # iptables -A FORWARD -i eth0 -s 192.168.90.0/24 -j ACCEPT # 查看设置是否生效 # iptables -nL -t nat ``` 2.2 使用全局路由转发(二选一) ``` # 假设anylink所在服务器的内网ip: 10.1.2.10 # 首先关闭nat转发功能 iptables_nat = false # 传统网络架构,在华三交换机添加以下静态路由规则 ip route-static 192.168.90.0 255.255.255.0 10.1.2.10 # 其他品牌的交换机命令,请参考以下地址 https://cloud.tencent.com/document/product/216/62007 # 公有云环境下,需设置vpc下的路由表,添加以下路由策略 目的端: 192.168.90.0/24 下一跳类型: 云服务器 下一跳: 10.1.2.10 ``` 3. 使用 AnyConnect 客户端连接即可 #### 桥接设置 1. 设置配置文件 1.1 arp_proxy ``` # 文件: /etc/sysctl.conf net.ipv4.conf.all.proxy_arp = 1 #执行如下命令 sysctl -w net.ipv4.conf.all.proxy_arp=1 配置文件修改: # 首先关闭nat转发功能 iptables_nat = false link_mode = "tun" #内网主网卡名称 ipv4_master = "eth0" #以下网段需要跟ipv4_master网卡设置成一样 ipv4_cidr = "10.1.2.0/24" ipv4_gateway = "10.1.2.99" ipv4_start = "10.1.2.100" ipv4_end = "10.1.2.200" ``` 1.2 macvtap ``` # 命令行执行 master网卡需要打开混杂模式 ip link set dev eth0 promisc on #=====================# # 配置文件修改 # 首先关闭nat转发功能 iptables_nat = false link_mode = "macvtap" #内网主网卡名称 ipv4_master = "eth0" #以下网段需要跟ipv4_master网卡设置成一样 ipv4_cidr = "10.1.2.0/24" ipv4_gateway = "10.1.2.1" ipv4_start = "10.1.2.100" ipv4_end = "10.1.2.200" ``` ## 部署 ### Systemd 1. 添加 anylink 程序 - 首先把 `anylink-deploy` 文件夹放入 `/usr/local/anylink-deploy` - 添加执行权限 `chmod +x /usr/local/anylink-deploy/anylink` 2. 把 `anylink.service` 脚本放入: - centos: `/usr/lib/systemd/system/` - ubuntu: `/lib/systemd/system/` 3. 操作命令: - 加载配置: `systemctl daemon-reload` - 启动: `systemctl start anylink` - 停止: `systemctl stop anylink` - 开机自启: `systemctl enable anylink` ### Docker Compose 1. 进入 `deploy` 目录 2. 执行脚本 `docker-compose up` ### k8s 1. 进入 `deploy` 目录 2. 执行脚本 `kubectl apply -f deployment.yaml` ## Docker ### anylink 镜像地址 对于国内用户,为提高镜像拉取体验,可以考虑拉取存放于阿里云镜像仓库的镜像,镜像名称及标签如下表所示( 具体版本号可以查看 `version` 文件): | 支持设备/平台 | DockerHub | 阿里云镜像仓库 | |:-------------:|:---------------------:|:---------------------------------------------------------------:| | x86_64/amd64 | bjdgyc/anylink:latest | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:latest | | x86_64/amd64 | bjdgyc/anylink:0.14.2 | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:0.14.2 | | armv8/aarch64 | bjdgyc/anylink:latest | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:arm64v8-latest | | armv8/aarch64 | bjdgyc/anylink:0.14.2 | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:arm64v8-0.14.2 | ### docker 镜像源地址 ### 操作步骤 1. 获取镜像 # 具体tag可以从docker hub获取 # https://hub.docker.com/r/bjdgyc/anylink/tags docker pull bjdgyc/anylink:latest docker pull registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:latest 2. 查看命令信息 docker run -it --rm bjdgyc/anylink -h 3. 生成密码 docker run -it --rm bjdgyc/anylink tool -p 123456 #Passwd:$2a$10$lCWTCcGmQdE/4Kb1wabbLelu4vY/cUwBwN64xIzvXcihFgRzUvH2a 4. 生成 jwt secret docker run -it --rm bjdgyc/anylink tool -s #Secret:9qXoIhY01jqhWIeIluGliOS4O_rhcXGGGu422uRZ1JjZxIZmh17WwzW36woEbA 5. 查看所有配置项 docker run -it --rm bjdgyc/anylink tool -d 6. 启动容器 # 默认启动 docker run -itd --name anylink --privileged \ -p 443:443 -p 8800:8800 -p 443:443/udp \ --restart=always \ bjdgyc/anylink # 自定义配置目录 # 首次启动会自动创建配置文件 # 配置文件初始化完成后,容器会强制退出,请重新启动容器 docker run -itd --name anylink --privileged \ -p 443:443 -p 8800:8800 -p 443:443/udp \ -v /home/myconf:/app/conf \ --restart=always \ bjdgyc/anylink docker restart anylink 7. 使用自定义参数启动容器 # 参数可以参考 ./anylink tool -d # 可以使用命令行参数 或者 环境变量 配置 docker run -itd --name anylink --privileged \ -e LINK_LOG_LEVEL=info \ -p 443:443 -p 8800:8800 -p 443:443/udp \ -v /home/myconf:/app/conf \ --restart=always \ bjdgyc/anylink \ --ip_lease=1209600 # IP地址租约时长 8. 使用非特权模式启动容器 # 参数可以参考 ./anylink tool -d # 可以使用命令行参数 或者 环境变量 配置 docker run -itd --name anylink \ -p 443:443 -p 8800:8800 -p 443:443/udp \ -v /dev/net/tun:/dev/net/tun --cap-add=NET_ADMIN \ --restart=always \ bjdgyc/anylink 9. 构建镜像 (非必需) #获取仓库源码 git clone https://github.com/bjdgyc/anylink.git # 构建镜像 sh build_docker.sh 或 docker build -t anylink -f docker/Dockerfile . ## 常见问题 请前往 [问题地址](doc/question.md) 查看具体信息
user:password@tcp(127.0.0.1:3306)/anylink?charset=utf8mb4 | | postgres | postgres://user:password@localhost/anylink?sslmode=verify-full | | mssql | sqlserver://user:password@localhost?database=anylink&connection+timeout=30 | ## 升级 ## 设置说明 ### 依赖设置 ### link_mode 设置 网络模式选择,需要配置 `link_mode` 参数,如 `link_mode="tun"`,`link_mode="macvtap"` 等参数。 不同的参数需要对服务器做相应的设置。 建议优先选择 tun 模式,其次选择 macvtap 模式,因客户端传输的是 IP 层数据,无须进行数据转换。 tap 模式是在用户态做的链路层到 IP 层的数据互相转换,性能会有所下降。 如果需要在虚拟机内开启 tap 模式,请确认虚拟机的网卡开启混杂模式。 #### tun 设置 1. 开启服务器转发 ``` # 新版本支持自动设置ip转发 # 文件: /etc/sysctl.conf net.ipv4.ip_forward = 1 #执行如下命令 sysctl -w net.ipv4.ip_forward=1 # 查看设置是否生效 cat /proc/sys/net/ipv4/ip_forward ``` 2.1 设置 nat 转发规则(二选一) ``` systemctl stop firewalld.service systemctl disable firewalld.service # 新版本支持自动设置nat转发,如有其他需求可以参考下面的命令配置 # 请根据服务器内网网卡替换 eth0 # iptables -t nat -A POSTROUTING -s 192.168.90.0/24 -o eth0 -j MASQUERADE # 如果执行第一个命令不生效,可以继续执行下面的命令 # iptables -A FORWARD -i eth0 -s 192.168.90.0/24 -j ACCEPT # 查看设置是否生效 # iptables -nL -t nat ``` 2.2 使用全局路由转发(二选一) ``` # 假设anylink所在服务器的内网ip: 10.1.2.10 # 首先关闭nat转发功能 iptables_nat = false # 传统网络架构,在华三交换机添加以下静态路由规则 ip route-static 192.168.90.0 255.255.255.0 10.1.2.10 # 其他品牌的交换机命令,请参考以下地址 https://cloud.tencent.com/document/product/216/62007 # 公有云环境下,需设置vpc下的路由表,添加以下路由策略 目的端: 192.168.90.0/24 下一跳类型: 云服务器 下一跳: 10.1.2.10 ``` 3. 使用 AnyConnect 客户端连接即可 #### 桥接设置 1. 设置配置文件 1.1 arp_proxy ``` # 文件: /etc/sysctl.conf net.ipv4.conf.all.proxy_arp = 1 #执行如下命令 sysctl -w net.ipv4.conf.all.proxy_arp=1 配置文件修改: # 首先关闭nat转发功能 iptables_nat = false link_mode = "tun" #内网主网卡名称 ipv4_master = "eth0" #以下网段需要跟ipv4_master网卡设置成一样 ipv4_cidr = "10.1.2.0/24" ipv4_gateway = "10.1.2.99" ipv4_start = "10.1.2.100" ipv4_end = "10.1.2.200" ``` 1.2 macvtap ``` # 命令行执行 master网卡需要打开混杂模式 ip link set dev eth0 promisc on #=====================# # 配置文件修改 # 首先关闭nat转发功能 iptables_nat = false link_mode = "macvtap" #内网主网卡名称 ipv4_master = "eth0" #以下网段需要跟ipv4_master网卡设置成一样 ipv4_cidr = "10.1.2.0/24" ipv4_gateway = "10.1.2.1" ipv4_start = "10.1.2.100" ipv4_end = "10.1.2.200" ``` ## 部署 ### Systemd 1. 添加 anylink 程序 - 首先把 `anylink-deploy` 文件夹放入 `/usr/local/anylink-deploy` - 添加执行权限 `chmod +x /usr/local/anylink-deploy/anylink` 2. 把 `anylink.service` 脚本放入: - centos: `/usr/lib/systemd/system/` - ubuntu: `/lib/systemd/system/` 3. 操作命令: - 加载配置: `systemctl daemon-reload` - 启动: `systemctl start anylink` - 停止: `systemctl stop anylink` - 开机自启: `systemctl enable anylink` ### Docker Compose 1. 进入 `deploy` 目录 2. 执行脚本 `docker-compose up` ### k8s 1. 进入 `deploy` 目录 2. 执行脚本 `kubectl apply -f deployment.yaml` ## Docker ### anylink 镜像地址 对于国内用户,为提高镜像拉取体验,可以考虑拉取存放于阿里云镜像仓库的镜像,镜像名称及标签如下表所示( 具体版本号可以查看 `version` 文件): | 支持设备/平台 | DockerHub | 阿里云镜像仓库 | |:-------------:|:---------------------:|:---------------------------------------------------------------:| | x86_64/amd64 | bjdgyc/anylink:latest | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:latest | | x86_64/amd64 | bjdgyc/anylink:0.14.2 | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:0.14.2 | | armv8/aarch64 | bjdgyc/anylink:latest | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:arm64v8-latest | | armv8/aarch64 | bjdgyc/anylink:0.14.2 | registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:arm64v8-0.14.2 | ### docker 镜像源地址 ### 操作步骤 1. 获取镜像 # 具体tag可以从docker hub获取 # https://hub.docker.com/r/bjdgyc/anylink/tags docker pull bjdgyc/anylink:latest docker pull registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:latest 2. 查看命令信息 docker run -it --rm bjdgyc/anylink -h 3. 生成密码 docker run -it --rm bjdgyc/anylink tool -p 123456 #Passwd:$2a$10$lCWTCcGmQdE/4Kb1wabbLelu4vY/cUwBwN64xIzvXcihFgRzUvH2a 4. 生成 jwt secret docker run -it --rm bjdgyc/anylink tool -s #Secret:9qXoIhY01jqhWIeIluGliOS4O_rhcXGGGu422uRZ1JjZxIZmh17WwzW36woEbA 5. 查看所有配置项 docker run -it --rm bjdgyc/anylink tool -d 6. 启动容器 # 默认启动 docker run -itd --name anylink --privileged \ -p 443:443 -p 8800:8800 -p 443:443/udp \ --restart=always \ bjdgyc/anylink # 自定义配置目录 # 首次启动会自动创建配置文件 # 配置文件初始化完成后,容器会强制退出,请重新启动容器 docker run -itd --name anylink --privileged \ -p 443:443 -p 8800:8800 -p 443:443/udp \ -v /home/myconf:/app/conf \ --restart=always \ bjdgyc/anylink docker restart anylink 7. 使用自定义参数启动容器 # 参数可以参考 ./anylink tool -d # 可以使用命令行参数 或者 环境变量 配置 docker run -itd --name anylink --privileged \ -e LINK_LOG_LEVEL=info \ -p 443:443 -p 8800:8800 -p 443:443/udp \ -v /home/myconf:/app/conf \ --restart=always \ bjdgyc/anylink \ --ip_lease=1209600 # IP地址租约时长 8. 使用非特权模式启动容器 # 参数可以参考 ./anylink tool -d # 可以使用命令行参数 或者 环境变量 配置 docker run -itd --name anylink \ -p 443:443 -p 8800:8800 -p 443:443/udp \ -v /dev/net/tun:/dev/net/tun --cap-add=NET_ADMIN \ --restart=always \ bjdgyc/anylink 9. 构建镜像 (非必需) #获取仓库源码 git clone https://github.com/bjdgyc/anylink.git # 构建镜像 sh build_docker.sh 或 docker build -t anylink -f docker/Dockerfile . ## 常见问题 请前往 [问题地址](doc/question.md) 查看具体信息