frp内网穿透配置以及相关端口、过程解释
假设现有外网笔记本、云服务器、内网工作站三台设备,希望使用外网笔记本通过云服务器转发,访问内网工作站;这里介绍如何使用frp进行内网穿透实现上述功能并按照自己的理解介绍下其中的过程。
介绍
假设现有外网笔记本、云服务器、内网工作站三台设备,希望使用外网笔记本通过云服务器转发,访问内网工作站;这里使用frp
进行内网穿透。先在内部基本流程和解释
这一章节通俗解释下内部发生的事情,帮助理解和debug,如果只想穿透,可以跳过,并从云服务器端配置
一节开始。
内部基本流程和解释
基本概念
在frp穿透方法中,将会在云服务器上部署frps(frp服务端),内网工作站上部署frpc(frp客户端);其中涉及到几个概念:
- bind_port:定义在frps的配置文件中,用于指定云服务器上 用于监听内网工作站与该端口的连接请求的一个端口,内网工作站会通过云服务器公网ip地址,向云服务器该
bind_port
端口发送连接请求,通过该端口发送token后建立与云服务器的连接。 (但是云服务端并不通过这个口向内网工作站转发外部数据) - server_port: 定义在frpc的配置文件中,指向刚才定义的云服务器上的
bind_port
端口,两者数值一致; 用处是,告诉内网工作站:“应该向云服务器的哪个端口发送建立连接请求?” 本质上和bind_port
相同,都指的是云服务器上的某个端口,只是定义位置不同。 - remote_port: 定义在frpc的配置文件中,用于指定云服务器上的一个端口(转发端口),假设
remote_port=7000
,它的作用是,在内网工作站和云服务器建立和保持连接之后,内网工作站根据自己配置文件中指定的remote_port=7000
告诉云服务器:“我要听传输到你7000端口的数据,请把你7000端口接收到的数据转发给我”。 - local_port:定义在frpc的配置文件中,假设
local_port=22
,它用于告诉云服务器:“你把7000端口接收的数据转发给我的22端口,我在那里听着”。
基本流程
在云服务器上预先开放两个端口,一个6000
端口作为bind_port,以及另一个7000
端口作为接受外网访问的转发端口remote_port。
- 内网工作站通过frpc配置文件中定义的server_port(等于bind_port)和云服务器ip,通过一个随机端口发送token和连接请求;
- 建立连接后,内网工作站根据frpc配置中的remote_port=7000指向云服务器中已经开放的7000端口,告诉云服务器请求将该7000端口数据转发给自己的local_port端口;
- 云服务器随即监听请求中的7000端口接收到的数据,并通过自己的随机端口,将接收到的外部访问数据转发给内网工作站frpc配置中定义的local_port端口。
- 内网工作站根据转发的数据,判断是否通过ssh密码验证,是否建立ssh通讯。
云服务器端配置
- 登录腾讯轻量型云服务器控制台,开放
转发端口
、bind_port
以及deshboad
端口,其中deshboad
端口用来测试,可以不写。
-
测试与公网服务器ssh链接
假设公网云服务器ip地址为
xx.xxx.xxx.xxx
,那么在外网笔记本的终端中,执行ssh ubuntu@xx.xxx.xxx.xxx
-
公网服务器端安装frp程序包
ssh进入云服务器中之后,执行
wget https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_amd64.tar.gz tar -zxvf frp_0.37.1_linux_amd64.tar.gz cp -r frp_0.37.1_linux_amd64 frp
-
查看文件
cd frp tree
在
frp
文件夹中,他们的文件结构是. ├── frpc ├── frpc_full.ini ├── frpc.ini ├── frps #云服务器中使用 ├── frps_full.ini ├── frps.ini #云服务器中使用 ├── LICENSE ├── nohup.out └── systemd ├── frpc.service ├── frpc@.service ├── frps.service └── frps@.service 1 directory, 12 files
-
修改
frps.ini
文件vim frps.ini
修改为如下内容,注意,其中的端口
6871
,6289
都是提前已经在防火墙中自定义好了的[common] # 云服务器仪表盘端口的用户 dashboard_user = xxx # 云服务器仪表盘端口的密码 dashboard_pwd = xxxxx dashboard_port = 6289 # 云服务器和内网工作站之间的连接建立端口 bind_port = 6000 # 通讯口令,写复杂一些 token = xxxxxx
-
移动到系统文件夹下
cd .. sudo mv frp /usr/local/
-
设置开机启动云服务器frps服务
sudo vim /etc/init.d/frps_start.sh
写入
#!/bin/bash ### BEGIN INIT INFO # Provides: tuzixini # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: self define auto start # Description: self define auto start ### END INIT INFO sudo nohup /usr/local/frp/frps -c /usr/local/frp/frps.ini &
赋予权限
sudo chmod 755 /etc/init.d/frps_start.sh
设置自启动
cd /etc/init.d sudo update-rc.d frps_start.sh defaults 90
-
启动服务: 重启云服务器,或者执行以下指令
需要注意的是,如果重启之后,云服务器的frp服务没有打开,就会导致个人工作站的frp服务启动失败,因此保证在启动内网工作站的时候,云服务器的frp一定要是打开的。
cd /usr/local/frp sudo nohup ./frps -c frps.ini &
-
查看服务,或者停止服务(optional)
# 可以查看到刚才的任务的进程id,假设为32567 ps -aux | grep frps # 杀掉进程 kill -9 32567
-
测试
在笔记本电脑中,打开浏览器输入
你的公网ip:6289
输入账户密码,如果看到仪表盘就说明服务启动成功了
内网工作站配置
直接打开命令终端,或者你自己ssh进去,
-
同样下载安装frp
wget https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_amd64.tar.gz tar -zxvf frp_0.37.1_linux_amd64.tar.gz cp -r frp_0.37.1_linux_amd64 frp
-
修改
frpc.ini
文件[common] # 你的云服务器公网ip server_addr = xx.xxx.xxx.xxx # 云服务器端与工作站建立连接的端口,与bind_port一致 server_port = 6000 # 通信口令,与frps.ini文件中定义的一致 token = xxxxxx [ssh] type = tcp # 内网工作站在局域网中的ip,填写127.0.0.1就行,不用管具体的值 local_ip = 127.0.0.1 # 设置内网工作站 要监听ssh的端口 local_port = 22 # 云服务器监听外部访问的端口,即转发端口 remote_port = 7000
-
移动到系统文件夹下
cd .. sudo mv frp /usr/local/
-
设置开机启动内网工作站frpc
sudo vim /etc/init.d/frpc_start.sh
写入
#!/bin/bash ### BEGIN INIT INFO # Provides: tuzixini # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: self define auto start # Description: self define auto start ### END INIT INFO sudo nohup /usr/local/frp/frpc -c /usr/local/frp/frpc.ini &
赋予权限
sudo chmod 755 /etc/init.d/frpc_start.sh
设置自启动
cd /etc/init.d sudo update-rc.d frpc_start.sh defaults 90
-
重启内网工作站,或者执行以下指令启动服务
需要注意的是,如果重启之后,云服务器的frp没有打开,就会导致个人工作站的frp服务启动失败,因此保证在启动内网工作站的时候,云服务器的frp一定要是打开的。
cd /usr/local/frp sudo nohup ./frpc -c frpc.ini &
-
查看服务,或者停止服务(optional)
#可以查看到刚才的任务的进程id,假设为32567 ps -aux | grep frpc # 杀掉进程 kill -9 32567
第二个内网工作站
这里介绍如何用同一个云服务器来穿透多个内网设备。
云服务器端
和第一个工作站配置相似,只是它的frps.ini
中的bind_port
和第一个工作站不相同,需要在云服务器上面手动开放对应的端口号
-
重新创建一个新的
frps.ini
文件,假设为frps1.ini
,里面写上新的口,再使用frps
运行它# 随便设置一个不同的端口 bind_port = 1212 # 通信口令,可以跟第一个内网工作站的口令不同 token = XXXXXXX
内网工作站端
和第一个工作站配置相似,只是它的frpc.ini
中的server_port
和remote_port
都和第一个工作站不相同,需要在云服务器上面手动开放对应的端口号
-
重新创建一个新的
frpc.ini
文件,假设为frpc1.ini
,里面写上新的口,再使用frpc
运行它[common] # 你的云服务器公网ip server_addr = xx.xxx.xxx.xxx # 随便设置一个不同的端口(需要提前在云服务器上手动开放) server_port = 1212 # 通信口令,要跟 frpc1.ini中的保持一致 token = XXXXXXX [ssh] type = tcp # 内网工作站在局域网中的ip,填写127.0.0.1就行,不用管具体的值 local_ip = 127.0.0.1 # 设置内网工作站frp要监听的端口 local_port = 22 # 不同的转发端口,同样需要提前在云服务器上手动开放 remote_port = 5101
-
自动启动方式,和第一个内网工作站相同。
使用
-
在外网笔记本的终端中,输入
ssh -p [转发端口][用户名]@[ip]
其中,
用户名
是想要访问的内网工作站的对应账户名称,ip
是云服务器公网ip;输入的密码也是内网工作站的密码,转发端口是上面提到的remote_port
注意点
- 建立连接后,云服务器,一律将访问
remote_port
的ssh类型数据转发到内网工作站local_port
端口上;内网工作站local_port
不管,也不知道是云服务器上到底哪个port跟自己通讯的,甚至不知道是从云服务器上过来的数据,还是同一个内网的访问数据,local_port
只是接收请求,但是能不能进一步建立ssh连接还需要进行密码验证。 bind_port
端口和remote_port
端口的设定不用担心安全问题;bind_port
端口的通讯建立需要通过frpc以及frps配置文件中的token相互匹配验证。云服务器remote_port
端口本身就是要暴露在外部接收外部访问的,它只是转发remote_port
端口的接受数据,与内网工作站的ssh建立需要通过内网工作站自身的账户密码验证。- 通过内网穿透的方式,实现了将自己内网工作站的账户暴露在公网中,此时知道公网ip、转发端口的人,都可以使用常见的“用户名+密码”组合尝试登录你的内网工作站,因此自己内网工作站的密码需要非常复杂,否则可能会被外部暴力尝试攻破。推荐在做好穿透之后,改成禁止密码登录,仅允许公钥登录。
- 云服务器上的同一个blind_port可以支持多个内网设备,因为它只是用来验证的,但是注意,如果多台内网设备使用了云服务器上的同一个blind_port,需要在内网设备配置的
frpc.ini
中,修改[ssh]
这个名字,例如随便改为[ssh_pc1]
之类的,要不会有冲突。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)