什么是内网穿透
由于ipv4使用的是32位地址作为网络地址,随着移动互联网的普及和使用,公网IP资源变得越来越少,很容易让人产生一个想法,有没有一种手段利用一个公网IP访问到内网的计算机设备,从而节约了公网IP的使用。
结果很明显,这就是我们今天讲的 内网穿透 服务。其通过一个公网服务器转发我们对于内网计算机的指令,公网服务器与内网计算机之间保持着TCP长链接,通过访问公网服务器的特殊端口就可以控制内网计算机。
FRP服务
frp服务就是内网穿透服务中的一种,也是一款开源的软件,提供客户端和服务器两种工作模式,能够快捷部署。
1、下载frp服务程序
frp是一款开源软件,其源代码地址在GitHub上,frp源码地址,然后可以找到其发布版本,由于GitHub访问速度受限,这里提供目前最新的版本以供下载。
或者:
链接: https://pan.baidu.com/s/1Q2loRfvC2v754Iu_rmAiOQ
提取码: q0cq
2、上传压缩包并解压
利用百度网盘下载完软件包,我们可以通过SFTP的方式将文件上传到服务器root目录下。
上传完成后解压:
tar -zxvf frp_0.21.0_linux_amd64.tar.gz
解压出来的文件夹中既包含了服务器端的文件又包含了客户端的文件,所以可以在不同的计算机上删除不必要的文件,只保留自己需要的文件。
公网服务器上保留:
frps
frps.ini
内网服务器上保留:
frpc
frcp.ini
3、配置frp服务
需要配置两台设备上的配置文件,主要是frps.ini和frpc.ini
修改公网服务器上的配置文件frps.ini
bind_port = 7000
这是访问frp服务的默认端口
是内网客户机与公网服务器通信的端口
修改内网服务器的客户端配置文件frpc.ini
[common]
server_addr = xxx.xxx.xxx.xxx #frp服务端地址,必须是公网ip或者域名,这里假设为xxx.xxx.xxx.xxx
server_port = 7000 #frp服务端端口,即填写服务端配置中的 bind_port
[app1]
type = tcp #连接类型,填tcp或udp
local_ip = 127.0.0.1 #填127.0.0.1或内网ip都可以
local_port = 22 #需要转发到的端口,ssh端口是22
remote_port = 6000 #设置系统的使用端口,我们可以使用公网服务器的6000端口来控制内网服务器的22端口
上面只配置了一项转发服务,事实上可以配置很多项,就需要看你的需求是什么,同样可以配置公网服务器的6001端口代理内网的80端口,就可以访问公网IP:6001来获取内网的httpd服务。
4、启动frp服务
分别在公网服务器和内网服务器上运行frp服务。
#公网server启动:
nohup ./frps -c frps.ini &
#查看日志
tail -f nohup.out
#内网client启动:
nohup ./frpc -c frpc.ini &
#查看日志
tail -f nohup.out
除了提供服务以外,frp还提供了一个UI界面dashboard,可以看到目前的连接状态,这个需要在公网服务器的配置文件中添加。
FRP服务与nginx服务的异同
从功能上讲,frp和nginx都是完成了一种代理服务,不过又有所区别。
nginx可以提供本机不同端口之间的相互代理,例如下面就是使用nginx代理本机的8888端口,从而通过443端口访问到8888端口的服务。
同时nginx也可以配置其他机器的代理,但是其他机器的IP地址必须可以被其直接访问,例如代理另一台公网服务器的端口,或者代理同一内网下的其他机器的端口。
相比之下,frp服务对于代理设备的要求没有那么严格,它可以代理任何能够建立连接的设备,不管对方是否具有公网IP或者是否在同一内网下。
------2023/04/06更新------
监听多个端口,做多端口的转发
#内网端配置方式如下:
[common]
server_addr = 公网ip地址
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[frp-sql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 6006
配置好之后,重启服务。
也把杀服务和重启服务记录一下吧:
#先找到服务 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
执行之后如果显示这样则成功了
然后kill -9 进程号
kill -9 3600
杀掉进程之后,再启动服务就行了。
#内网client启动:
nohup ./frpc -c frpc.ini &
#查看日志
tail -f nohup.out
PS:只改内网的服务器,公网的不用动,访问的话就:
公网ip:6006
这样子就会把6006的请求数据转发到内网服务器的3306端口了。而且6000端口和6006端口同时生效。
------2023/07/05更新------
设置开机自动启动
vim /etc/rc.d/rc.local
#添加下面这一行
cd /usr/local/frp/ && nohup ./frps -c frps.ini & //公网服务端
或:
cd /usr/local/frp/ && nohup ./frpc -c frpc.ini & //内网客户端
配置 systemctl 控制服务端运行
vi /usr/lib/systemd/system/frp.service
#内容如下:
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit
[Install]
WantedBy=multi-user.target
启动、停止及查看frps状态
systemctl start frp.service
systemctl stop frp.service
systemctl status frp.service
服务器开机自动启动frps
sudo systemctl enable frp
小结
经过这样的部署,我们就可以远程访问一台没有公网IP的设备了,这样可以应用于家庭nas等情况。
如需配置网站穿透,可参考:
如需配置https穿透,可参考:
利用frp内网穿透实现https穿透 - 不明文档 - 万档归一