Linux上搭建Cisco AnyConnect(ocserv)

Linux上搭建Cisco AnyConnect(ocserv)

1. 安装 ocserv (OpenConnect server)

ocserv 是一个 OpenConnect SSL VPN 协议服务端,0.3.0 版后兼容使用 AnyConnect SSL VPN 协议的终端.
官方主页:https://ocserv.openconnect-vpn.net/

ocserv 已经在 epel 仓库中提供了,所以可以直接通过 yum 安装

yum install epel-release
yum install ocserv

2.生成证书

阅读官方文档
1) 创建工作文件夹

mkdir /opt/anyconnect
cd /opt/anyconnect/

2) 生成 CA 证书

certtool --generate-privkey --outfile ca-key.pem
cat >ca.tmpl <<EOF
cn = "VPN CA"
organization = "Big Corp"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
EOF
certtool --generate-self-signed --load-privkey ca-key.pem \
--template ca.tmpl --outfile ca-cert.pem

把生成的 ca-cert.pem 放到 /etc/ocserv/ 中

cp ca-key.pem /etc/ocserv/

3) 生成本地服务器证书

certtool --generate-privkey --outfile server-key.pem
cat >server.tmpl <<EOF
cn = "VPN server"
organization = "MyCompany"
serial = 2
expiration_days = 3650
encryption_key
signing_key
tls_www_server
EOF
certtool --generate-certificate --load-privkey server-key.pem \
--load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem \
--template server.tmpl --outfile server-cert.pem

把生成的 server-cert.pem 和 server-key.pem 放到 /etc/ocserv/ 中

cp server-cert.pem server-key.pem /etc/ocserv/

3. 配置 ocserv

vim /etc/ocserv/ocserv.conf

# 使用密码登录注释掉
#auth = "pam"
auth = "plain[/etc/ocserv/ocpasswd]"

# 端口 TCP and UDP
tcp-port = 4433
udp-port = 4433

# 证书地址
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem

# 取消注释设置客户端IP段
ipv4-network = 10.12.0.0
ipv4-netmask = 255.255.255.0

# 取消注释设置客户端DNS
dns = 8.8.8.8
dns = 8.8.4.4

4.创建用户

#username为你要添加的用户名
ocpasswd -c /etc/ocserv/ocpasswd username

5.配置系统设置

1) 开启内核转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

2) 配置iptables规则

# 对指定的表 table 进行操作,添加一个规则,把流量指定到eth0出去
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 保存路由表
iptables-save > /etc/sysconfig/iptables

# 编辑/etc/rc.d/rc.local文件,添加执行iptables规则脚本的命令.
vim /etc/rc.d/rc.local
# 添加以下行
iptables-restore < /etc/sysconfig/iptables
# 确保/etc/rc.d/rc.local文件具有执行权限
chmod +x /etc/rc.d/rc.local

3) 放行端口

  • 放行自己设置的端口
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --add-masquerade --permanent #必须配置,重要
firewall-cmd --reload

6.测试

现在我们可以开启服务器试试了

ocserv -c /etc/ocserv/ocserv.conf -f -d 10

如果没有问题,那么就可以配置成开机运行了

systemctl enable ocserv
systemctl start ocserv

如果可以使用客户端连接但是没有网络可以使用tcpdump抓包
vpns0是ocserv设置的虚拟网卡 抓包ipv4-network客户端IP段

tcpdump -i vpns0 host 10.12.0.1

如果出现对方返回icmp unreachable - admin prohibited filter,可以将firewalld关闭

Tips:

我自己的配置

# 采用账号密码方式认证
auth = "plain[passwd=/etc/ocserv/ocpasswd]"

# 设置服务器监听端口,默认的是443端口,但是会和https冲突,
# 可以设置成任意不冲突的端口
tcp-port = 4433
udp-port = 4433

# 程序以哪个用户和组运行
run-as-user = ocserv
run-as-group = ocserv

# socket文件
socket-file = /var/run/ocserv.sock

# 默认证书配置
server-cert = /etc/pki/ocserv/public/server.crt
server-key = /etc/pki/ocserv/private/server.key

# 开启lz4压缩
compression = true

# 隔离工作,默认不动
isolate-workers = true

# 最大客户端数量,0表示无限数量
max-clients = 16

