树莓派之外网访问

2017-12-22 16:40:50 查看 2236 回复 0

花钱买了个树莓派,只能在家得瑟。不符合当初想的吧?
其实实现外网访问的方法很多,这里列举几种:

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/