软件地址:https://git.dev.taterli.com/nickfox-taterli/TunnelPanel
测试地址:http://www.tunnelbroker.ninja/
受众:很小,所以基础知识就不写了.
教程现在就开始,也就是第零步,首先你准备一台VPS,我用的是Nginx+MySQL+PHP+PHP Composer,注意PHP版本不能太低,应该要7.4或者以上,CentOS用户请绕路,不适合,这台VPS是用来挂这个面板的网站的.另外还要准备一个能SMTP的服务,还有BGP宣告服务器(或者路由器)需要支持Python3,因为还有对接工具嘛,最后还需要耐心,一定一定,切记切记不可以跳着看.
第一步,下载程序:
git clone https://git.dev.taterli.com/nickfox-taterli/TunnelPanel

第二步,配置程序,先进去composer update一下,漏什么补什么,漏脑子就放弃.

第三步,配置.env文件,编辑器选自己喜欢的就行.
cp .env.example .env
vim .env
重点配置ROUTE_API_URL和IPV6_PREFIX,其中里面有例子,可以按着配置,ROUTE_API_URL请先想一个不容易被猜到的URL,比如https://68b32817da58.tunnelbroker.ninja,记得末尾不要有斜杠,然后前缀只能是/48,我太懒了.最后SERVER_IPV4是BGP服务器的IPv4.
还有就是数据库(需要先从phpMyAdmin或者其他工具创建好数据库),SMTP邮件配置.

当你全部改完(大概十几条配置),然后运行这个命令安装初始数据.
php artisan migrate

第四步,编辑nginx的网站配置,比如我就新建一个/etc/nginx/sites-available/tunnel文件,然后包含以下内容,不必照抄,灵活变通.
server {
# 监听 HTTP 协议默认的 [80] 端口。
listen 80;
# 网站域名
server_name tunnelbroker.ninja;
# 服务器站点根目录 [/example.com/public]。
root /var/www/html/TunnelPanel/public;
# 添加几条有关安全的响应头;与 Google+ 的配置类似,详情参见文末。
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
# 站点默认页面;可指定多个,将顺序查找。
# 例如,访问 http://example.com/ Nginx 将首先尝试「站点根目录/index.html」是否存在,不存在则继续尝试「站点根目录/index.htm」,以此类推...
index index.nginx-debian.html index.html index.htm index.php;
# 指定字符集为 UTF-8
charset utf-8;
# Laravel 默认重写规则;删除将导致 Laravel 路由失效且 Nginx 响应 404。
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 关闭 [/favicon.ico] 和 [/robots.txt] 的访问日志。
# 并且即使它们不存在,也不写入错误日志。
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
# 将 [404] 错误交给 [/index.php] 处理,表示由 Laravel 渲染美观的错误页面。
error_page 404 /index.php;
# URI 符合正则表达式 [\.php$] 的请求将进入此段配置
location ~ \.php$ {
# 配置 FastCGI 服务地址,可以为 IP:端口,也可以为 Unix socket。
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# 配置 FastCGI 的主页为 index.php。
fastcgi_index index.php;
# 配置 FastCGI 参数 SCRIPT_FILENAME 为 $realpath_root$fastcgi_script_name。
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
# 引用更多默认的 FastCGI 参数。
include fastcgi_params;
}
# 通俗地说,以上配置将所有 URI 以 .php 结尾的请求,全部交给 PHP-FPM 处理。
# 除符合正则表达式 [/\.(?!well-known).*] 之外的 URI,全部拒绝访问
# 也就是说,拒绝公开以 [.] 开头的目录,[.well-known] 除外
location ~ /\.(?!well-known).* {
deny all;
}
}
第五步,把网站配置文件启用并访问试试.
ln -s /etc/nginx/sites-available/tunnel /etc/nginx/sites-enabled/tunnel
chown www-data:www-data /var/www/html -R
systemctl restart nginx
现在打开网站,然后注册一个账户,正常来说收到激活邮件,然后激活,如果看不到这个界面,请检查有没有漏任何操作.


那么现在你想套什么SSL随你,但是还没完成,后端还没装.
现在在BGP的机器上创建一个这个Python脚本,然后记得修改里面的关键内容,我就懒得解释了,这么简单的脚本应该很好懂.
import os
from flask import Flask
app = Flask(__name__)
@app.route('/add/<int:id>/<string:ip>')
def add_tunnel(id, ip):
config = ('''auto tun%d
iface tun%d inet6 v4tunnel
address 2a0e:aa07:e024:%x::2
netmask 64
endpoint %s
local 23.94.26.137
ttl 255
mtu 1280
post-up ip route add 2a0e:aa07:e024:%x::/64 dev tun%d
pre-down ip route del 2a0e:aa07:e024:%x::/64 dev tun%d
''' % (id, id, 2*(id - 1) + 1, ip, 2*(id - 1) + 2, id, 2*id, id))
with open('/etc/network/interfaces.d/tun' + str(id), 'w') as f:
f.write(config)
os.system('ifdown tun' + str(id))
os.system('ifup tun' + str(id))
return ''
@app.route('/del/<int:id>')
def del_tunnel(id):
os.system('ifdown tun' + str(id))
os.unlink('/etc/network/interfaces.d/tun' + str(id))
return ''
app.run(debug=True, host="127.0.0.1", port=49080)
然后丢在screen或者做成服务随你喜欢,如果丢在screen记得做个死循环防止他跑丢了,服务也是要做restart policy,这里不细说.
while true
do
python3 InstallTun.py
sleep 0.1
done
当然这个还没结束,BGP机也装个Nginx,用来反代这个脚本,反代的配置就简单很多,不建议为他配置SSL,很容易发生域名枚举风险.
server {
listen 80;
root /var/www/html;
server_name 68b32817da58.tunnelbroker.ninja;
location / {
proxy_pass http://127.0.0.1:49080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
最后重启BGP机的Nginx,全部配置OK.
功能截图


现在还有很多BUG还没解决,慢慢来.多个前缀就多搭几个站,我反正是懒得解决了.
您好,请问博客可以转载吗?
@L HG 当然没问题.
[…] 这里使用的是Tater大佬的BGP下发面板 :https://www.taterli.com/8261/ […]
学习啦~~~