树莓派之外网访问
花钱买了个树莓派,只能在家得瑟。不符合当初想的吧?
其实实现外网访问的方法很多,这里列举几种:
1.如果网络供应商提供固定外网IP(这个估计比较难,当然有钱就另说了)
如果网线插树莓派上,输入外网ip就能直接访问到。
如果经过路由器,就在路由器上做个端口转发(不知道?问度娘)也可以实现访问。
2.没有外网ip的情况,就需要做动态解析或内网映射了。(这里实现的就比较多了)
①.花生壳(现在越来越贵,还限制流量,我放弃了)
②.nat123(可以免费用,但是速度。。)
③.公云(这个速度凑合,公司一直在使用。)
...提供这种服务公司的还有很多,就不一一举例了。
具体使用方法,也都有文档。照着来一般都可以搞定(搞不定的留言告诉我^_^)。
上面说的是别人提供服务,下面说说自己搭建映射服务(这里需要一个外网的服务器(vps),如果没有的话,老老实实的用他们的吧)。
①.ngrok(这个貌似也有提供服务的)
②.frp(这个同样也有)
凑着朋友的服务器搭了一下frp服务。感觉挺简单的。这里记录一下。
开始使用
根据机器的操作系统,在Release页面中找到对应的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
服务端的工作就到此结束了。
客户端
客户端前面的操作和服务端是一模一样的,这里不一一解释。这里需要注意版本树莓派使用的是linux_arm,不是64位的。(我使用的frp_0.13.0_linux_arm.tar.gz)
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。
让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。
server {
listen 80;
server_name a.com;
location / {
proxy_pass http://127.0.0.1:8080;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
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://www.jianshu.com/p/e8e26bcc6fe6
http://www.des8.com/creative_print/frp_for_nginx_one/