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

2023年 5月 4日 134.3k 0

这里的Linux底层我采用esxi的方式搭建,这篇文章主要的目的就是在家通过设置内网DNS实现内网服务的自动解析,在外网通过frp远程连接openvpn进入内网,通过还可以将esxi ui界面映射到公网。使我不在家的时候也可以访问到,同时通过openvpn push 路由,连接到openvpn会自动分发内网的DNS服务,从而实现内网解析通过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是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。相比于bind,DNSmasq配置更加简单
    关于dns详细介绍可以参考下面的文章

    架构师之DNS实战

    新闻联播老司机

  • 16年8月17日
  • 喜欢:0
  • 浏览:831
  • 安装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

    关于OpenVPN的相关配置,大家可以看一下之前的文章

    CentOS 7 搭建OpenVPN服务器

    新闻联播老司机

  • 20年2月4日
  • 喜欢:1
  • 浏览:35.4k
  • OpenVPN 设置账号密码登录

    新闻联播老司机

  • 20年2月4日
  • 喜欢:0
  • 浏览:30.8k
  • 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之前可以查阅之前的文章,相对于还是比较简单的

    VMware vSphere 6.5 搭建

    新闻联播老司机

  • 17年10月12日
  • 喜欢:0
  • 浏览:2.3k
  • 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
    大家如果有什么问题,欢迎在评论区留言~

    相关文章:

    1. CentOS 7 搭建OpenVPN服务器
    2. OpenVPN 设置账号密码登录
    3. 详解DNS BIND配置及原理
    4. OpenVPN 一键部署脚本

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论