查看原文
其他

自建虚拟专用网络 | 奇怪的知识又增加了

意大利的猫 漫流砂 2021-04-26


我是一个喜欢折腾的人,至死方休那种,所以就有了今天这篇文章

为了避免隐私过度泄漏,我选择了自建 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/



有态度,不苟同



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存