利用FRP和Openvpn实现内网穿透外网访问

由于公司没有多余的服务器,无法进行学习。购买云主机不是很划算,首先我是采用esxi作为底层的系统,通过web ui来进行管理控制虚拟机,在esxi中的虚拟机采取网卡桥接的模式进行访问。但是在公司可能就无法访问到服务器,所以我采用frp协议。通过我阿里云的ECS当做通信,并且为了安全起见,我将esxi ui解析的nginx设置只允许内网网段访问,并且安装了openVPN。这样在家里面我直接走内网访问服务器,在公司或者外面的时候通过openVPN进行连接访问

本次架构图
image_1ef3qr1v1m7hlri1lrjov630q13.png-167.1kB
在看架构图之前我们先了解一下什么是frp

frp是一个可用于内网穿透的高性能的反向代理应用,支持tcp、udp协议,为http和https协议提供了额外的能力,且尝试性支持了点对点穿透。

frp架构
image_1ef3e4ors60q1e1h1m0s1v91j0g9.png-17.8kB

frp使用方法

将frps及frps.ini放到具有公网IP的机器上
将frpc及frpc.ini放到具有内网环境的机器上

image_1ef3q70he10hl1ki8bm2n9m1nggm.png-23.8kB

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是一个小巧且方便地用于配置DNSDHCP的工具,适用于小型网络,它提供了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进行控制

如果不关闭可能造成无法重置的问题

image_1ef9esrhv1t36sqajrn1jmp14s89.png-67.3kB

服务启动完毕后,我们可以测一下

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 配置方法

image_1ef9mvve51qfg15npuu82bpigc34.png-75.9kB

  • Mac 配置方法
    image_1ef9mqsn515u71sgmud265413vfm.png-449.9kB

手动修改DNS服务器地址
image_1ef9mrg5alr73ka4qoouf1i5h1g.png-165.4kB

配置完毕后解析ESXI服务器查看是否正常,检查网页是否访问正常即可

image_1ef9ms4cpk1b17891fcfks14582a.png-639.5kB

image_1ef9msdi43sg3vt47u1hc918fn2n.png-294.5kB

这里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 界面如下
image_1ef9m3f3d1nkrjq71vhd1ocip8n9.png-50.8kB

更多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";
        }
}

访问测试

image_1ef9n3mmo1ep9729k6r1rifn4u3h.png-1272.9kB

esxi

ESXI7.0 搭建黑群晖DS918+教程

2021-7-13 20:47:32

frp群辉

内网穿透Nas 基于Frp实现群晖的远程访问

2021-7-16 0:08:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索