本来我是用群晖自带的VPN Server搭建OpenVPN服务端来访问家里内网。由于家里没有公网IP,通过国外VPS搭建frp做端口映射,但是如此一来OpenVPN连接就会被墙检测到协议并阻断,可以通过再搭建一个SS(R)或者其他代理作为OpenVPN前置代理解决,但是太过麻烦。ocserv (AnyConnect VPN服务端) 属于SSL VPN,协议特征与HTTPS类似,因此不会被检测并阻断。下文介绍在群晖使用Docker搭建ocserv并设置只访问内网。

使用的Docker镜像:
https://hub.docker.com/r/vimagick/ocserv/
GitHub地址:
https://github.com/vimagick/dockerfiles/tree/master/ocserv

SSH登录群晖,输入sudo -i然后输入密码进入ROOT;
输入docker pull vimagick/ocserv拉取镜像;
输入mkdir ocserv创建文件夹;
输入cd ocserv进入文件夹;
输入vi docker-compose.yml创建docker-compose配置文件;
输入:set paste使vi进入粘贴模式,可让粘贴内容不自动对齐;
按i键输入以下内容:

ocserv:
	image: vimagick/ocserv
	ports:
	- "4443:443/tcp"
	- "4443:443/udp"
	environment:
	- VPN_DOMAIN=vpn.easypi.pro
	- VPN_NETWORK=10.20.30.0
	- VPN_NETMASK=255.255.255.0
	- LAN_NETWORK=192.168.0.0
	- LAN_NETMASK=255.255.0.0
	- VPN_USERNAME=username
	- VPN_PASSWORD=password
	cap_add:
	- NET_ADMIN
	restart: always

修改vpn.easypi.pro为将来访问群晖的域名,username为用户名,password为密码,其他端口设置也可修改,修改完成后按Esc键然后输入两个大写Z保存退出。

输入docker-compose up -d启动容器;
下载AnyConnect客户端;
在客户端服务器地址中输入[群晖的域名或IP]:4443,点击连接,然后输入用户名密码就可以访问群晖了。
说明:
1. 提示证书错误是因为服务端没有使用有效证书,解决方法是要么配置有效证书,要么在客户端设置里面允许不安全的服务器证书。
2. 如果要用frp做端口映射,需要将群晖4443端口转发,然后AnyConnect客户端连接地址改为frp服务器地址就可以了。

此时搭好的VPN默认会让所有流量走VPN,下面介绍如何只走内网流量:
进入ocserv容器shell:docker-compose exec ocserv sh

如需修改VPN用户密码执行ocpasswd -c /etc/ocserv/ocpasswd username,username为用户名。

修改ocserv.conf:cd /etc/ocserv/; vi ocserv.conf
修改以下片段:

修改路由配置,让192.168.0.0/255.255.0.0通过VPN访问:

# Routes to be forwarded to the client. If you need the
# client to forward routes to the server, you may use the
# config-per-user/group or even connect and disconnect scripts.
#
# To set the server as the default gateway for the client just
# comment out all routes from the server, or use the special keyword
# 'default'.

#route = 10.10.10.0/255.255.255.0
route = 192.168.0.0/255.255.0.0
#route = fef4:db8:1000:1001::/64
#route = default

# Subsets of the routes above that will not be routed by
# the server.

#no-route = 192.168.0.0/255.255.0.0

修改DNS配置,禁止转发DNS请求:

# Whether to tunnel all DNS queries via the VPN. This is the default
# when a default route is set.
tunnel-all-dns = false

# The advertized DNS server. Use multiple lines for
# multiple servers.
# dns = fc00::4be0
#dns = 8.8.8.8

退出重启容器

exit
docker-compose restart

ocserv配置文件参考:http://ocserv.gitlab.io/www/manual.html

参与评论