【frp内网穿透】利用云服务器实现远程ssh连接内网主机

【frp内网穿透】利用云服务器实现远程ssh连接内网主机

oyxy2019 1,072 2023-03-18

一、背景

1.png

想在外网【我的电脑】,远程用校园网局域网内部的【内网主机】GPU来运行代码。所以使用frp工具,利用【云服务器】作为跳板,最终实现内网穿透并远程ssh连接内网主机。

二、内网穿透原理

frp.jpg

假设公网ip为x.x.x.x,内网主机的ip为y.y.y.y。我们需要在云服务器上运行FRP服务端(frps),在内网主机上运行FRP客户端(frpc)。这个过程涉及3个端口:

  • 监听端口(bind_port):用于frpc连接frps的端口
  • 远程端口(remote_port):内网主机暴露给外网的端口
  • 本地端口(local_port):不需要设置,取决于内网主机的应用程序的端口

云服务器的防火墙需要放开bind_port和remote_port。

三、内网穿透工具-FRP

接下来,我们就需要利用FRP实现内网穿透。具体操作可分为服务器端和客户端。

下载FRP

服务器端和客户端都需要下载FRP,以Linux系统为例:

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

更多操作系统或版本的下载地址

服务器端

1、ssh连接云服务器
2、下载解压 FRP
3、进入解压后的文件夹内,修改服务端配置文件 frps.ini

$ cat frps.ini

[common]
bind_port = 7000		# 服务器默认监听 7000 端口,可修改。

4、启动FRP服务端
命令行输入:./frps -c ./frps.ini,出现下图则表示服务端开启成功

3.png

客户端

1、需找别人或用其他远程方式操作内网主机
2、下载解压 FRP
3、进入解压后的文件夹内,修改客户端配置文件 frpc.ini

$ cat frpc.ini

[common]
server_addr = x.x.x.x		# 公网 IP
server_port = 7000		# 与上面服务端监听的端口相同

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000		# 客户端指定的remote_port

4、启动FRP客户端
命令行输入:./frpc -c ./frpc.ini,出现下图则表示客户端开启并连接成功

4.jpg

四、连接指令

启动好之后,就可以用ssh软件或者命令行远程连接内网主机:

命令行连接(IDE用到)

ssh 内网主机用户名@云服务器公网IP -p remote_port
本例中为:
ssh oyxy2019@x.x.x.x -p 6000
然后输入密码或密钥即可连接,这里的密码指的是内网主机的密码,不是云服务器的密码。

SSH软件连接

连接配置如下:

6.png

连接成功:

5.jpg

五、后台运行

如果想要后台运行frp可以执行:
1)服务端:

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

2)客户端:

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

如果想要终止进程:
1)先找到进程:

ps -aux|grep frp| grep -v grep

2)然后再杀掉进程即可:

kill -9 【进程号】

六、其他

frp内网穿透不仅可以用于ssh,还可以用于其他很多如数据库。
如果客户端frpc是windows系统的话,还可以用一些图形化界面的软件,链接

七、报错及解决方法

  1. frpc报错:login to server failed: EOF 解决方法

八、SSH免密连接

要实现在不使用密码的情况下使用SSH登录远程服务器,核心是通过公私钥对完成身份验证。
步骤1:在本地生成 SSH 密钥对
首先在本地电脑上生成一对公私钥:

ssh-keygen -t rsa -b 4096

步骤 2:将本地公钥上传到远程服务器

需要把本地的公钥.pub 结尾的文件)添加到远程服务器的 ~/.ssh/authorized_keys 文件中(此文件用于存储允许登录的客户端公钥)。

方法1:用 ssh-copy-id 自动上传(推荐,简单高效)
终端执行:

ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名@远程服务器IP  # 替换为你的服务器用户名和IP
  • 首次执行会提示输入远程服务器的登录密码(仅这一次需要),验证通过后,公钥会自动添加到服务器的 authorized_keys 中,并自动配置好文件权限。

方法2:手动复制公钥(若 ssh-copy-id 不可用)

  1. 先查看本地公钥内容:

    cat ~/.ssh/id_ed25519.pub
    

    输出类似:ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL... 本地用户名@本地主机名,复制这段内容。

  2. 在服务器上,确保 ~/.ssh 目录和 authorized_keys 文件存在并设置正确权限:

    mkdir -p ~/.ssh  # 若目录不存在则创建
    chmod 700 ~/.ssh  # 目录权限必须为700(仅所有者可读写执行)
    touch ~/.ssh/authorized_keys  # 若文件不存在则创建
    chmod 600 ~/.ssh/authorized_keys  # 文件权限必须为600(仅所有者可读写)
    
  3. 将本地复制的公钥内容粘贴到服务器的 authorized_keys 中。

步骤 3:测试无密码登录
完成上述步骤后,尝试登录远程服务器:

ssh 用户名@远程服务器IP  # 若私钥是默认路径,无需额外参数
# 若私钥路径非默认(如自定义名称),需用-i指定:
ssh -i ~/.ssh/自定义私钥名 用户名@远程服务器IP

此时应该无需输入密码,直接登录成功。

参考

https://blog.csdn.net/weixin_42265958/article/details/106008837
https://zhuanlan.zhihu.com/p/612377399