树莓派之外网访问
花钱买了个树莓派,只能在家得瑟。不符合当初想的吧?
其实实现外网访问的方法很多,这里列举几种:
**1.如果网络供应商提供固定外网IP**(这个估计比较难,当然有钱就另说了)
如果网线插树莓派上,输入外网ip就能直接访问到。
如果经过路由器,就在路由器上做个端口转发(不知道?问度娘)也可以实现访问。
**2.没有外网ip的情况,就需要做动态解析或内网映射了。**(这里实现的就比较多了)
①.[花生壳](https://www.oray.com/)(现在越来越贵,还限制流量,我放弃了)
②.[nat123](http://www.nat123.com/)(可以免费用,但是速度。。)
③.[公云](http://www.pubyun.com/)(这个速度凑合,公司一直在使用。)
...提供这种服务公司的还有很多,就不一一举例了。
具体使用方法,也都有文档。照着来一般都可以搞定(搞不定的留言告诉我^\_^)。
上面说的是别人提供服务,下面说说自己搭建映射服务(这里需要一个外网的服务器(vps),如果没有的话,老老实实的用他们的吧)。
①.ngrok(这个貌似也有提供服务的)
②.frp(这个同样也有)
凑着朋友的服务器搭了一下frp服务。感觉挺简单的。这里记录一下。
### **开始使用**
根据机器的操作系统,在[Release](https://link.jianshu.com?t=https://github.com/fatedier/frp/releases)页面中找到对应的frp程序,然后分别在外网主机和内网主机中下载它。
###### **外网主机**
SSH连接上外网主机后,使用wget指令下载frp。
```
wget https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_linux_amd64.tar.gz
```
使用`tar`指令解压tar.gz文件
```
tar -zxvf frp_0.13.0_linux_amd64.tar.gz
```
使用`cd`指令进入解压出来的文件夹
```
cd frp_0.13.0_linux_amd64
```
外网主机作为服务端,可以删掉不必要的客户端文件,使用`rm`指令删除文件。
```
rm -f frpc
rm -f frpc.ini
```
接下来要修改服务器配置文件,即`frps.ini`文件。使用`vi`指令对目标文件进行编辑。
```
[common]
bind_port = 7000
vhost_http_port = 8080
```
\[common\]部分是必须有的配置,其中bind\_port是自己设定的frp服务端端口,vhost\_http\_port是自己设定的http访问端口。
保存上面的配置后,使用以下指令启动frp服务端。(如果需要在后台运行,请往下翻阅关于后台运行的部分。)
```
./frps -c ./frps.ini
```
服务端的工作就到此结束了。
###### **客户端**
客户端前面的操作和服务端是一模一样的,这里不一一解释。<font color="#ff0000">这里需要注意版本树莓派使用的是**linux\_arm**,不是64位的。(我使用的frp\_0.13.0\_linux\_arm.tar.gz)</font>
```
wget https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_linux_arm.tar.gz
tar -zxvf frp_0.13.0_linux_arm.tar.gz
cd frp_0.13.0_linux_arm
rm -f frps
rm -f frps.ini
vi frpc.ini
```
客户端的配置如下
```
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[nas]
type = http
local_port = 5000
custom_domains = no1.sunnyrx.com
[web]
type = http
local_port = 80
custom_domains = no2.sunnyrx.com
```
上面的配置和服务端是对应的。
\[common\]中的server\_addr填frp服务端的ip(也就是外网主机的IP),server\_port填frp服务端的bind\_prot。
\[ssh\]中的local\_port填群晖的ssh端口。
\[nas\]中的type对应服务端配置。local\_port填群晖的DSM端口。custom\_domains为要映射的域名,记得域名的A记录要解析到外网主机的IP。
\[web\]同上,local\_port填群晖的web端口。这里创建了两个http反向代理是为了分别映射群晖两个重要的端口,5000和80,前者用于登录群晖管理,后者用于群晖的Web Station和DS Photo。
保存配置,输入以下指令运行frp客户端。(同样如果需要在后台运行,请往下翻阅关于后台运行的部分。)
```
./frpc -c ./frpc.ini
```
此时在服务端会看到"start proxy sucess"字样,即连接成功。
访问`no2.sunnyrx.com:8080`就可以打开树莓派上80的端口。
这里的 `no2.sunnyrx.com 是需要解析到 外网ip上的。如果没有域名这里 就写外网ip。<br></br>`
### **让frp在后台运行**
虽然现在frp运作起来了,内网穿透也实现了,但这还是不够的。此时如果断开与服务端或者客户端的SSH连接(比如关掉了Xshell)也就中止了frp的运行。
下面的示范是运行服务端的frp,客户端就不示范了,前面提过群晖的系统没有screen指令。
首先使用screen指令创建一个会话。
```
screen -dmS frp
```
然后进入这个会话。
```
screen -r frp
```
最后使用运行frp的指令,在后面加上" &"。(如果之前断开了SSH连接,记得用`cd`指令进入frp的目录先。)
```
./frps -c ./frps.ini &
```
这样就让frp在后台运行了。
**使用nohup指令**
nohup指令的使用方法相对简单,只需要在nohup后面加上frp的运行指令即可。下面示范的指令是运行frp客户端。(同样,如果之前断开了SSH连接,记得用cd指令进入frp的目录先。)
```
nohup ./frpc -c ./frpc.ini &
```
这样就成功让frp在后台运行了。
**附加内容**
1.nginx做转发,以80端口访问。这里的8080就是frp绑定的vhost\_http\_port。
```
<span class="hljs-section">server</span> {
<span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;
<span class="hljs-attribute">server_name</span> a.com;
<span class="hljs-attribute">location</span> / {
<span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:8080;
<span class="hljs-comment">#Proxy Settings</span>
<span class="hljs-attribute">proxy_redirect</span> <span class="hljs-literal">off</span>;
<span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;
<span class="hljs-attribute">proxy_set_header</span> X-Real-IP <span class="hljs-variable">$remote_addr</span>;
<span class="hljs-attribute">proxy_set_header</span> X-Forwarded-For <span class="hljs-variable">$proxy_add_x_forwarded_for</span>;
<span class="hljs-attribute">proxy_next_upstream</span> <span class="hljs-literal">error</span> timeout invalid_header http_500 http_502 http_503 http_504;
<span class="hljs-attribute">proxy_max_temp_file_size</span> <span class="hljs-number">0</span>;
<span class="hljs-attribute">proxy_connect_timeout</span> <span class="hljs-number">90</span>;
<span class="hljs-attribute">proxy_send_timeout</span> <span class="hljs-number">90</span>;
<span class="hljs-attribute">proxy_read_timeout</span> <span class="hljs-number">90</span>;
<span class="hljs-attribute">proxy_buffer_size</span> <span class="hljs-number">4k</span>;
<span class="hljs-attribute">proxy_buffers</span> <span class="hljs-number">4</span> <span class="hljs-number">32k</span>;
<span class="hljs-attribute">proxy_busy_buffers_size</span> <span class="hljs-number">64k</span>;
<span class="hljs-attribute">proxy_temp_file_write_size</span> <span class="hljs-number">64k</span>;
}
}
```
2.树莓派frp开机启动。在rc.local添加
```
#frp
(
sleep 120
cd /home/frp_0.13.0_linux_arm
nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &
)&
```
sleep 120就是延时120秒执行。开始没设置延时,一直穿透不成功!估计是树莓派网络还没初始化完成就去连接frp了。
()& 加括号, 后面的 & 表示后台执行,不让 /etc/rc.local 等待
**参考内容**
[https://github.com/fatedier/frp/releases/](https://github.com/fatedier/frp/releases/)
[https://www.jianshu.com/p/e8e26bcc6fe6](https://www.jianshu.com/p/e8e26bcc6fe6)
[http://www.des8.com/creative\_print/frp\_for\_nginx\_one/](http://www.des8.com/creative_print/frp_for_nginx_one/)
评论区