家里没有公网IP,因此导致家里的GPU服务器,NAS在外网访问起来非常困难,尝试过使用花生壳、零遁出的内网穿透工具。但效果都不太好,链接速度不稳定,所以就尝试搞了个frp做了个内网穿透
准备工作
- 【服务端S】一台带有公网IP的服务器(阿里云、腾讯云等)
- 【客户端C】你需要在外网访问的内网服务器
- 【frp】frp安装文件
其中,服务端是指能提供公网IP的服务器,客户端C需要将端口Port_c映射到公网服务器S的端口Port_s上,通过访问公网服务器S的端口Port_s,就可以访问内网客户端C的Port_c端口了。
获取frp安装文件
进入Git-frp,下载对应的frp文件,我下载的是frp_0.32.0_linux_amd64.tar.gz,可以在GitHub页面直接点击下载,也可以使用下面的命令。
注意,客户端C与客户端C都需要下载frp文件
wget https://github.com/fatedier/frp/releases/download/v0.32.0/frp_0.32.0_linux_amd64.tar.gz
服务端配置
新建路径/usr/local/frp,将刚才下载的frp文件,解压到这个路径下
mkdir -p /usr/local/frp
tar -zxvf frp_0.32.0_linux_amd64.tar.gz -C /usr/local/frp
cd /usr/local/frp/frp_0.32.0_linux_amd64
进入/usr/local/frp后,需要关注4个文件:分别是frpc、frpc.ini和frps、frps.ini。
frpc、frpc.ini是客户端所关注文件,frps、frps.ini是服务端所关注两个文件。配置服务器端,将客户端的配置文件删除
rm /usr/local/frp/frp_0.32.0_linux_amd64/frpc*
接下来,对frps.ini进行配置。默认的frps.ini中,只包含了端口一项,出于安全考虑,可以添加一个token,我的frps.ini是这样的
[common] bind_port = 7000 token = 8
2#¥F95f
45@3f #客户端连接服务器端的口令
配置完成后,执行下面命令,就可以启动frp了
/usr/local/frp/frp_0.32.0_linux_amd64/frps -c /usr/local/frp/frp_0.32.0_linux_amd64/frps.ini
需要注意的是,要检查你的公网服务器,7000端口是否对外开放了,不开放端口,是没有办法进行访问的
客户端配置
客户端配置与服务端配置其实大同小异,在新建路径/usr/local/frp,将刚才下载的frp文件,解压到这个路径下
mkdir -p /usr/local/frp
tar -zxvf frp_0.32.0_linux_amd64.tar.gz -C /usr/local/frp
cd /usr/local/frp/frp_0.32.0_linux_amd64
进入/usr/local/frp后,需要关注4个文件:分别是frpc、frpc.ini和frps、frps.ini。
frpc、frpc.ini是客户端所关注文件,frps、frps.ini是服务端所关注两个文件。配置客户端,将服务器端的配置文件删除
rm /usr/local/frp/frp_0.32.0_linux_amd64/frps*
接下来,对frps.ini进行配置。我的frps.ini是这样的
[common]
server_addr = xxx.xxx.xxx.xxx # 服务端ip
server_port =7000 #服务端端口
token = 8
2#¥F95f
45@3f #连接服务端口令
[ssh]
type = tcp local_ip = 127.0.0.1 #127.0.0.1或者本地ip
local_port = 22 #要穿透的本地端口
remote_port =6661 # 暴露到外网的端口
配置完成后,执行下面命令,就可以启动frp了
/usr/local/frp/frp_0.32.0_linux_amd64/frpc -c /usr/local/frp/frp_0.32.0_linux_amd64/frpc.ini
需要注意的是,要检查你的公网服务器6661端口,内网客户端22端口是否开放。
测试
通过 ssh 访问内网机器,假设用户名为 test:ssh -oPort=6661 test@x.x.x.x
这里ip为服务端ip,端口为我们暴露到外网的端口即 6661。
使用xshell等ssh链接工具,也可以进行测试
配置开机自启动
为增加内网穿透的稳定性,需要添加开机自启动,我使用systemctl来控制启动。
以服务端为例,首先,编写脚本
sudo vim /lib/systemd/system/frps.service
[Unit]
Description=fraps service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/local/frp/frp_0.32.0_linux_amd64/frps -c /usr/local/frp/frp_0.32.0_linux_amd64/frps.ini
[Install]
WantedBy=multi-user.target
客户端的脚本,与服务器端脚本没啥区别,将frps替换成frpc就可以了
[Unit]
Description=fraps service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/local/frp/frp_0.32.0_linux_amd64/frpc -c /usr/local/frp/frp_0.32.0_linux_amd64/frpc.ini
[Install]
WantedBy=multi-user.target
然后分别在客户端与服务器端启动 frpssudo systemctl start frps
再打开自启动sudo systemctl enable frps
几条有用的命令
- 重启
sudo systemctl restart frps
- 停止
sudo systemctl stop frps
- 查看应用日志
sudo systemctl status frps
总结
- 本文介绍了ssh远程登录的方法,如果需要完成ftp、http等映射,可以添加端口映射实现
- frp可以做域名映射,这个后续有时间再写详细过程
- 直接买性能优异的云主机太贵了,但使用frp做内网穿透,比较费时,可能还有安全问题,这个就看自己的取舍了
- 生命不息,折腾不止