背景

了树莓派后,我想随时了解小派的运行情况,于是开始研究内网穿透,为了让树莓派与服务器的连接更为隐秘,我采用了nginx分流,在使用了frp,ngrok,holer后,我发现它们均不符合我的需求(稳定性不会且配置繁琐),正当我一筹莫展之时,偶然发现一直在使用的V2Ray居然支持反向代理/内网穿透,为了更少的资源消耗,我选择了它,于是便有了下文。在选用监控面板时我比较了 GrafanaNetdata,最终选择了 Netdata ,因为它的安装配置较为简单。先上一张成果图吧:

可以看出,我并没有使用纯域名,而是采用了Nginx反代二级目录的方式进行分流

好了,下面就开始讲述如何搭建出来这一系列东西吧。
我的树莓派、服务器、访问端关系如图:

树莓派配置ln(m)p运行环境

sudo pacman -S nginx    ##安装nginx,装完记得到浏览器里测试一下
sudo pacman -S php php-fpm    ##安装php

在nginx的配置里添加下面一句,让php-fpm来运行php

  location ~ [^/]\.php(/|$) {
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

然后重启php-fpm

将下面代码扔到nginx配置中相应的root目录测试php环境是否正常

<?php
  phpinfo();
?>

允许nginx,php-fpm开机自启

systemdctl enable nginx
systemdctl enable php-fpm

树莓派安装Netdata

arch已经有人打包好了,直接安装就好

sudo pacman -S netdata
systemctl enable entdata    ##允许开机自启
systemctl start entdata

打开后默认监听19999端口,可以到浏览器输入 树莓派地址:19999 访问查看效果。

使用V2Ray进行内网穿透

在进行到这一步时由于网上资料不是很多,我在这里卡了很久,还有对 Nginx 的反代不怎么熟悉,卡了很久。幸亏发现了 这篇文章,并且得到了 @Ailitonia大佬的部分帮助才解决出来,在此感谢大佬!

ps:为了更为方便地描述,下文中 Bridge 即为处于内网的树莓派, Portal 即为拥有公网ip及绑定域名的服务器, Client 即为任何两者之外访问服务的外网设备

pps:由于树莓派已经运行了一个服务了,服务器也是,所以我在树莓派上写了个 systemd 又开了一个进程、服务器上开了一个inboundDetour来运行内网穿透,如果本来没有使用服务可忽略

安装

直接输入命令安装即可:

bash <(curl -L -s https://install.direct/go.sh)

记得允许自启和打开

配置

Bridge

配置V2Ray

Bridge 配置:

{
    "log": {
        "access": "/etc/v2ray/Vaccess.log",
        "error": "/etc/v2ray/Verror.log",
        "loglevel": "warning"
    },
    "reverse": {
        "bridges": [{
                "tag": "bridge", // 关于 Bridge 的反向代理标签,在路由中会用到
                "domain": "mydomain" // Bridge 和 Portal 反向代理通信的域名,可以自己取一个,可以不是自己购买的域名,但必须跟 Portal 中的 reverse 配置的域名一致
            }
        ]
    },
    "outbounds": [{
            "tag": "tunnel",
            "protocol": "vmess",
            "settings": {
                  //这里可根据自己喜好配置
            },
            "mux": {
                "enabled": true
            }
        },
        {
            "protocol": "freedom",
            "settings": {},
            "tag": "out"
        }
    ],
    "routing": {
        "rules": [{
                // 配置 Bridge 主动连接 Portal 的路由规则
                "type": "field",
                "inboundTag": [
                        "bridge"
                ],
                "domain": [
                        "full:mydomain"
                ],
                "outboundTag": "tunnel"
            }, {
                // 反向连接访问本地端口的规则
                "type": "field",
                "inboundTag": [
                        "bridge"
                ],
                "outboundTag": "out"
            }
        ]
    }
}

将上方配置保存为 nat-ddns.json ,保存在 /etc/v2ray/ 里面。

添加Systemd

/etc/systemd/system/新建 nat-ddns.service 内容如下:

[Unit]
Description=V2Ray Nat-DDNS Service
After=network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/nat-ddns.json
Restart=on-failure
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target

启动它,并允许开机自启

systemctl start nat-ddns
systemctl enable nat-ddns
Nginx二级目录反代

Nginx配置添加以下内容:

  location /status/ {
    proxy_redirect off;
    proxy_pass http://127.0.0.1:19999/;
    proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
  } 

重启Nginx

Portal

配置V2Ray

Portal 配置

 {
     "log": {
         "access": "/var/log/v2ray/access.log",
         "error": "/var/log/v2ray/error.log",
         "loglevel": "warning"
     },
     "reverse": {
         "portals": [{
                 "tag": "portal",
                 "domain": "mydomain" // 必须和 Bridge 设定的域名一样
             }
         ]
     },
     "inbound": {
     //我的配置
     },
     "inboundDetour": [{
             "tag": "tunnel",
                  //这里可根据自己喜好配置
         }, {
             // 接受 Client 的inbound
             "tag": "netdata", // 标签,路由中用到
             "port": 666,
             // 防火墙不用开放,用于接收内部的 HTTP 访问 
             "protocol": "dokodemo-door",
             "settings": {
                 "address": "127.0.0.1",
                 "port": 80,  //Bridge 的监听端口
                 "network": "tcp,udp"
             }
         }
     ],
     "routing": {
         "rules": [{ //路由规则,接收 Client 请求后发给 Bridge
                 "type": "field",
                 "inboundTag": [
                   "netdata"
                               ],
                 "outboundTag": "portal"
             }, { //路由规则,让 Portal 能够识别这是 Bridge 主动发起的反向代理连接
                 "type": "field",
                 "inboundTag": [
                         "tunnel"
                 ],
                 "outboundTag": "portal"
             }
         ]
     }
 }
Nginx二级目录反代

Nginx配置添加以下内容:

upstream local {
  server 127.0.0.1:666;
}
server
{
...
     location /status/ {
         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_set_header X-Forwarded-Proto $scheme;
         proxy_pass http://local;

         proxy_buffering on;
         proxy_buffer_size 2M; 
         proxy_buffers 16 2M;
         proxy_busy_buffers_size 8M;
         proxy_temp_file_write_size 8M;
         proxy_max_temp_file_size 0;

         proxy_connect_timeout       600;
         proxy_send_timeout          600;
         proxy_read_timeout          600;
         send_timeout                600;
      }
...
}

重启Nginx

看看效果吧: Netdata

ps:如果502那就说明是学校断电,树莓派关机了。。。

后记

后来又搭建了一个可道云:也能访问,我 Portal 在 树莓派上只反代了80端口,可道云的数据由树莓派上的Nginx反代二级目录得到,当然,如果开多个端口也是可以的, Portal 多加几个 inboundDetour 对,Nginx 添加相应二级目录反代即可,甚至可以通过树莓派访问内网局域网里的其他资源,这就要看各人的需求了。最后,看看我树莓派上的的可道云吧:

视频测试:魔术视频