# 同一用户可以同时登陆的客户端数量
max-same-clients = 5

# 默认不动
rate-limit-ms = 100
# 服务器统计重置时间,不动
server-stats-reset-time = 604800

# 保持连接,每隔多少秒向客户端发送连接数据包,防止断线.
# IOS系统5分钟会关闭后台数据通讯,然后就会断线.
# 因此将keepalive和mobile-dpd设置成200秒
keepalive = 200
dpd = 90
mobile-dpd = 200

# udp端口无传输25秒后转成tcp端口
switch-to-tcp-timeout = 25

# 启用MTU转发以优化性能
try-mtu-discovery = true

# 空闲断开时间,如果想无限期连接,注释这两行
#idle-timeout=1200
#mobile-idle-timeout=2400

# 仅使用TLS1.2以上版本
cert-user-oid = 0.9.2342.19200300.100.1.1
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"

# 认证超时时间
auth-timeout = 240
# 最小重新认证时间
min-reauth-time = 300
max-ban-score = 80
ban-reset-time = 1200
cookie-timeout = 324000
deny-roaming = false
rekey-time = 172800
rekey-method = ssl
use-occtl = true
pid-file = /var/run/ocserv.pid
device = vpns
predictable-ips = true
# 混淆 加上这个连接地址后面要加上"/?mysercretkey" 比如:exmple.com:4433/?mysercretkey 其中mysercretkey可以自定义
camouflage = true
camouflage_secret = "mysercretkey"
# 日志等级 info
log-level = 2
# 默认域名,修改为你的域名或ip地址,这个设置没有任何作用
default-domain = xxx.com:4433

# 配置自定义私有IP地址范围,注释默认的两行,不要去服务器地址冲突
#ipv4-network = 192.168.1.0
#ipv4-netmask = 255.255.255.0
ipv4-network = 10.12.0.0
ipv4-netmask = 255.255.0.0

# 以VPN隧道传输所有DNS查询
tunnel-all-dns = true

# 更改DNS服务器(国内服务器就填写国内dns)
dns = 8.8.8.8
dns = 1.1.1.1

# 允许思科客户端连接
cisco-client-compat = true

