• 借助FRP反向代理实现内网穿透



    一、frp 是什么?

    frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

    frp原理
    frp原理

    二、frp的文档

    三、frp的代码

    https://github.com/fatedier/frp/

    四、frp的下载

    https://github.com/fatedier/frp/releases/tag/v0.33.0

    一般选择:

    • frp_0.33.0_linux_amd64.tar.gz
      解压之后frps开头是服务端、frpc开头的是客户端,并包括各自的配置样例文件。另外,systemd是启动关闭服务用的。

    • frp_0.33.0_windows_amd64.zip

    五、服务端配置要点

    cp frps.ini /etc/frp/frps.ini
    vim /etc/frp/frps.ini
    ========================================================================
    [common]
    bind_port = 7000
    vhost_http_port = 8080
    # 配置dashboard可以使用web界面管理frp
    # 通过 http://[server_addr]:7500 访问 Dashboard 界面,用户名密码默认都为 admin。
    dashboard_addr = 0.0.0.0
    dashboard_port = 7500
    dashboard_user = admin
    dashboard_pwd = admin
    
    cp frps /usr/bin
    
    cd systemd
    cp frps.service /usr/lib/systemd/system
    
    systemctl start frps.service
    systemctl status frps.service
    systemctl enable frps.service
    

    六、客户端配置要点

    cp frpc.ini /etc/frp/frpc.ini
    
    vim frpc.ini
    ==================================================================
    [common]
    server_addr=x.x.x.x # frps的地址
    server_port=7000
    
    [web]
    type=http
    local_ip=127.0.0.1
    local_port=8080
    custom_domains=a.domain.com
    
    # 测试
    ./frpc -c frpc.ini 
    
    # 加入系统服务
    cp frpc /usr/bin
    
    cd systemd
    cp frpc.service /usr/lib/systemd/system
    
    systemctl start frpc.service
    systemctl status frpc.service
    systemctl enable frpc.service
    

    七、Windows下如何注册服务

    下载winsw开源软件注册windows系统服务。
    winsw的下载地址:https://github.com/winsw/winsw

    下载好后把winsw.exe放在frpc的同级目录并且编写一个xml配置文件(myapp.xml)

    <service>
        <id>frp</id>
        <name>frp这里是服务的名称</name>
        <description>这里是服务的介绍,随便写</description>
        <executable>frpc</executable>这里是运行的软件名    
        <arguments>-c frpc.ini</arguments>这里是运行的软件配置文件    
        <onfailure action=”restart” delay=”60 sec”/>
        <onfailure action=”restart” delay=”120 sec”/>
        <logmode>reset</logmode>
    </service>
    

    然后以管理员启动cmd命令窗口,cd到frp目录,执行两条命令winsw install和winsw start就行了。
    如果要卸载先执行winsw stop再执行winsw uninstall。

    八、为本地 HTTP 服务启用 HTTPS

    通过 https2http 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。
    frps.ini 内容如下:

    [common]
    bind_port = 7000
    

    frpc.ini 内容如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [test_htts2http]
    type = https
    custom_domains = test.yourdomain.com
    
    plugin = https2http
    plugin_local_addr = 127.0.0.1:80
    
    # HTTPS 证书相关的配置
    plugin_crt_path = ./server.crt
    plugin_key_path = ./server.key
    plugin_host_header_rewrite = 127.0.0.1
    plugin_header_X-From-Where = frp
    

    分别启动 frps 和 frpc。
    通过浏览器访问 https://test.yourdomain.com

    九、安全地暴露内网服务

    对于某些服务来说如果直接暴露于公网上将会存在安全隐患。

    使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端。

    frps.ini 内容如下:

    [common]
    bind_port = 7000
    

    在需要暴露到内网的机器上部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [secret_ssh]
    type = stcp
    # 只有 sk 一致的用户才能访问到此服务
    sk = abcdefg
    local_ip = 127.0.0.1
    local_port = 22
    

    在想要访问内网服务的机器上也部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [secret_ssh_visitor]
    type = stcp
    # stcp 的访问者
    role = visitor
    # 要访问的 stcp 代理的名字
    server_name = secret_ssh
    sk = abcdefg
    # 绑定本地端口用于访问 SSH 服务
    bind_addr = 127.0.0.1
    bind_port = 6000
    

    通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 test@127.0.0.1
    

    十、转发 DNS 查询请求

    DNS 查询请求通常使用 UDP 协议,frp 支持对内网 UDP 服务的穿透,配置方式和 TCP 基本一致。

    frps.ini 内容如下:

    [common]
    bind_port = 7000
    

    frpc.ini 内容如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [dns]
    type = udp
    local_ip = 8.8.8.8
    local_port = 53
    remote_port = 6000
    

    这里反代了 Google 的 DNS 查询服务器的地址,仅仅用于测试 UDP 代理,并无实际意义。
    分别启动 frps 和 frpc。

    通过 dig 测试 UDP 包转发是否成功,预期会返回 www.baidu.com 域名的解析结果。

    dig @x.x.x.x -p 6000 www.baidu.com
    

    十一、通过自定义域名访问内网的 Web 服务

    HTTP 类型的代理相比于 TCP 类型,不仅在服务端只需要监听一个额外的端口 vhost_http_port 用于接收 HTTP 请求,还额外提供了基于 HTTP 协议的诸多功能。

    修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:

    [common]
    bind_port = 7000
    vhost_http_port = 8080
    

    修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains。

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [web]
    type = http
    local_port = 80
    custom_domains = www.yourdomain.com
    
    [web2]
    type = http
    local_port = 8080
    custom_domains = www.yourdomain2.com
    

    分别启动 frps 和 frpc。

    将 www.yourdomain.com 和 www.yourdomain2.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。

    通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上 80 端口的服务,访问 http://www.yourdomain2.com:8080 则访问到内网机器上 8080 端口的服务。

    十二、安全的SSH内网穿透案例

    • frps的配置(代理服务器)
    vim /etc/frp/frps.ini
    ===========================================================
    [common]
    bind_port = 7000
    privilege_token = serverAuthKey
    
    • frpc的配置(被代理的内网客户端)
    vim /etc/frp/frpc.ini
    ===========================================================
    [common]
    server_addr = 192.168.74.205
    server_port = 7000
    privilege_token = serverAuthKey
    
    [secret_ssh]
    type = stcp
    sk = match2publicUserKey
    local_ip = 127.0.0.1
    local_port = 22
    use_encryption = true
    use_compression = true
    
    • 公网用户的frpc配置
    vim /etc/frp/frpc.ini
    ===========================================================
    [common]
    server_addr = 192.168.74.205
    server_port = 7000
    
    [secret_ssh_visitor]
    type = stcp
    role = visitor
    server_name = secret_ssh
    sk = match2publicUserKey
    bind_addr = 127.0.0.1
    bind_port = 4567
    

    启动测试

    ./frpc -c ./frpc.ini
    ssh -p 4567 bee@127.0.0.1
    

    十三、Win10远程桌面的代理

    被代理的内网服务器 frpc.ini 内容如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [RDP]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 3389
    remote_port = 7002
    

    远端公网用户mstsc,输入x.x.x.x:7002即可内网穿透连接远程桌面。

  • 相关阅读:
    15.5.3 【Task实现细节】状态机的结构
    JavaWeb-EL的11个内置对象
    JavaWeb-EL入门
    JavaWeb-BeanUtils
    JavaWeb-JavaBean
    JavaWeb-JSP动作标签
    JavaWeb-include和taglib指令
    JavaWeb-pageContext对象
    JavaWeb-page指令
    JavaWeb-URL重写
  • 原文地址:https://www.cnblogs.com/cerana/p/13583687.html
Copyright © 2020-2023  润新知