美文网首页
FRP 内网穿透

FRP 内网穿透

作者: 几簟生凉 | 来源:发表于2023-08-15 23:36 被阅读0次

    FRP支持TCP、UDP、HTTP、HTTPS等多种协议,可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。通过在具有公网IP的节点上部署FRP服务端,可以轻松地将内网服务穿透到公网。
    假设一个场景:实验室的服务器(简称主机A)在学校的内网中,ip地址为172.29.31.22,我在主机A的端口8501上部署了一个web服务,此时,因为A主机位于学校的NAT后面,我想在外网(学校以外的网络环境)中访问这个服务是做不到了。可巧,我有一台具有公网ip为192.144.236.11的服务器(简称主机S),我想通过一个软件将S的7901端口映射到A的8501,这样我就可以通过访问192.144.236.11:7901 来访问172.29.31.22:8501上的服务,这个软件就可以是FRP。
    下图是一个示意图,当然,你还可以将任意端口做映射,比如将主机A的22号端口映射为S的7922,或者将另一台主机B的22号端口映射为S的7822,需要注意的是映射关系为一对一,S上的端口不能有重复,具体用哪个随意定。

    场景示意图

    因为A位于内网中,不可能通过S来访问A,只能由A主动请求S才能建立连接,所以frp分为客户端和服务端,服务端程序为frps,客户端程序为frpc,分别对应的配置文件为frps.ini和frpc.ini。

    程序下载地址:https://github.com/fatedier/frp/releases

    本文分为3个部分,客户端和服务端的环境都为 amd64 Ubuntu18+:

    1. 配置服务端
    2. 配置客户端
    3. 开机自动启动和后台运行设置

    一、配置服务端

    服务端包括一个可执行程序frps和一个配置文件frps.ini,解压下载的文件能看到还有个frps_full.ini,这里包括了所有的可配置项,我们只需要从中取必要的几条即可,客户端同理。

    1.1 配置文件

    frps.ini文件内容如下,删除注释,修改XXX部分即可:

    [common]
    bind_port = 7000    # 服务程序监听的端口
    token = XXX       # 客户端认证用的token,就是客户端想要连接这个服务器需要知道这个token 
    
    # frp还提供了一个web仪表盘,可以查看当前程序的运行情况
    dashboard_addr = 0.0.0.0   # 仪表盘的地址,默认是本机
    dashboard_port = 7500      # 仪表盘的端口号
    dashboard_user = XXX      # 访问仪表盘的认证用户
    dashboard_pwd = XXX       # 访问仪表盘的认证密码
    

    1.2 启动服务

    将下载的程序解压后一同放入主机S的/opt/frp目录下,我的可执行程序路径最终为/opt/frp/frp_0.51.2_linux_amd64/frps,给可执行程序执行权限
    sudo chmod a+x /opt/frp/frp_0.51.2_linux_amd64/frps,然后使用-c参数指定配置文件,运行程序/opt/frp/frp_0.51.2_linux_amd64/frps -c /opt/frp/frp_0.51.2_linux_amd64/frps.ini

    启动成功提示(程序位置和行文不同)

    这样,服务端程序就运行成功了。服务端程序不关心映射哪些端口,只要是客户端请求的,服务端都会满足,但是需要注意服务器的端口策略,无论你通过服务商还是自定义规则管理防火墙,都要将服务程序监听端口7000,仪表盘端口7500以及你要映射的端口(比如7901)放开。

    二、配置客户端

    2.1 配置文件

    frpc.ini文件如下:

    # common部分配置服务端的信息
    [common]
    server_addr = 192.144.236.11    # 服务端地址
    server_port = 7000              # 服务程序监听端口
    # tls_enable配置项用于启用TLS协议加密传输,新版本一定要打开
    tls_enable = true
    token = XXX            # 服务器端前面设置的token
    
    # 下面的每一项是一个映射配置,名称用于区分不同的映射,随意起
    # 这里配置了两个映射,第一个是将A的8501映射到了S的7901,第二个是将B的22号端口映射到了S的7822
    [user.A.web]            # 随意起的名字,建议是 用户.设备.服务
    type = tcp              # 类型tcp,也可以使用http或者其他,但是要做不同配置
    local_ip = 127.0.0.1    # 客户端程序跑在A上,所以是本机地址
    local_port = 8501        # 本机服务端口
    remote_port = 7901      # 远程要映射的端口,随意指定,个人习惯7开头,第二个数字区分设备,后两位区分服务
    
    [user.B.ssh]
    type = tcp
    local_ip = 172.29.31.33    # 可以映射别的机器,前提是本机器能访问到
    local_port = 22
    remote_port = 7822
    

    2.2 启动客户端程序

    和服务端一样,不过把frps改成frpc即可。


    启动成功提示(内容和路径和行文不同)

    至此,端口转发就完成了, 可以试试能否通过192.144.236.11:7901 来访问172.29.31.22:8501上的web服务了。或者访问http://192.144.236.11:7500来查看是否映射成功,如果显示映射成功但是无法访问,基本就是你的服务器端口没放开。

    三、开机自启动和后台运行

    现在可以使用了,但是必须开着程序运行窗口,而且不会开机启动。个人习惯用tmux跑后台服务,把frp也放到tmux窗口中,然后开机时运行tmux。参考我这两篇文章,文章有点乱,你如果有自己的方法就别看了。

    1. tmux 入门 https://www.jianshu.com/p/6075c0fd98d9
    2. tmux 开机启动 https://www.jianshu.com/p/6700fc66adbe

    相关文章

      网友评论

          本文标题:FRP 内网穿透

          本文链接:https://www.haomeiwen.com/subject/hgtkmdtx.html