# 以下路由表不通过VPN隧道,直接本地网络连接
# 一定要添加自己服务器的ip地址,否则连上VPN后打不开自己的网站
no-route = x.x.x.x/255.255.255.255
#国内分流
no-route = 1.0.0.0/255.192.0.0
no-route = 1.64.0.0/255.224.0.0
no-route = 1.112.0.0/255.248.0.0
no-route = 1.176.0.0/255.240.0.0
no-route = 1.192.0.0/255.240.0.0
no-route = 14.0.0.0/255.224.0.0
no-route = 14.96.0.0/255.224.0.0
no-route = 14.128.0.0/255.224.0.0
no-route = 14.192.0.0/255.224.0.0
no-route = 27.0.0.0/255.192.0.0
no-route = 27.96.0.0/255.224.0.0
no-route = 27.128.0.0/255.224.0.0
no-route = 27.176.0.0/255.240.0.0
no-route = 27.192.0.0/255.224.0.0
no-route = 27.224.0.0/255.252.0.0
no-route = 36.0.0.0/255.192.0.0
no-route = 36.96.0.0/255.224.0.0
no-route = 36.128.0.0/255.192.0.0
no-route = 36.192.0.0/255.224.0.0
no-route = 36.240.0.0/255.240.0.0
no-route = 39.0.0.0/255.255.0.0
no-route = 39.64.0.0/255.224.0.0
no-route = 39.96.0.0/255.240.0.0
no-route = 39.128.0.0/255.192.0.0
no-route = 40.72.0.0/255.254.0.0
no-route = 40.124.0.0/255.252.0.0
no-route = 42.0.0.0/255.248.0.0
no-route = 42.48.0.0/255.240.0.0
no-route = 42.80.0.0/255.240.0.0
no-route = 42.96.0.0/255.224.0.0
no-route = 42.128.0.0/255.128.0.0
no-route = 43.224.0.0/255.224.0.0
no-route = 45.65.16.0/255.255.240.0
no-route = 45.112.0.0/255.240.0.0
no-route = 45.248.0.0/255.248.0.0
no-route = 47.92.0.0/255.252.0.0
no-route = 47.96.0.0/255.224.0.0
no-route = 49.0.0.0/255.128.0.0
no-route = 49.128.0.0/255.224.0.0
no-route = 49.192.0.0/255.192.0.0
no-route = 52.80.0.0/255.252.0.0
no-route = 54.222.0.0/255.254.0.0
no-route = 58.0.0.0/255.128.0.0
no-route = 58.128.0.0/255.224.0.0
no-route = 58.192.0.0/255.224.0.0
no-route = 58.240.0.0/255.240.0.0
no-route = 59.32.0.0/255.224.0.0
no-route = 59.64.0.0/255.224.0.0
no-route = 59.96.0.0/255.240.0.0
no-route = 59.144.0.0/255.240.0.0
no-route = 59.160.0.0/255.224.0.0
no-route = 59.192.0.0/255.192.0.0
no-route = 60.0.0.0/255.224.0.0
no-route = 60.48.0.0/255.240.0.0
no-route = 60.160.0.0/255.224.0.0
no-route = 60.192.0.0/255.192.0.0
no-route = 61.0.0.0/255.192.0.0
no-route = 61.80.0.0/255.248.0.0
no-route = 61.128.0.0/255.192.0.0
no-route = 61.224.0.0/255.224.0.0
no-route = 91.234.36.0/255.255.255.0
no-route = 101.0.0.0/255.128.0.0
no-route = 101.128.0.0/255.224.0.0
no-route = 101.192.0.0/255.240.0.0
no-route = 101.224.0.0/255.224.0.0
no-route = 103.0.0.0/255.0.0.0
no-route = 106.0.0.0/255.128.0.0
no-route = 106.224.0.0/255.240.0.0
no-route = 110.0.0.0/255.128.0.0
no-route = 110.144.0.0/255.240.0.0
no-route = 110.160.0.0/255.224.0.0
no-route = 110.192.0.0/255.192.0.0
no-route = 111.0.0.0/255.192.0.0
no-route = 111.64.0.0/255.224.0.0
no-route = 111.112.0.0/255.240.0.0
no-route = 111.128.0.0/255.192.0.0
no-route = 111.192.0.0/255.224.0.0
no-route = 111.224.0.0/255.240.0.0
no-route = 112.0.0.0/255.128.0.0
no-route = 112.128.0.0/255.240.0.0
no-route = 112.192.0.0/255.252.0.0
no-route = 112.224.0.0/255.224.0.0
no-route = 113.0.0.0/255.128.0.0
no-route = 113.128.0.0/255.240.0.0
no-route = 113.192.0.0/255.192.0.0
no-route = 114.16.0.0/255.240.0.0
no-route = 114.48.0.0/255.240.0.0
no-route = 114.64.0.0/255.192.0.0
no-route = 114.128.0.0/255.240.0.0
no-route = 114.192.0.0/255.192.0.0
no-route = 115.0.0.0/255.0.0.0
no-route = 116.0.0.0/255.0.0.0
no-route = 117.0.0.0/255.128.0.0
no-route = 117.128.0.0/255.192.0.0
no-route = 118.16.0.0/255.240.0.0
no-route = 118.64.0.0/255.192.0.0
no-route = 118.128.0.0/255.128.0.0
no-route = 119.0.0.0/255.128.0.0
no-route = 119.128.0.0/255.192.0.0
no-route = 119.224.0.0/255.224.0.0
no-route = 120.0.0.0/255.192.0.0
no-route = 120.64.0.0/255.224.0.0
no-route = 120.128.0.0/255.240.0.0
no-route = 120.192.0.0/255.192.0.0
no-route = 121.0.0.0/255.128.0.0
no-route = 121.192.0.0/255.192.0.0
no-route = 122.0.0.0/254.0.0.0
no-route = 124.0.0.0/255.0.0.0
no-route = 125.0.0.0/255.128.0.0
no-route = 125.160.0.0/255.224.0.0
no-route = 125.192.0.0/255.192.0.0
no-route = 137.59.59.0/255.255.255.0
no-route = 137.59.88.0/255.255.252.0
no-route = 139.0.0.0/255.224.0.0
no-route = 139.128.0.0/255.128.0.0
no-route = 140.64.0.0/255.240.0.0
no-route = 140.128.0.0/255.240.0.0
no-route = 140.192.0.0/255.192.0.0
no-route = 144.0.0.0/255.248.0.0
no-route = 144.12.0.0/255.255.0.0
no-route = 144.48.0.0/255.248.0.0
no-route = 144.123.0.0/255.255.0.0
no-route = 144.255.0.0/255.255.0.0
no-route = 146.196.0.0/255.255.128.0
no-route = 150.0.0.0/255.255.0.0
no-route = 150.96.0.0/255.224.0.0
no-route = 150.128.0.0/255.240.0.0
no-route = 150.192.0.0/255.192.0.0
no-route = 152.104.128.0/255.255.128.0
no-route = 153.0.0.0/255.192.0.0
no-route = 153.96.0.0/255.224.0.0
no-route = 157.0.0.0/255.255.0.0
no-route = 157.18.0.0/255.255.0.0
no-route = 157.61.0.0/255.255.0.0
no-route = 157.112.0.0/255.240.0.0
no-route = 157.144.0.0/255.240.0.0
no-route = 157.255.0.0/255.255.0.0
no-route = 159.226.0.0/255.255.0.0
no-route = 160.19.0.0/255.255.0.0
no-route = 160.20.48.0/255.255.252.0
no-route = 160.202.0.0/255.255.0.0
no-route = 160.238.64.0/255.255.252.0
no-route = 161.207.0.0/255.255.0.0
no-route = 162.105.0.0/255.255.0.0
no-route = 163.0.0.0/255.192.0.0
no-route = 163.96.0.0/255.224.0.0
no-route = 163.128.0.0/255.192.0.0
no-route = 163.192.0.0/255.224.0.0
no-route = 164.52.0.0/255.255.128.0
no-route = 166.111.0.0/255.255.0.0
no-route = 167.139.0.0/255.255.0.0
no-route = 167.189.0.0/255.255.0.0
no-route = 167.220.244.0/255.255.252.0
no-route = 168.160.0.0/255.255.0.0
no-route = 170.179.0.0/255.255.0.0
no-route = 171.0.0.0/255.128.0.0
no-route = 171.192.0.0/255.224.0.0
no-route = 175.0.0.0/255.128.0.0
no-route = 175.128.0.0/255.192.0.0
no-route = 180.64.0.0/255.192.0.0
no-route = 180.128.0.0/255.128.0.0
no-route = 182.0.0.0/255.0.0.0
no-route = 183.0.0.0/255.192.0.0
no-route = 183.64.0.0/255.224.0.0
no-route = 183.128.0.0/255.128.0.0
no-route = 192.124.154.0/255.255.255.0
no-route = 192.140.128.0/255.255.128.0
no-route = 195.78.82.0/255.255.254.0
no-route = 202.0.0.0/255.128.0.0
no-route = 202.128.0.0/255.192.0.0
no-route = 202.192.0.0/255.224.0.0
no-route = 203.0.0.0/255.0.0.0
no-route = 210.0.0.0/255.192.0.0
no-route = 210.64.0.0/255.224.0.0
no-route = 210.160.0.0/255.224.0.0
no-route = 210.192.0.0/255.224.0.0
no-route = 211.64.0.0/255.248.0.0
no-route = 211.80.0.0/255.240.0.0
no-route = 211.96.0.0/255.248.0.0
no-route = 211.136.0.0/255.248.0.0
no-route = 211.144.0.0/255.240.0.0
no-route = 211.160.0.0/255.248.0.0
no-route = 216.250.108.0/255.255.252.0
no-route = 218.0.0.0/255.128.0.0
no-route = 218.160.0.0/255.224.0.0
no-route = 218.192.0.0/255.192.0.0
no-route = 219.64.0.0/255.224.0.0
no-route = 219.128.0.0/255.224.0.0
no-route = 219.192.0.0/255.192.0.0
no-route = 220.96.0.0/255.224.0.0
no-route = 220.128.0.0/255.128.0.0
no-route = 221.0.0.0/255.224.0.0
no-route = 221.96.0.0/255.224.0.0
no-route = 221.128.0.0/255.128.0.0
no-route = 222.0.0.0/255.0.0.0
no-route = 223.0.0.0/255.224.0.0
no-route = 223.64.0.0/255.192.0.0
no-route = 223.128.0.0/255.128.0.0

no-route-cn: https://github.com/CNMan/ocserv-cn-no-route/tree/master