• frp实现内网穿透访问内网多台Linux服务器


    本文主要记录笔者在使用frp实现内网穿透访问内网多台Linux服务器的全过程,包括公网服务器的配置、frp服务端、客户端的下载与配置,以及配置systmctl来实现系统级启停frp,并记录我遇到的一些问题。希望对大家有所帮助。

    一、准备一台公网服务器

    笔者申请的是一台腾讯云服务器。

    1、打开安全组相关端口

    • 路径:控制台->安全组->修改规则->添加规则

    • 来源:0.0.0.0/0

    • 协议端口:

    TCP:7000
    
    TCP:6000
    
    TCP:6001
    
    TCP:6002
    
    • 策略:允许

    注意:入站和出站均需添加。

    2、打开防火墙

    # 启用
    sudo ufw enable
    
    # 开放端口
    sudo ufw allow 7000
    sudo ufw allow 6000
    sudo ufw allow 6001
    sudo ufw allow 6002
    
    # 查看状态
    sudo ufw status
    

    二、下载frp

    分别下载frp到公网服务器和内网服务器:

    wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz
    

    然后解压到/usr/local路径下

    mkdir /usr/local/frp_0.35.1
    
    tar -zxvf frp_0.35.1_linux_amd64.tar.gz -C /usr/local/frp_0.35.1 --strip-components 1
    

    解压后路径/usr/local/frp_0.35.1内容如下

    frpc  frpc_full.ini  frpc.ini  frps  frps_full.ini  frps.ini  LICENSE  systemd
    

    ps:--strip-components 1 表示跳过第一层目录进行解压

    三、配置公网服务器(frps:frp服务端)

    修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:

    vim /usr/local/frp_0.35.1/frps.ini
    
    [common]
    bind_port = 7000 # 这个是公网服务器的端口,我购买的是tecent云的服务器,其安全策略里面得设置开放此端口
    

    四、配置内网服务器(frpc:frp客户端)

    在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x

    且由于有三台内网机器同时以同一台公网机器作为跳板机,所以这三台内网机器的client名称需要不同,即frpc.ini中的[ssh]需要分别设置为[ssh1][ssh2][ssh3],以示区分。

    且这里三台服务器的remote_port分别配置为600060016002。否则会出现端口被占用,导致无法正常连接到内网机器的情况。

    内网机器1:

    vim /usr/local/frp_0.35.1/frpc.ini
    
    [common]
    server_addr = x.x.x.x
    server_port = 7000 # 在公网开放的端口
    
    [ssh1] # 这里是client的一个别名,命名为ssh1以和其他client区分
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000 # 这个是公网服务器的端口,安全策略里面也得设置开放此端口
    

    内网机器2:

    vim /usr/local/frp_0.35.1/frpc.ini
    
    [common]
    server_addr = x.x.x.x
    server_port = 7000 # 在公网开放的端口
    
    [ssh2] # 这里是client的一个别名,命名为ssh1以和其他client区分
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6001 # 该端口需与其他内网机器所配置的端口不同
    

    内网机器3:

    vim /usr/local/frp_0.35.1/frpc.ini
    
    [common]
    server_addr = x.x.x.x
    server_port = 7000 # 在公网开放的端口
    
    [ssh3] # 这里是client的一个别名,命名为ssh1以和其他client区分
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6002 # 该端口需与其他内网机器所配置的端口不同
    

    local_ip local_port配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

    五、分别启动内网公网服务器FRP

    1、在公网服务器上启动frps服务端

    为了方便调试,我们先启动终端版:

    cd /usr/local/frp_0.35.1/
    ./frps -c ./frps.ini
    nohup ./frps -c ./frps.ini &
    
    # 链接成功会出现如下内容
    # 2021/02/04 00:09:17 [I] [root.go:108] frps uses config file: ./frps.ini
    # 2021/02/04 00:09:17 [I] [service.go:190] frps tcp listen on 0.0.0.0:7000
    # 2021/02/04 00:09:17 [I] [root.go:217] frps started successfully
    

    生产使用中可使用如下命令在后台运行:

    nohup ./frps -c ./frps.ini > /dev/null 2>&1 &
    

    2、在内网服务器中启动frpc客户端:

    公网服务器启动成功后,在内网服务器中启动frpc,为了方便调试,我们一样启动终端版:

    cd /usr/local/frp_0.35.1/
    ./frpc -c ./frpc.ini
    nohup ./frpc -c ./frpc.ini &
    
    # 链接成功会出现如下内容
    # 2021/02/04 00:11:47 [I] [service.go:290] [64276cca09e4f64c] login to server success, get run id [64276cca09e4f64c], server udp port [0]
    # 2021/02/04 00:11:47 [I] [proxy_manager.go:144] [64276cca09e4f64c] proxy added: [ssh]
    # 2021/02/04 00:11:48 [I] [control.go:180] [64276cca09e4f64c] [ssh] start proxy success
    

    生产使用中可使用如下命令在后台运行:

    nohup ./frpc -c ./frpc.ini > /dev/null 2>&1 &
    

    六、ssh登录服务器

    如果配置成功,在进入本地服务器就相对容易了:

    # 标准的ssh命令如下
    ssh -p 600x root@xx.xx.xx.xx(公网IP)
    
    # XShell支持的ssh命令不标准,应该通过如下命令连接,这个命令才会弹出让你保存密钥的浮窗:
    ssh root@xx.xx.xx.xx(公网IP) 6000
    

    也可以配置XShell的连接如下
    frp_xshell

    七、关闭frp进程

    这里以frp客户端为例,frp服务端同理。

    1、找到frp进程

    ps -aux|grep frp| grep -v grep
    root      3600  0.1  0.1 110188  9484 pts/0    Sl   15:04   0:00 ./frpc -c ./frpc.ini
    

    进程号是3600

    2、kill该进程

    # 命令格式:kill -9 <pid>
    kill -9 3600
    

    八、配置systemctl来控制frps

    1、创建frps.service

    sudo vim /lib/systemd/system/frps.service
    

    2、在frps.service里添加以下内容

    [Unit]
    Description=frps service
    After=network.target syslog.target
    Wants=network.target
    
    [Service]
    Type=simple
    #启动服务的命令(此处写你的frps的实际安装目录)
    ExecStart=/usr/local/frp_0.35.1/frps -c /usr/local/frp_0.35.1/frps.ini
    
    [Install]
    WantedBy=multi-user.target
    

    注意"ExecStart="之后的路径要填写你的frps安装路径(本文以安装到/usr/local/为例)

    3、使用systemctl命令来控制frps

    启动frps

    sudo systemctl start frps
    

    服务器开机自动启动frps

    sudo systemctl enable frps
    

    重启frps

    sudo systemctl restart frps
    

    停止frps

    sudo systemctl stop frps
    

    查看日志

    sudo systemctl status frps
    

    如下图所示,已可以通过systemctl来启动并查看frps的状态
    frp_systemctl

    frpc的systemctl配置同理,具体如下小节所示。

    九、配置systemctl来控制frpc

    1、创建frpc.service

    sudo vim /lib/systemd/system/frpc.service
    

    2、在frpc.service里添加以下内容

    [Unit]
    Description=frpc service
    After=network.target syslog.target
    Wants=network.target
    
    [Service]
    Type=simple
    #启动服务的命令(此处写你的frps的实际安装目录)
    ExecStart=/usr/local/frp_0.35.1/frpc -c /usr/local/frp_0.35.1/frpc.ini
    
    [Install]
    WantedBy=multi-user.target
    

    注意"ExecStart="之后的路径要填写你的frpc安装路径(本文以安装到/usr/local/为例)

    3、使用systemctl命令来控制frpc

    启动frpc

    sudo systemctl start frpc
    

    服务器开机自动启动frps

    sudo systemctl enable frpc
    

    重启frps

    sudo systemctl restart frpc
    

    停止frps

    sudo systemctl stop frpc
    

    查看日志

    sudo systemctl status frpc
    

    十、常见问题

    如果连接不上,建议在命令行启动frp服务端、客户端后观察终端的输出,对报错、警告进行逐一分析。

    1、token不匹配

    [root@localhost frp_0.33.0_linux_amd64]# ./frpc -c ./frpc.ini
    2020/06/24 15:35:02 [E] [service.go:273] token in login doesn't match token from configuration
    2020/06/24 15:35:02 [W] [service.go:101] login to server failed: token in login doesn't match token from configuration
    token in login doesn't match token from configuration
    

    解决办法:

    (1) 删除或注释掉frp客户端的frpc.ini文件中的token = 12345678

    (2) 重启frp客户端

    2、[ssh]名被占用

    proxy name [ssh] is already in use
    

    解决办法:

    frp客户端的frpc.ini文件中的[ssh]修改为[ssh1]或其他你想要的命名,这只是一个别名而已,所以怎么命名都ok。

    参考

    [1]frp官方文档[https://gofrp.org/docs]

    [2]Linux服务器所以Frp实现内网穿透(阿里云Ubuntu)[https://www.cnblogs.com/xlchan/p/13643231.html]:主要参考其整体方案

    [3]frp后台运行和停止[https://blog.csdn.net/weixin_34244102/article/details/88677915]:主要参考xshell如何ssh命令行连接

    [4]0001_20190327_使用frp搭建内网穿透[https://www.cnblogs.com/wxylog/p/10611632.html]:主要参考其token不匹配的解决方案

    [5]frp -- proxy name [ssh] is already in use[https://blog.csdn.net/weixin_33840661/article/details/85948513]:主要参考其[ssh]被占用的解决方案

    [6]阿里云服务器实现 FRP 内网穿透[https://www.freesion.com/article/776471384/]:主要参考其多客户端配置

    [7]Linux安装配置Frp内网穿透教程[https://www.tok9.com/archives/488/]:主要参考其systemctl配置

    Top
    收藏
    关注
    评论
  • 相关阅读:
    简时——Beta冲刺 Day04
    简时——Beta冲刺 Day03
    简时——Beta冲刺 Day02
    SE_WorkX_提问回顾与个人总结
    通过SQL注入获得网站后台用户密码
    缓冲区溢出攻击与防范
    Pytorch_Part7_模型使用
    Pytorch_Part5_迭代训练
    Pytorch_Part2_数据模块
    Pytorch_Part1_简介&张量
  • 原文地址:https://www.cnblogs.com/JasonCeng/p/14375087.html
Copyright © 2020-2023  润新知