openconnect/anyconnect VPN 配置

openconnect/anyconnect VPN 配置

Cisco Anyconnect,是 Cisco 研发的企业级 SSL VPN 解决方案,早期只用于 Cisco 的企业用户,背后是开源技术 OpenConnect,简单来说就是对使用 UDP 的 DTLS 协议进行加密,掉线时自动使用 TCP 的 TLS 协议进行备份恢复,所以与其他 VPN(L2TP/PPTP) 比较稳定,可以保持长时间在线。

Server 配置 #

安装 OCserv #

  1. 下载最新的 OpenConnect Server 版本 ftp://ftp.infradead.org/pub/ocserv/
  2. 编译安装 OCserv tar xvf ocserv-xxxx.tar.xz cd ocserv-xxxx ./configure make sudo make install

配置 OCserv #

  1. 配置证书

    安装证书工具  
    apt-get install gnutls-bin
    cd ~ && mkdir certificates && cd certificates
    

    在此目录下创建一个名为vi ca.tmpl 的CA证书模板,写入如下语句:

    cn = "Your CA name" 
    organization = "Your fancy name" 
    serial = 1 
    expiration_days = 3650
    ca 
    signing_key 
    cert_signing_key 
    crl_signing_key
    

    生成CA密钥和证书

    certtool --generate-privkey --outfile ca-key.pem
    certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
    

    然后我们生成服务器证书vi server.tmpl,这里注意 cn 项必须对应你服务器的域名或IP,内容如下:

    cn = "Your hostname or IP" 
    organization = "Your fancy name" 
    expiration_days = 3650
    signing_key 
    encryption_key
    tls_www_server
    

    生成Server密钥和证书

    certtool --generate-privkey --outfile server-key.pem
    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
    

    把证书移动到合适的地方:

    cp ca-cert.pem /etc/ssl/private/my-ca-cert.pem
    cp server-cert.pem /etc/ssl/private/my-server-cert.pem
    cp server-key.pem /etc/ssl/private/my-server-key.pem
    
  2. 配置文件 配置文件、参考官方文档是最佳选项,但为了方便起见,这是你需要注意的一些设置。回到ocserv-xxxx的文件夹下,将配置文件复制到OCserv默认读取的位置。

    sudo mkdir /etc/ocserv sudo cp doc/sample.config /etc/ocserv/ocserv.conf

确保以下配置正确:

# 登陆方式,目前先用密码登录
auth = "plain[/etc/ocserv/ocpasswd]"
# 允许同时连接的客户端数量
max-clients = 4
# 限制同一客户端的并行登陆数量
max-same-clients = 2
# 服务监听的IP(服务器IP,可不设置)
listen-host = 1.2.3.4
# 服务监听的TCP/UDP端口(选择你喜欢的数字)
tcp-port = 9000
udp-port = 9001
# 自动优化VPN的网络性能
try-mtu-discovery = true
# 确保服务器正确读取用户证书(后面会用到用户证书)
cert-user-oid = 2.5.4.3
# 服务器证书与密钥
server-cert = /etc/ssl/private/my-server-cert.pem
server-key = /etc/ssl/private/my-server-key.pem
# 客户端连上vpn后使用的dns
dns = 8.8.8.8
dns = 8.8.4.4
# 注释掉所有的route,让服务器成为gateway
#route = 192.168.1.0/255.255.255.0
# 启用cisco客户端兼容性支持
cisco-client-compat = true
  1. 其他配置 创建一个登陆用的用户名与密码

    sudo ocpasswd -c /etc/ocserv/ocpasswd your-username

最后我们需要打开IPv4的流量转发/etc/sysctl.conf 启用此项 net.ipv4.ip_forward=1 并刷新配置 sudo sysctl -p /etc/sysctl.conf

   iptables -t nat -A POSTROUTING -j MASQUERADE
   iptables -A INPUT -p tcp --dport 443 -j ACCEPT
   iptables -A INPUT -p udp --dport 443 -j ACCEPT
规则保存 Ubuntu
   iptables-save > /etc/iptables.rules
规则保存 Debian
   apt-get install iptables-persistent -y
   service netfilter-persistent save

使用iptables -t nat -L来验证转发是否开启成功

   Chain PREROUTING (policy ACCEPT)
   target     prot opt source               destination

   Chain INPUT (policy ACCEPT)
   target     prot opt source               destination

   Chain OUTPUT (policy ACCEPT)
   target     prot opt source               destination

   Chain POSTROUTING (policy ACCEPT)
   target     prot opt source               destination
   MASQUERADE  all  --  192.168.1.0/24       anywhere

