USAGI NOTE | Anything open

U酱收藏了一篇笔记,小兔报告说。
据小兔观察,主要的内容是:
OpenConnect,一种兼容Cisco AnyConnect的虚拟专用网络的搭建方法


起因

每次被问到用什么VPN看星星的时候,
活性酱总要长叹一口气
因为说实话,活性酱不用VPN啊

不过这句话到此为止了。
之前玩了一阵子Samba,
虽然公网的IPv4没法进入校园网,
却发现IPv6还是可以访问活性酱的硬盘;
被看光了的活性酱觉得非常不妙👾

把端口的开放范围限制到LAN地址之后
活性酱想了想怎么连接回来;
代理服务器就不是一个很好的办法,
虽然建立很容易,但是一方面
资源管理器不吃这一套
一方面肯定还会和平时看星星冲突
所以活性酱需要做一个虚拟专用网络,
并且是可以自定义路由的那种

很快活性酱就盯上了OpenConnect,
姑且算是Cisco AnyConnect的开源实现;
思科家的这项技术有很多企业采用
活性酱也想沾沾它的光

杂谈

首先需要一台稳定在线的服务器,绑定好动态域名解析
在活性酱这里,是使用了dynv6.com的蜗牛星际 → 参考资料
此外树莓派也是可以的

虽然它们的apt仓库里都有ocserv的包
不过实际测试中遇到了异常情况
Samba上传稍微大一些的文件时
速度为0并且一段时间后报错
其次包里用的是socket-activated的配置
配置文件里设定的绑定端口会被忽略
需要编辑socket单元配置文件,比较绕弯
总之,用编译的会比较好

虽然可以用思科的AnyConnect客户端来连接
特别是从Win10商店里安装的话,
可以整合到Win10自己的VPN设置里去
但是其传输时速度波动稍大一些
而且还必须每次询问密码,建立连接的等待时间也长
所以,还是OpenConnect自有客户端香的说

客户端下载地址

Windows/MacOS:GitHub:openconnect-gui

Android:Google Play:OpenConnect

本业

编译安装ocserv

  1. 先来下载并解压源码包
    ftp://ftp.infradead.org/pub/ocserv/
    提示:解压xz归档文件的命令是tar -Jxvf

  2. 安装依赖项
    参考文档:https://gitlab.com/openconnect/ocserv
    偶尔会遇到没有pkg-config的老古董
    就加上一条apt install pkg-config -y

# 必需依赖
apt install libgnutls28-dev libev-dev -y
# 可选依赖
apt install libwrap0-dev libpam0g-dev liblz4-dev libseccomp-dev \
    libreadline-dev libnl-route-3-dev libkrb5-dev libradcli-dev -y
  1. 编译和安装
    进入源码文件夹执行./configure && make && make install

修改配置文件

  1. 从源码包复制示例配置文件
mkdir -p /etc/ocserv
cp doc/sample.config /etc/ocserv/ocserv.conf
  1. 修改配置文件
    vim /etc/ocserv/ocserv.conf
    修改下列的配置项,其余的默认即可
  • 采用密码认证
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
  • 设置绑定端口
    别忘了在防火墙上打洞
tcp-port = 4343
udp-port = 4343
  • 设置服务端证书
    使用被浏览器承认的SSL证书就不会报服务器不安全的错误
    certbot签一下很容易的,实在需要自签请参考文末的段落
server-cert = /etc/letsencrypt/live/example.dynv6.net/fullchain.pem
server-key = /etc/letsencrypt/live/example.dynv6.net/privkey.pem
  • 开启MTU探测,据说有利于传输性能(但是没有做对照)
try-mtu-discovery = true
  • 默认广播域名,不太确定有没有实际作用;
    如果没有解析就注释掉也无妨
default-domain = example.dynv6.net
  • 客户端的地址池,因为是通过一层NAT接入的
    所以并不是要和被连接的局域网重合的
ipv4-network = 192.168.2.0
ipv4-netmask = 255.255.255.0
  • 由于只是连回局域网,无需DNS,将其注释掉
# dns = 0.0.0.0
  • 路由规则,根据被连接的局域网填写
    注释掉所有no-route,两者不可共存
route = 192.168.1.0/255.255.255.0
  • 末尾还有一段用不到的演示配置,最好注释或者直接杀了
[vhost:www.example.com]
auth = "certificate"

ca-cert = ../tests/certs/ca.pem

# The certificate set here must include a 'dns_name' corresponding to
# the virtual host name.

server-cert = ../tests/certs/server-cert-secp521r1.pem
server-key = ../tests/certs/server-key-secp521r1.pem

ipv4-network = 192.168.2.0
ipv4-netmask = 255.255.255.0

cert-user-oid = 0.9.2342.19200300.100.1.1

测试运行

  1. 设置密码认证
    执行ocpasswd $USERNAME,像平时passwd那样设定VPN用户的密码
    默认写入到/etc/ocserv/ocpasswd

  2. 前台测试服务端
    记得打开防火墙
    执行ocserv -f以使服务端在前台运行
    用OpenConnect或AnyConnect客户端测试连接

注册成服务

从源码包里就能找到systemd的单元文件,使用standalone版的会更方便部署

cp doc/systemd/standalone/ocserv.service /etc/systemd/system
systemctl daemon-reload
systemctl enable ocserv
systemctl start ocserv

密码认证的OpenConnect就部署完成了

外道

稍微费一点事,可以使用证书认证
首先,来填一下这些变量的值吧:

CA_NAME=
USER_NAME=
# cat /etc/ocserv/ocserv.conf | grep 'cert-user-oid'
# 默认都是0.9.2342.19200300.100.1.1的亚子
CERT_USER_OID=

现在变量有了,可以一锅煮把私钥和CA证书做出来,保质期十年呢
这份证书也可以用来当SSL证书

cd /etc/ocserv
openssl req -x509 -new -nodes -days 3650 -newkey rsa:4096 -keyout CA_NAME.key -outCA_NAME.crt

然后,把用户的私钥做出来,再变成一个签发请求

openssl genrsa -out USER_NAME.key 4096
openssl req -new -keyUSER_NAME.key -out USER_NAME.csr -subj "/UID=CERT_USER_OID/CN=$USER_NAME"

给csr签出证书,连同私钥一起安全地传到客户端,而CA证书本身传不传均可;
客户端没有安装CA证书或者CA证书的CN字段与地址不匹配
都只会产生一个可以手动允许的警告罢了

openssl x509 -req -CAcreateserial -in USER_NAME.csr -CACA_NAME.crt -CAkey CA_NAME.key -outUSER_NAME.crt -days 365

那边那个用QQ传文件到手机的,求你用密码认证吧 在互联网上留有副本的证书认证是没有安全性可言的 安全的传输办法有SCP、SFTP和物理数据线

最后,把ocserv.conf的认证配置修改后重启服务即可

auth = "certificate"
ca-cert = /etc/ocserv/CA_NAME.crt

后记

虽然活性酱很认真的把写过的教程在干净系统上重新复习了一遍,修正了描述不准确的地方
但是zerotier它真的很香(小声)

点赞
  1. yyy说道:

    活性酱太强啦~ ٩(ˊᗜˋ*)و

发表评论

电子邮件地址不会被公开。必填项已用 * 标注