一、背景

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

假设公网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,出现下图则表示服务端开启成功

客户端
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,出现下图则表示客户端开启并连接成功

四、连接指令
启动好之后,就可以用ssh软件或者命令行远程连接内网主机:
命令行连接(IDE用到)
ssh 内网主机用户名@云服务器公网IP -p remote_port
本例中为:
ssh oyxy2019@x.x.x.x -p 6000
然后输入密码或密钥即可连接,这里的密码指的是内网主机的密码,不是云服务器的密码。
SSH软件连接
连接配置如下:

连接成功:

五、后台运行
如果想要后台运行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系统的话,还可以用一些图形化界面的软件,链接。
七、报错及解决方法
- 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 不可用)
-
先查看本地公钥内容:
cat ~/.ssh/id_ed25519.pub输出类似:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL... 本地用户名@本地主机名,复制这段内容。 -
在服务器上,确保
~/.ssh目录和authorized_keys文件存在并设置正确权限:mkdir -p ~/.ssh # 若目录不存在则创建 chmod 700 ~/.ssh # 目录权限必须为700(仅所有者可读写执行) touch ~/.ssh/authorized_keys # 若文件不存在则创建 chmod 600 ~/.ssh/authorized_keys # 文件权限必须为600(仅所有者可读写) -
将本地复制的公钥内容粘贴到服务器的
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