使用 iptables -L -n 查看端口是否开启

   `Chain INPUT (policy ACCEPT)
   target     prot opt source               destination         
   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:443

   Chain FORWARD (policy ACCEPT)
   target     prot opt source               destination         

   Chain OUTPUT (policy ACCEPT)
   target     prot opt source               destination         

测试 OCserv #

在服务器端启动 OpenConnect Server。

sudo ocserv -f -d 1

Client 配卓 #

iOS #

APP Store 搜索 Cisco AnyConnect,安装此 APP.

在Connections下加入新的VPN配置,在服务器地址栏目上填入对应的IP/Hostname和TCP端口(我们的例子就是1.2.3.4:9000)

然后到设置标签页下暂时禁用“阻止不信任的服务器”选项。首次连接,AnyConnect会提示你这是不信任证书,如果你之前的服务器证书模板的cn没写错的话(我们的例子是1.2.3.4),你可以接受并导入该证书(可在诊断标签页的证书菜单里的服务器证书列表看到)。以后即便启用“阻止不信任的服务器”选项,也不会报错了(和SSH首次登陆类似)。

Android #

安装 openconnect。

Windows #

安装 Cisco AnyConnect 客户端,输入服务器地址和端口连接。

Linux #

安装 openconnect 即可,连接命令:

sudo openconnect -u wogong test.wogong.net:400

Advance #

登陆方式——密码登录 #

较为简单,便于和其他小伙伴分享。

sudo ocpasswd -c /etc/ocserv/ocpasswd your-username

登陆方式——证书登录 #

先准备好certtool命令。

sudo apt-get install gnutls-bin

创建CA

mkdir certificates
cd certificates

CA模板,创建ca.tmpl,按需填写,这里的cn和organization可以随便填。

cn = "Your CA name" 
organization = "Your fancy name" 
serial = 1 
expiration_days = 3650
ca 
signing_key 
cert_signing_key 
crl_signing_key

CA密钥

certtool --generate-privkey --outfile ca-key.pem

CA证书

certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem

同理,我们用CA签名,生成服务器证书。先创建server.tmpl模板。这里的cn项必须对应你最终提供服务的hostname或IP,否则AnyConnect客户端将无法正确导入证书。

cn = "Your hostname or IP" 
organization = "Your fancy name" 
expiration_days = 3650
signing_key 
encryption_key
tls_www_server

Server密钥

certtool --generate-privkey --outfile server-key.pem

Server证书

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

将CA,Server证书与密钥复制到以下文件夹

sudo cp ca-cert.pem /etc/ssl/private/my-ca-cert.pem
sudo cp server-cert.pem /etc/ssl/private/my-server-cert.pem
sudo cp server-key.pem /etc/ssl/private/my-server-key.pem

为AnyConnect建个客户端证书

和服务器端证书的步骤基本相同。回到之前的certificates文件夹。

创建user.tmpl

cn = "some random name"
unit = "some random unit"
expiration_days = 365
signing_key
tls_www_client

User密钥

certtool --generate-privkey --outfile user-key.pem

User证书

certtool --generate-certificate --load-privkey user-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template user.tmpl --outfile user-cert.pem

然后要将证书和密钥转为PKCS12的格式。

certtool --to-p12 --load-privkey user-key.pem --pkcs-cipher 3des-pkcs12 --load-certificate user-cert.pem --outfile user.p12 --outder

然后我们要通过URL将user.p12文件导入AnyConnect,具体位置在诊断标签页的证书栏目下。如果你的服务器已经有Nginx/Apache服务,只要传到一个可以访问的URL路径下即可。另一个选择是将user.p12复制到本地,建立一个HTTP服务(例如用node.js)。

导入成功之后,将对应的VPN设置的高级设置部分的证书栏目,改为导入的这张证书。

最后我们要调整下OCserv的配置——

sudo nano /etc/ocserv/ocserv.conf

修改以下内容

# 改为证书登陆,注释掉原来的登陆模式
auth = "certificate"

# 证书认证不支持这个选项,注释掉这行
#listen-clear-file = /var/run/ocserv-conn.socket

# 启用证书验证
ca-cert = /etc/ssl/private/my-ca-cert.pem

重启OCserv服务,确认VPN无需密码就可以正常登陆。

iOS 导入客户端证书 #

Windows 导入客户端证书 #

开始菜单搜索“cmd”,打开后输入 mmc(Microsoft 管理控制台)

“文件”-“添加/删除管理单元”,添加“证书”单元,证书单元的弹出窗口中一定要选“计算机账户”,之后选“本地计算机”,确定。

在左边的“控制台根节点”下选择“证书”-“个人”,然后选右边的“更多操作”-“所有任务”-“导入”打开证书导入窗口。选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。

下一步“证书存储”选“个人”,导入成功后,把导入的 CA 证书复制到“受信任的根证书颁发机构”的证书文件夹里面,

打开剩下的那个私人证书,看一下有没有显示“您有一个与该证书对应的私钥”,以及“证书路径”下面是不是显示“该证书没有问题”然后关闭 mmc,提示“将控制台设置存入控制台1吗”,选“否”即可,至此,证书导入完成。

开启 HTTPS #

准备好 HTTPS 证书,可以使用 let’sencrypt 生成免费的证书,假设证书名称分别为 domain.key 和 chained.pem,其配置如下:

# 采用 CA 签发的 SSL 证书, 支持 HTTPS,避免客户端连接时出现证书不受信任的警告
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem

路由设置 #

no-route 指定不走vpn的ip段 route 指定走vpn的ip段 二者不能同时使用

Refrence #

[^1] 折腾笔记:架设OpenConnect Server给iPhone提供更顺畅的网络生活http://bitinn.net/11084/ [^2] https://www.linode.com/docs/security/securing-your-server [^3] http://www.infradead.org/ocserv/manual.html [^4] http://www.infradead.org/ocserv/download.html [^6] https://www.vultr.com/docs/setup-openconnect-vpn-server-for-cisco-anyconnect-on-ubuntu-14-04-x64