前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自建虚拟专用网络 | 奇怪的知识又增加了

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

作者头像
意大利的猫
发布2021-03-03 11:21:08
2K0
发布2021-03-03 11:21:08
举报
文章被收录于专栏:漫流砂

我是一个喜欢折腾的人,至死方休那种,所以就有了今天这篇文章 为了避免隐私过度泄漏,我选择了自建 NAS 来存储照片视频一类的信息,为了可以像百度云一样使用链接分享文件,需要将 NAS 映射到公网。之前呢,主要是使用frp内网穿透;最近新办了一条宽带,提供公网IP,直接端口转发+DDNS就搞定了 为了团队做实验方便,我购置了一台服务器,装了 ESXI,大量扩展虚拟机。问题来了,总不能新建一个虚拟机就映射几个端口吧,这怎么能忍,于是产生了自建虚拟专用网络的想法

选择方案筛选条件也很简单

  • 免费,最好开源
  • 有好的客户端支持
  • IPSec或者SSL
  • 不复杂、不反人类

问了一小圈,最终选择了 OpenConnect

0x01 搭建服务端

系统选择:Ubuntu Server 18.04 x64

代码语言:javascript
复制
sudo apt update 
sudo apt install ocserv

0x02 配置SSL证书

我这没有申请证书,自己签一个吧,还能咋整

创建存储证书临时文件夹

代码语言:javascript
复制
sudo mkdir /tmp/certificates
sudo cd /tmp/certificates

创建相关文件

代码语言:javascript
复制
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
代码语言:javascript
复制
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"

生成证书

代码语言:javascript
复制
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签署V**证书

代码语言:javascript
复制
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配置目录

代码语言:javascript
复制
sudo cp server-cert.pem server-key.pem /etc/ocserv/

0x03 配置OpenConnect

修改登录方式 使用 Linux 用户名密码进行登录

代码语言:javascript
复制
sudo vim  /etc/ocserv/ocserv.conf

# 修改 auth 为 以下内容
auth = "pam"

修改监听端口 默认80,443是无法映射到公网的,所以选择一个自己喜欢的端口

代码语言:javascript
复制
tcp-port = 8443
udp-port = 8443

OpenConnect网段配置 我家是 192.168.1.0/24 ,我们需要配置一个相对冷门的网段

代码语言:javascript
复制
ipv4-network = 192.168.56.0
ipv4-netmask = 255.255.255.0

配置需要使用OpenConnect访问的网段(192.168.1.0/24)

代码语言:javascript
复制
route = 192.168.1.0/255.255.255.0
代码语言:javascript
复制
sudo vim /etc/sysctl.conf

net.ipv4.ip_forward=1
代码语言:javascript
复制
sudo sysctl -p

配置持久化 iptables

代码语言:javascript
复制
sudo apt install iptables-persistent
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo netfilter-persistent save

0x04 启动OpenConnect

代码语言:javascript
复制
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
  • 获取到 API key 和 secret

创建脚本

代码语言:javascript
复制
#!/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/

有态度,不苟同

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NOP Team 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 搭建服务端
  • 0x02 配置SSL证书
  • 0x03 配置OpenConnect
  • 0x04 启动OpenConnect
  • 0x05 客户端
  • 0x06 端口转发
  • 0x07 DDNS
相关产品与服务
弹性公网 IP
弹性公网 IP(Elastic IP,EIP)是可以独立购买和持有,且在某个地域下固定不变的公网 IP 地址,可以与 CVM、NAT 网关、弹性网卡和高可用虚拟 IP 等云资源绑定,提供访问公网和被公网访问能力;还可与云资源的生命周期解耦合,单独进行操作;同时提供多种计费模式,您可以根据业务特点灵活选择,以降低公网成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档