为什么我们需要内网穿透?
由于ipv4地址的匮乏 目前来说家用宽带想申请到一个公网IP的难度是很大的 那我们又想在外随时能访问到家里的主机以及上面的服务怎么办呢 一般有如下几种方法
- 远程桌面类 例如teamViewer Todesk等远程操控软件 但是他们只能实现远程操控 最多加上文件共享 而且提供的流量和带宽有限 如果需要访问服务啥的 要么需要付费购买更高级的套餐要么就放弃
- 利用蒲公英之类的VPN软件进行组网 和上面的一样免费版速度很慢
- 搭建FRP服务器进行内网穿透 可以达到不错的速度 只局限于你的服务器的带宽 如果你有一台大带宽的服务器 那么这个方法是个不错的选择 而且自建frp服务器可以实现高度自定义 理论上任何开放的端口都可以映射到内网主机上
那么恰巧我本人有一台 不算慢的轻量应用服务器,每个月1个T的公网带宽如果只是用来部署个Blog和Mysql 那就有点浪费了 可以合理的利用起来
什么是frp
frp就是一个反向代理的软件 可以使得处在内网的服务器/主机 为外网提供服务 但需要一台具有公网IP的服务器做FRP服务器 然后将内网主机做为客户端连接上 frp支持TCP UDP HTTP多种协议
frp下载
这里使用的frp版本为0.22.0 frp为开源软件 可以在github找到软件包
地址如下 根据自己的服务器的架构 灵活选择 我这里的服务器为centos7.6 x86架构
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
解压
tar -zxvf frp_0.22.0_linux_amd64.tar.gz
顺便改个名字
mv frp_0.22.0_linux_amd64 frp
进入到软件目录下 可以看到如下几个文件
- frps
- frps.ini
- frpc
- frpc.ini
其实也比较好理解 frps就是frp server 程序 ini 就是对应的配置 这里我们的服务器作为服务器 可以删除frpc frpc.ini
这里我贴一下我的服务器 frps.ini
配置
bind_port = 7000
dashboard_port = 7500
token = ########
dashboard_user = duckflew
dashboard_pwd = ############
vhost_http_port = 10080
vhost_https_port = 10443
其中参数解释如下
bind_port 也就是服务端运行的端口 c端需要连接这个端口号
token 就是C端连接S端需要的标记
dashboard 就是在线管理面板 一般来说第一次进如面板需要设置账号密码
下面两个dashboard_user/pwd 就是面板的账号和密码了
启动frps
./frps -c frps.ini
如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。
2019/01/12 15:22:39 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000
2019/01/12 15:22:39 [I] [service.go:172] http service listen on 0.0.0.0:10080
2019/01/12 15:22:39 [I] [service.go:193] https service listen on 0.0.0.0:10443
2019/01/12 15:22:39 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500
2019/01/12 15:22:39 [I] [root.go:210] Start frps success
登录7500端口可以看到仪表板 dashboard
后台启动
上面的启动方式如果退出终端进程就终止了 所以可以选择后台启动
nohup ./frps -c frps.ini &
客户端安装frpc
客户端的frpc和刚才服务端的frps其实都在一个软件包里面只是由于系统的不同下载的包也不同 简言之 下载下来的软件包里面包含了服务端和客户端需要的程序 你想把当前的机子作为服务端 就运行frps.exe(windows)或者是./frps(linux)
这里我需要内网穿透的主机是windows 所以下载windows对应的版本
“frp_0.22.0_windows_amd64.zip”
同理进行解压
编写frpc.ini文件
如下
[common]
server_addr = duckflew.cn
server_port = 7000
token=###########
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7006
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[smb]
type= tcp
local_ip= 127.0.0.1
local_port=445
remote_port=7001
[jellyfin]
type= tcp
local_ip= 192.168.123.164
local_port=8096
remote_port=7002
[idea]
type=tcp
local_ip=127.0.0.1
local_port=8887
remote_port=7003
[qbitorrent]
type=tcp
local_ip=127.0.0.1
local_port=8888
remote_port=7005
其中[common] 下面需要设置 远端Server 以及token 与frps.ini中对应即可
下面可以自己定义对应的端口转发
例如我想实现远程桌面
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7006
我就命名一个为rdp的配置 协议类型为tcp
localip 就写127.0.0.1
本地的端口号3389 是windows电脑远程连接的默认端口号
远程端口号可以自己定义 选一个不冲突 你自己能记得住的就可以保存配置后
打开powerShell
进入到软件目录下 同理运行
.\frpc -c frpc.ini
如此一来就启动成功了 可以在面板上查看到相关的连接信息
也可以把 frpc 注册为windows服务 然后开启自启动
关于如何在windows下注册服务 可以看下一篇文章
tips: 在实现端口转发之后 如果遇到无法访问服务 可以考虑打开防火墙
另外 对于http流量可以转发 省略端口号,但是其他的流量就未必了 所以对于非http协议 尽量还是用ip加端口号访问