由于公司没有多余的服务器,无法进行学习。购买云主机不是很划算,首先我是采用esxi作为底层的系统,通过web ui来进行管理控制虚拟机,在esxi中的虚拟机采取网卡桥接的模式进行访问。但是在公司可能就无法访问到服务器,所以我采用frp协议。通过我阿里云的ECS当做通信,并且为了安全起见,我将esxi ui解析的nginx设置只允许内网网段访问,并且安装了openVPN。这样在家里面我直接走内网访问服务器,在公司或者外面的时候通过openVPN进行连接访问
本次架构图
在看架构图之前我们先了解一下什么是frp
frp是一个可用于内网穿透的高性能的反向代理应用,支持tcp、udp协议,为http和https协议提供了额外的能力,且尝试性支持了点对点穿透。
frp架构
frp使用方法
将frps及frps.ini放到具有公网IP的机器上
将frpc及frpc.ini放到具有内网环境的机器上
frp文档及下载地址 https://github.com/fatedier/frp/blob/master/README_zh.md
环境准备
1.一台带有公网IP的机器
2.台式机(服务器、Linux等都可以)
需要的服务
- Nginx (内网外网都可以安装一个)
- Openvpn
- Frp
- DNS
除了nginx、frp需要在内外网安装一下,其余了服务都安装在内网都可以
DNS
DNS这里我们使用DNSmasq
,DNSmasq是一个小巧且方便地用于配置DNS
和DHCP
的工具,适用于小型网络,它提供了DNS
功能和可选择的DHCP
功能。相比于bind,DNSmasq配置更加简单
关于dns详细介绍可以参考下面的文章
安装DNSmasq
这里我们直接使用yum安装,Linux软件仓库已经提供了软件包
yum install -y dnsmasq
配置DNSmasq
DNSmasq配置文件/etc/dnsmasq.conf
[root@ops ~]# cat /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf #resolv-file配置Dnsmasq额外的向流的DNS服务器,如果不开启就使用linux主机默认的/etc/resolv.conf里的nameserver
strict-order #默认情况下Dnsmasq会发送查询到它的任何上游DNS服务器上,如果取消注释,则Dnsmasq则会严格按照/etc/resolv.conf中的DNS Server顺序进行查询。
no-hosts #不使用/etc/hosts
listen-address=192.168.31.101 #设置监听的地址
server=192.168.31.1 #server这行告诉dnsmasq使用DNS服务器进行解析,这里我填写的是路由器的地址
log-queries #开启日志及日志路径
log-facility=/var/log/dnsmasq.log
log-async=20 #启用异步日志记录,缓解阻塞,提高性能。默认队列长度为5,合理值为5-25,最大限制为100
cache-size=10000 #缓存地址数目,提高速
#DNS解析设置
address=/esxi.i4t.com/192.168.31.101
#支持通配符
#下面的nameserver为上级路由器的DNS
[root@ops ~]# cat /etc/resolv.dnsmasq.conf
nameserver 192.168.31.1
接下来我们安装web-ui管理界面webproc
项目文档地址:https://github.com/jpillora/webproc
同样也可以使用docker安装:https://hub.docker.com/r/jpillora/dnsmasq
#安装dnsmasq web-ui
curl https://i.jpillora.com/webproc | bash
mv /root/webproc /usr/bin/
#启动webproc
webproc --configuration-file /etc/dnsmasq.conf -- dnsmasq --no-daemon &
#在启动之后我们先使用命令停掉dnsmasq (请注意查看error日志)
systemctl stop dnsmasq
通过web ui进行控制
如果不关闭可能造成无法重置的问题
服务启动完毕后,我们可以测一下
Linux配置方法
[root@ops ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.31.101
#使用dig命令测试
[root@ops ~]# dig esxi.i4t.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> esxi.i4t.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35526
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;esxi.i4t.com. IN A
;; ANSWER SECTION:
esxi.i4t.com. 0 IN A 192.168.31.101
;; Query time: 0 msec
;; SERVER: 192.168.31.101#53(192.168.31.101)
;; WHEN: Sun Aug 09 21:30:13 CST 2020
;; MSG SIZE rcvd: 46
#并且我们还有DNS缓存,所以在Query time后面会显示0 msec
- Windows 配置方法
- Mac 配置方法
手动修改DNS服务器地址
配置完毕后解析ESXI服务器查看是否正常,检查网页是否访问正常即可
这里DNS设置完毕,这里DNS只会解析本地我们设置的域名,百度等不受影响 (主要注意关闭防火墙,开放53端口)
OpenVPN
Server端配置如下
简单说明一下,内网IP为192.168.31.0/24
,openvpn分配网段为10.8.0.0
DNS地址我们设置为上面安装的DNS服务的服务器
port 1194
proto tcp
dev tun
ca keys/ca.crt
cert keys/server.crt
key keys/server.key # This file should be kept secret
dh keys/dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.31.0 255.255.255.0"
push "dhcp-option DNS 192.168.31.101"
keepalive 10 120
tls-auth keys/ta.key 0 # This file is secret
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
username-as-common-name
verify-client-cert none
客户端配置如下 (这里采取了账号密码的方式登录)
[root@ops openvpn]# cat client.ovpn
client
dev tun
proto tcp
remote 1.1.1.1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-auth ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3
auth-user-pass
Frp
Server端在阿里云服务器上
Client端在内网机器上
首先我们先下载frp软件包
wget http://down.i4t.com/frp_0.33.0_linux_amd64.tar.gz
mv frp_0.33.0_linux_amd64 /usr/local/frp_0.33.0_linux_amd64
ln -s /usr/local/frp_0.33.0_linux_amd64 /usr/local/frp
#server和client都这样操作即可
Server端配置
接下来在阿里云服务器配置frp_Server端
#修改配置文件
[root@abcdocker frp]# cat frps.ini
[common]
bind_port = 7007 #服务端端口
token = 123321 #需要和客户端相同
#设置启动文件
cp /usr/local/frp/systemd/frps.service /lib/systemd/system/
systemctl enable frps
systemctl start frps
#检查端口是否正常开启
[root@abcdocker ~]# netstat -lntup|grep 7007
tcp6 0 0 :::7007 :::* LISTEN 5561/frps
Client端配置
client端我们在内网的机器安装就可以,只要能上百度就可以,不需要公网IP
客户端
[root@ops openvpn]# cat /usr/local/frp/frpc.ini
[common]
server_addr = 39.1.1.1 #server地址
server_port = 7007 #server端口
token = 123321 #token验证
[ssh]
type = tcp
local_ip = 127.0.0.1 #内网需要暴露的IP
local_port = 22 #内网端口
remote_port = 12 #外网端口
use_encryption = true #将 FRP 客户端 与 FRP 服务端之间的通信内容加密传输,将会有效防止流量被拦截
use_compression = true #对传输内容进行压缩,可以有效减小 FRP 客户端 与 FRP 服务端之间的网络流量,来加快流量转发速度,但是会额外消耗一些 CPU 资源。
[esxi]
type = tcp
local_ip = 192.168.31.100
local_port = 443
remote_port = 5001
custom_domains = esxi.i4t.com #绑定域名
[openvpn]
type = tcp
local_port = 1194
local_ip = 192.168.31.101
remote_port = 1194
上面我们映射了openvpn还有esxi以及ssh
同时,针对frp server端口也有对应的流量监控,我们只需要在配置文件中添加即可
[root@abcdocker frp]# cat frps.ini
[common]
bind_port = 7007
token = 123321
dashboard_port = 6000 #frps 管理界面端口
dashboard_user = root #frps 管理界面用户名
dashboard_pwd = 123321 #frps 管理界面密码
Web UI 界面如下
更多FRP内容可以参考 一款很好用的内网穿透工具--FRP
ESXI
关于esxi之前可以查阅之前的文章,相对于还是比较简单的
Nginx
这里的Nginx我主要用于代理esxi中的UI界面,配置也很简单。公网和内网的配置几乎是没变化
其中proxy代理需要为https,并且由于我们在网页需要打开控制台,需要添加 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
#内网的Nginx
[root@ops extra]# cat esxi.i4t.com.conf
server {
listen 80;
server_name esxi.i4t.com;
return 301 https://$host$request_uri$is_args$args;
}
server {
listen 443 ssl;
access_log logs/access_esxi.log main;
index index.html index.htm;
server_name esxi.i4t.com;
ssl_certificate /usr/local/nginx/ssl/esxi.i4t.com.pem;
ssl_certificate_key /usr/local/nginx/ssl/esxi.i4t.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass https://192.168.31.100;
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
#需要注意的是proxy_pass这里的地址要为https才可以
#公网对外访问的nginx
[root@abcdocker extra]# cat esxi.i4t.com.conf
server {
listen 80;
server_name esxi.i4t.com;
return 301 https://$host$request_uri$is_args$args;
}
server {
listen 443 ssl http2;
access_log logs/access_esxi.log main;
index index.html index.htm;
server_name esxi.i4t.com;
ssl_certificate /usr/local/nginx/ssl/esxi.i4t.com.pem;
ssl_certificate_key /usr/local/nginx/ssl/esxi.i4t.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass https://127.0.0.1:5001;
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
访问测试
非常棒,请问,50左右人用vpn大约需要多少带宽啊