自建虚拟专用网络 | 奇怪的知识又增加了
我是一个喜欢折腾的人,至死方休那种,所以就有了今天这篇文章
为了避免隐私过度泄漏,我选择了自建 NAS 来存储照片视频一类的信息,为了可以像百度云一样使用链接分享文件,需要将 NAS 映射到公网。之前呢,主要是使用frp内网穿透;最近新办了一条宽带,提供公网IP,直接端口转发+DDNS就搞定了
为了团队做实验方便,我购置了一台服务器,装了 ESXI,大量扩展虚拟机。问题来了,总不能新建一个虚拟机就映射几个端口吧,这怎么能忍,于是产生了自建虚拟专用网络的想法
选择方案筛选条件也很简单
免费,最好开源
有好的客户端支持
IPSec或者SSL
不复杂、不反人类
问了一小圈,最终选择了 OpenConnect
0x01 搭建服务端
系统选择:Ubuntu Server 18.04 x64
sudo apt update
sudo apt install ocserv
0x02 配置SSL证书
我这没有申请证书,自己签一个吧,还能咋整
创建存储证书临时文件夹
sudo mkdir /tmp/certificates
sudo cd /tmp/certificates
创建相关文件
sudo vim ca.tmpl
# 填入以下信息,保持不变也可以
cn = "your organization’s certificate authority"
organization = "your organization"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
sudo vim server.tmpl
# 填入以下信息,保持不变也可以
cn = "a sever's name, usually matches hostname"
organization = "your organization"
serial = 2
expiration_days = 3650
signing_key
encryption_key
tls_www_server
dns_name = "your organization's host name"
#ip_address = "if no hostname uncomment and set the IP address here"
生成证书
sudo certtool --generate-privkey --outfile ca-key.pem
sudo certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
使用CA签署VPN证书
sudo certtool --generate-privkey --outfile server-key.pem
sudo 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
将生成的证书放在openconnect配置目录
sudo cp server-cert.pem server-key.pem /etc/ocserv/
0x03 配置OpenConnect
修改登录方式
使用 Linux 用户名密码进行登录
sudo vim /etc/ocserv/ocserv.conf
# 修改 auth 为 以下内容
auth = "pam"
修改监听端口
默认80,443是无法映射到公网的,所以选择一个自己喜欢的端口
tcp-port = 8443
udp-port = 8443
OpenConnect网段配置
我家是 192.168.1.0/24 ,我们需要配置一个相对冷门的网段
ipv4-network = 192.168.56.0
ipv4-netmask = 255.255.255.0
配置需要使用OpenConnect访问的网段(192.168.1.0/24)
route = 192.168.1.0/255.255.255.0
sudo vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sudo sysctl -p
配置持久化 iptables
sudo apt install iptables-persistent
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo netfilter-persistent save
0x04 启动OpenConnect
sudo systemctl start ocserv
0x05 客户端
https://openconnect.github.io/openconnect-gui/
安卓客户端无法在Android 10上使用,可以使用 AnyConnect 代替,直接在google play中可以下载
0x06 端口转发
如果没有公网IP,那你就直接做frp内网穿透就好,具体是路由器做穿透还是服务器做穿透,那就取决于你了
如果家用宽带有公网IP,那么就在PPPoE认证的路由器上做端口转发,把我们设置的8443端口转发到公网
通过 curl ip.sb 可以查到自己的公网IP,可以使用OpenConnect客户端连接一下试试
0x07 DDNS
DDNS的核心其实非常简单,就是定时的确定自己的ip来更改dns解析记录,我是在godaddy买的域名,所以使用godaddy的api来进行ddns
购买一个域名,并配置A记录指向我们的公网IP
获取 GoDaddy API Key
访问 https://developer.godaddy.com/keys
点击新建key
获取到 API key 和 secret
创建脚本
#!/bin/bash
mydomain="baidu.com"
myhostname="gateway"
gdapikey="api_key:key_secret"
logdest="local7.info"
myip=`curl -s "https://api.ipify.org"`
dnsdata=`curl -s -X GET -H "Authorization: sso-key ${gdapikey}" "https://api.godaddy.com/v1/domains/${mydomain}/records/A/${myhostname}"`
gdip=`echo $dnsdata | cut -d ',' -f 1 | tr -d '"' | cut -d ":" -f 2`
echo "`date '+%Y-%m-%d %H:%M:%S'` - Current External IP is $myip, GoDaddy DNS IP is $gdip"
if [ "$gdip" != "$myip" -a "$myip" != "" ]; then
echo "IP has changed!! Updating on GoDaddy"
curl -s -X PUT "https://api.godaddy.com/v1/domains/${mydomain}/records/A/${myhostname}" -H "Authorization: sso-key ${gdapikey}" -H "Content-Type: application/json" -d "[{\"data\": \"${myip}\"}]"
logger -p $logdest "Changed IP on ${hostname}.${mydomain} from ${gdip} to ${myip}"
fi将 mydomain 的值替换为自己的域名,比如 baidu.com
将 myhostname的值替换为你的字域名,比如 gateway
将 gdapikey 的值按照格式替换为之前获取到的值
保存文件为 /usr/local/sbin/gd-dyndns 并且赋予执行权限
添加到计划任务
sudo crontab -e
# 添加以下内容
*/10 * * * * /usr/local/sbin/gd-dyndns > /dev/null
这样就可以直接在外网直接访问到家里的网络了!
参考链接:
https://yuerblog.cc/2020/11/21/%E5%AE%B6%E5%BA%AD%E6%90%AD%E5%BB%BAopenconnect-vpn/
https://www.instructables.com/Quick-and-Dirty-Dynamic-DNS-Using-GoDaddy/