本来我是用群晖自带的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