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

释放双眼,带上耳机,听听看~!
这里的Linux底层我采用esxi的方式搭建,这篇文章主要的目的就是在家通过设置内网DNS实现内网服务的自动解析,在外网通过frp远程连接openvpn进入内网,通过还可以将esxi ui界面映射到公网。使我不在家的时候也可以访问到,同时通过openvpn push 路由,连接到openvpn会自动分发内网的DNS服务,从而实现内网解析通过openvpn登录的方式也可以使用到~
🤖 由 ChatGPT 生成的文章摘要

在搭建之前,大家可以先看一下效果图


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

本次架构图 利用FRP和Openvpn实现内网穿透外网访问

在看架构图之前我们先了解一下什么是frp

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

frp架构

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

frp使用方法

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

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

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详细介绍可以参考下面的文章

架构师之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进行控制

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

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

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

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

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

  • Mac 配置方法

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

手动修改DNS服务器地址

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

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

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

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

这里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和Openvpn实现内网穿透外网访问

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

访问测试

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

大家如果有什么问题,欢迎在评论区留言~

给TA打赏
共{{data.count}}人
人已打赏
Linux

搭建分布式文件系统FastDFS集群

2020-7-3 16:39:31

Linux

详解DNS BIND配置及原理

2020-9-1 17:20:56

13 条回复 A文章作者 M管理员
  1. 氐池

    感谢楼主大大

  2. jojoheihu

    膜拜大佬,我现在都不想自己配置了,都是偶尔测试的时候就用用蜻蜓映射,还挺好的。

  3. 赵云

    这网站运营得多少钱

  4. 蘑菇云下的胡杨

    frp我实现了外面到 家里esxi虚拟机 的远程ssh,,,但是想直接在外面远程登上idrac和esxi的控制台 要怎么搞?

    • 新闻联播老司机

      [esxi]
      type = tcp
      local_ip = 192.168.31.100
      local_port = 443
      remote_port = 5001
      custom_domains = esxi.i4t.com #绑定域名

      外网访问地址就是frp server IP:5001,然后在通过nginx代理,nginx直接upstream代理127.0.0.1:5001即可

  5. Nylshh

    感谢楼主!

  6. […] […]

  7. Peter

    我问一下 我你这个配置的
    #下面的nameserver为上级路由器的DNS
    [root@ops ~]# cat /etc/resolv.dnsmasq.conf
    nameserver 192.168.31.1

    但是为什么 你访问这个确是 这个
    [root@ops ~]# cat /etc/resolv.conf
    # Generated by NetworkManager
    nameserver 192.168.31.101

    • Peter

      你是什么地方设置的 nameserver 192.168.31.101 我看你配置文件里面是不是没有啊

    • 新闻联播老司机

      这是在openvpn服务器上面的dns地址

      [root@ops ~]# cat /etc/resolv.dnsmasq.conf
      nameserver 192.168.31.1

      这个文件就是linux上的dns,我将linux的dns指给这个了

  8. user11078

    大佬,请问架构图是使用什么画的呢?谢谢

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索