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
-
先来下载并解压源码包
ftp://ftp.infradead.org/pub/ocserv/
提示:解压xz归档文件的命令是tar -Jxvf
-
安装依赖项
参考文档: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
- 编译和安装
进入源码文件夹执行./configure && make && make install
修改配置文件
- 从源码包复制示例配置文件
mkdir -p /etc/ocserv
cp doc/sample.config /etc/ocserv/ocserv.conf
- 修改配置文件
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
测试运行
-
设置密码认证
执行ocpasswd $USERNAME
,像平时passwd
那样设定VPN用户的密码
默认写入到/etc/ocserv/ocpasswd
-
前台测试服务端
记得打开防火墙
执行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 -out $CA_NAME.crt
然后,把用户的私钥做出来,再变成一个签发请求
openssl genrsa -out $USER_NAME.key 4096
openssl req -new -key $USER_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 -CA $CA_NAME.crt -CAkey $CA_NAME.key -out $USER_NAME.crt -days 365
那边那个用QQ传文件到手机的,求你用密码认证吧 在互联网上留有副本的证书认证是没有安全性可言的 安全的传输办法有SCP、SFTP和物理数据线
最后,把ocserv.conf
的认证配置修改后重启服务即可
auth = "certificate"
ca-cert = /etc/ocserv/CA_NAME.crt
后记
虽然活性酱很认真的把写过的教程在干净系统上重新复习了一遍,修正了描述不准确的地方
但是zerotier它真的很香(小声)