这里的Linux底层我采用esxi的方式搭建,这篇文章主要的目的就是在家通过设置内网DNS实现内网服务的自动解析,在外网通过frp远程连接openvpn进入内网,通过还可以将esxi ui界面映射到公网。使我不在家的时候也可以访问到,同时通过openvpn push 路由,连接到openvpn会自动分发内网的DNS服务,从而实现内网解析通过openvpn登录的方式也可以使用到~
在搭建之前,大家可以先看一下效果图
由于公司没有多余的服务器,无法进行学习。购买云主机不是很划算,首先我是采用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、frp需要在内外网安装一下,其余了服务都安装在内网都可以
DNS
DNS这里我们使用DNSmasq,DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。相比于bind,DNSmasq配置更加简单
关于dns详细介绍可以参考下面的文章
架构师之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进行控制
如果不关闭可能造成无法重置的问题
服务启动完毕后,我们可以测一下
[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
手动修改DNS服务器地址
配置完毕后解析ESXI服务器查看是否正常,检查网页是否访问正常即可
这里DNS设置完毕,这里DNS只会解析本地我们设置的域名,百度等不受影响 (主要注意关闭防火墙,开放53端口)
OpenVPN
关于OpenVPN的相关配置,大家可以看一下之前的文章
CentOS 7 搭建OpenVPN服务器
新闻联播老司机
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之前可以查阅之前的文章,相对于还是比较简单的
VMware vSphere 6.5 搭建
新闻联播老司机
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"; } }
访问测试
大家如果有什么问题,欢迎在评论区留言~
相关文章:
- CentOS 7 搭建OpenVPN服务器
- OpenVPN 设置账号密码登录
- 详解DNS BIND配置及原理
- OpenVPN 一键部署脚本