为什么需要内网穿透功能
从公网中访问自己的私有设备向来是一件难事儿。
自己的主力台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。
试了一下几种方法:
- 远程桌面使用TeamViewer。可用,但需要访问端也拥有TeamViewer软件,不是很方便,希望能使用Windows自带的远程桌面。且TeamViewer不易实现远程文件访问。
- 使用蒲公英VPN软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。
- 使用花生壳软件进行DDNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。
- 搭建frp服务器进行内网穿透,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享。
准备工作
- 首先需要一台外网服务器作为服务端
- 一台内网机器作为客户端
- 客户端连接服务端,访问服务端的请求转发给客户端
frp是什么
简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。
下载frp
下载地址
服务端
下载解压后主要使用以下文件
- frps
- frps.ini
- frpc
- frpc.ini
frps开头表示服务端,frpc开头表示客户端
修改frps.ini文件
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
- "bind_port"表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
- "dashboard_port"是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
- "token"是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
- "dashboard_user"和"dashboard_pwd"表示打开仪表板页面登录的用户名和密码,自行设置即可。
- "vhost_http_port"和"vhost_https_port"用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。
启动服务端
./frps -c frps.ini
看到下面日志表示启动成功
2022/04/02 04:57:39 [I] [root.go:200] frps uses config file: frps.ini
2022/04/02 04:57:39 [I] [service.go:192] frps tcp listen on 0.0.0.0:9503
2022/04/02 04:57:39 [I] [service.go:294] Dashboard listen on 0.0.0.0:9501
2022/04/02 04:57:39 [I] [root.go:209] frps started successfully
后台启动 nohup ./frps -c frps.ini &
访问服务器ip:7500就可以看到仪表板界面
客户端
修改配置
修改frpc.ini文件
[common]
server_addr = 服务器ip
server_port = 9503
token = 12345678
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 220
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 33060
[redis]
type = tcp
local_ip = 127.0.0.1
local_port = 6379
remote_port = 6380
其中common字段下的三项即为服务端的设置。
- "server_addr"为服务端IP地址,填入即可。
- "server_port"为服务器端口,填入你设置的端口号即可,如果未改变就是7000
- "token"是你在服务器上设置的连接口令,原样填入即可。
ssh、mysql、redis字段都是自己定义的规则,自定义端口对应时格式如下
- "[xxx]"表示一个规则名称,自己定义,便于查询即可。
- "type"表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册。
- "local_port"是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。
- "remote_port"是该条规则在服务端开放的端口号,自己填写并记录即可。
启动客户端
./frpc -c frpc.ini
看到下面日志表示启动成功
2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [mysql-1] start proxy success
2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [ssh] start proxy success
2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [mysql] start proxy success
2022/04/02 16:50:18 [I] [service.go:304] [9deda624de5b908f] login to server success, get run id [9deda624de5b908f], server udp port [0]
2022/04/02 16:50:18 [I] [proxy_manager.go:144] [9deda624de5b908f] proxy added: [ssh mysql mysql-1 redis redis-1]
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [redis] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [ssh] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [mysql-1] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [redis-1] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [mysql] start proxy success
后台启动 nohup ./frpc -c frpc.ini &
<h2><a id="_0"></a>为什么需要内网穿透功能</h2>
<p>从公网中访问自己的私有设备向来是一件难事儿。<br />
自己的主力台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。<br />
试了一下几种方法:</p>
<ul>
<li>远程桌面使用TeamViewer。可用,但需要访问端也拥有TeamViewer软件,不是很方便,希望能使用Windows自带的远程桌面。且TeamViewer不易实现远程文件访问。</li>
<li>使用蒲公英VPN软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。</li>
<li>使用花生壳软件进行DDNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。</li>
<li>搭建frp服务器进行内网穿透,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享。</li>
</ul>
<h2><a id="_9"></a>准备工作</h2>
<ul>
<li>首先需要一台外网服务器作为服务端</li>
<li>一台内网机器作为客户端</li>
<li>客户端连接服务端,访问服务端的请求转发给客户端</li>
</ul>
<h2><a id="frp_14"></a>frp是什么</h2>
<p>简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。</p>
<h2><a id="frp_17"></a>下载frp</h2>
<p><a href="https://github.com/fatedier/frp/releases" target="_blank">下载地址</a></p>
<h2><a id="_21"></a>服务端</h2>
<p>下载解压后主要使用以下文件</p>
<ul>
<li>frps</li>
<li>frps.ini</li>
<li>frpc</li>
<li>frpc.ini</li>
</ul>
<blockquote>
<p>frps开头表示服务端,frpc开头表示客户端</p>
</blockquote>
<h3><a id="frpsini_31"></a>修改frps.ini文件</h3>
<pre><code class="lang-">[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
</code></pre>
<ul>
<li>"bind_port"表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。</li>
<li>"dashboard_port"是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。</li>
<li>"token"是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。</li>
<li>"dashboard_user"和"dashboard_pwd"表示打开仪表板页面登录的用户名和密码,自行设置即可。</li>
<li>"vhost_http_port"和"vhost_https_port"用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。</li>
</ul>
<h3><a id="_49"></a>启动服务端</h3>
<pre><code class="lang-">./frps -c frps.ini
</code></pre>
<p>看到下面日志表示启动成功</p>
<pre><code class="lang-">2022/04/02 04:57:39 [I] [root.go:200] frps uses config file: frps.ini
2022/04/02 04:57:39 [I] [service.go:192] frps tcp listen on 0.0.0.0:9503
2022/04/02 04:57:39 [I] [service.go:294] Dashboard listen on 0.0.0.0:9501
2022/04/02 04:57:39 [I] [root.go:209] frps started successfully
</code></pre>
<blockquote>
<p>后台启动 nohup ./frps -c frps.ini &</p>
</blockquote>
<p>访问服务器ip:7500就可以看到仪表板界面</p>
<h2><a id="_65"></a>客户端</h2>
<h3><a id="_67"></a>修改配置</h3>
<p>修改frpc.ini文件</p>
<pre><code class="lang-">[common]
server_addr = 服务器ip
server_port = 9503
token = 12345678
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 220
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 33060
[redis]
type = tcp
local_ip = 127.0.0.1
local_port = 6379
remote_port = 6380
</code></pre>
<p>其中common字段下的三项即为服务端的设置。</p>
<ul>
<li>"server_addr"为服务端IP地址,填入即可。</li>
<li>"server_port"为服务器端口,填入你设置的端口号即可,如果未改变就是7000</li>
<li>"token"是你在服务器上设置的连接口令,原样填入即可。</li>
</ul>
<p>ssh、mysql、redis字段都是自己定义的规则,自定义端口对应时格式如下</p>
<ul>
<li>"[xxx]"表示一个规则名称,自己定义,便于查询即可。</li>
<li>"type"表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册。</li>
<li>"local_port"是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。</li>
<li>"remote_port"是该条规则在服务端开放的端口号,自己填写并记录即可。</li>
</ul>
<h3><a id="_102"></a>启动客户端</h3>
<pre><code class="lang-">./frpc -c frpc.ini
</code></pre>
<p>看到下面日志表示启动成功</p>
<pre><code class="lang-">2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [mysql-1] start proxy success
2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [ssh] start proxy success
2022/04/02 16:34:22 [I] [control.go:180] [cf8f3fc9e3febed9] [mysql] start proxy success
2022/04/02 16:50:18 [I] [service.go:304] [9deda624de5b908f] login to server success, get run id [9deda624de5b908f], server udp port [0]
2022/04/02 16:50:18 [I] [proxy_manager.go:144] [9deda624de5b908f] proxy added: [ssh mysql mysql-1 redis redis-1]
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [redis] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [ssh] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [mysql-1] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [redis-1] start proxy success
2022/04/02 16:50:18 [I] [control.go:180] [9deda624de5b908f] [mysql] start proxy success
</code></pre>
<blockquote>
<p>后台启动 nohup ./frpc -c frpc.ini &</p>
</blockquote>