2025-09-12 11:04:35
第一次见到SSH爆破把机子内存干爆了的。。
起因:早上发现站打不开了,提示数据库连接失败。然后登上去检查数据库运行状态:
journalctl -u mariadb.service
发现被OOM了:
OOM就是机子内存耗尽的时候,内核会自动触发OOM-Killer杀进程释放内存。OOM发生时是肯定可以在dmesg里面找到详细日志的:
journalctl -k
我发现时间发生在11号21点46分(UTC时间)
我详细看了这个日志,比较纳闷的是这个日志里面为什么会有这么多的sshd进程,按道理来说那种全网扫描爆破ssh的,试个1-2次就不会继续了,哪怕就是故意来爆破你机子ssh的也不可能让ssh起这么多进程啊。。因为OOM只管杀进程释放内存,被杀的进程并不一定是真正的元凶,所以我想找到当时机子内存耗尽的根本原因。
接着我用下面的命令查看OOM前后5分钟的日志:
journalctl --since "2025-09-11 21:40:00" --until "2025-09-11 21:50:00"
结果就发现这个IP:148.72.158.192是真的牛逼,它这是一秒钟射了多少次啊?你管这叫爆破ssh?你搁这…搁这压力测试呢?
148.72.158.192你妈妈喊你回家吃饭,别在网上搞破坏了!
在经历过忘记root密码,以及被这样的ssh爆破后,我感觉是时候改改用密码登录的习惯了,重要的机子换端口+key登录确实很有必要=-=
为什么之前一直不太愿意用key登录,或者说习惯了用密码登录,是因为很多VPS交付的时候就是用的密码登录,甚至有些商家的面板根本不支持key登录。。手上机子一多,这样一个个改多麻烦,久而久之就养成了密码登录的习惯。。。
2025-09-11 20:53:07
试试看能不能回点血,我自己跑了几个程序用不了这么多资源。
机器是年付的,我跑了机器也跑不了,除非CCS倒闭了:
母鸡实际配置:
小鸡配置如下:
1Core Xeon CPU
1GB RAM
10GB SSD
500Mbps Up and Down Fair Share
1TB bandwidth
1Public IPv6 Address (HE Tunnel)
KVM virtualization
Location US Buffalo
1年5刀,目前只支持加密货币付款,有需要的可以点这里下单哦
yabs:
另外还有一台去年中奖款的KS-LE-B,目前也是吃灰状态,试试看能不能出租出去,如果有需要的可以点这里下单。
2025-09-08 08:50:38
我的一台闲置了很久的OVH独服ROOT密码忘记了= =,记录下重置ROOT密码的步骤,备忘以备不时之需。(事后我又找到了密码,你就说难受不难受吧)
首先在OVH面板启动救援系统(Debian12),不得不说OVH的这个救援系统做的真好,系统内自带了ZFS,我就不需要去装ZFS了,省了一堆事。先看一下硬盘和文件系统的情况,知道是ZFS,池的名字是rpool就好办了:
直接把rpool挂载到/mnt:
zpool import -f -R /mnt rpool
用这个命令检查下看挂载成功没:
zpool list
正常的话应该显示:
然后用下面的命令修改ROOT密码:
passwd -R /mnt
[重要]改完密码之后一定要使用下面的命令unmount所有zfs池:
zpool export -a
否则机子无法开机引导!!!
2025-08-30 12:39:03
这篇文章介绍Remnawave订阅相关的内容,可能有点多有点杂,我尽量写的详细一点= =
首先在Remnawave面板里面有一个很重要的概念:主机。
这个主机是个啥意思呢?用一句话总结就是:你每添加的一个主机就对应最终用户在他们的客户端(Shadowrocket、Happ、sing-box等)上看到的节点。
假设现在我想让用户拥有一个VLESS-XHTTP-TLS过CDN的节点,现在我尝试添加一个主机。
1、备注随便填写,这是最终用户在他们的客户端上看到的节点名字。
2、每个主机都需要选择一个配置文件:
主机选择的这个配置文件必须已经有节点激活在使用:
3、因为我这是搭建的一个过CDN的节点,所以地址这里填写的是域名,且CloudFlare需要打开小云朵开关,如无需过CDN或者无需域名的情况下,可直接填写节点服务器的公网IP。
4、端口在大多数情况下,必须与所选配置文件内的入站端口匹配。首次添加的主机会自动识别配置文件内入站所使用的端口。
5、勾选主机可见性,启用这个主机。这样就创建好了一个主机。
Remnawave面板的第二个概念:内部分组。
一句话总结:内部分组的作用就是一种访问控制。最主要的功能是用来控制最终用户可以使用的主机(节点)。
Remnawave面板自带一个默认的内部分组,这里演示我就用这个自带的Default-Squad分组了,点击编辑:
这里可以同时选择多个配置文件(如果有的话),勾选你想让用户使用的入站配置:
接着我们创建一个用户,让这个用户使用Default-Squad分组:
这样用户就拥有了自己的订阅链接,他们可以通过这个订阅链接导入节点信息到各类客户端中使用。并且这个订阅链接内只包含你在Default-Squad分组内允许的入站配置:
Remnawave面板的第三个概念:订阅设置。
这个订阅设置怎么说呢,主要看用户使用的是什么客户端,因为不同的客户端在处理订阅链接时的行为不一样。但是对于Remnawave面板而言大致可以分为两类:基础订阅、json订阅。
这两者的区别是基础订阅一般情况下只包含节点信息,不包含路由规则、DNS配置等信息。而json订阅是包含路由规则、DNS配置等信息的。
我这里就拿自己常用的几个iOS客户端来演示吧。我平时用Shadowrocket、Happ、sing-box比较多。这里就主要说一下这三个客户端。
其中支持基础订阅的客户端,比如Shadowrocket,一般情况下它只提取订阅链接中的(主机)节点信息,像什么路由规则、DNS配置等等是不管的,因为它有自己的规则配置。所以它是开箱即用的,直接把Remnawave面板的订阅链接输上去导入就行了。
Happ这个客户端有点特殊,因为它同时支持基础订阅和json订阅,并且它支持在基础订阅内包含路由规则、DNS配置等信息。我使用这个客户端的时候一般不勾选“在基础订阅提供 JSON”,这样可以让Happ始终使用基础订阅,如果你勾选了这个,Happ默认就是json订阅了,那么你就需要自己搓一个json的订阅模板:
现在演示一下Happ如何在基础订阅内包含路由规则、DNS配置等信息。下面是我已经配置好的一个Happ路由链接:
happ://routing/add/eyJOYW1lIjoiQ2hpbmEiLCJHbG9iYWxQcm94eSI6InRydWUiLCJSZW1vdGVETlNUeXBlIjoiRG9IIiwiUmVtb3RlRE5TRG9tYWluIjoiaHR0cHM6Ly9kbnMuZ29vZ2xlL2Rucy1xdWVyeSIsIlJlbW90ZUROU0lQIjoiOC44LjguOCIsIkRvbWVzdGljRE5TVHlwZSI6IkRvSCIsIkRvbWVzdGljRE5TRG9tYWluIjoiaHR0cHM6Ly9kbnMuYWxpZG5zLmNvbS9kbnMtcXVlcnkiLCJEb21lc3RpY0ROU0lQIjoiMjIzLjUuNS41IiwiR2VvaXB1cmwiOiIiLCJHZW9zaXRldXJsIjoiIiwiTGFzdFVwZGF0ZWQiOiIiLCJEbnNIb3N0cyI6eyJkbnMuZ29vZ2xlIjoiOC44LjguOCIsImRucy5hbGlkbnMuY29tIjoiMjIzLjUuNS41In0sIkRpcmVjdFNpdGVzIjpbImdlb3NpdGU6Z2VvbG9jYXRpb24tY24iXSwiRGlyZWN0SXAiOlsiZ2VvaXA6Y24iXSwiUHJveHlTaXRlcyI6WyJnZW9zaXRlOmdlb2xvY2F0aW9uLSFjbiJdLCJQcm94eUlwIjpbXSwiQmxvY2tTaXRlcyI6W10sIkJsb2NrSXAiOltdLCJEb21haW5TdHJhdGVneSI6IklQSWZOb25NYXRjaCIsIkZha2VETlMiOiJmYWxzZSIsIlVzZUNodW5rRmlsZXMiOiJ0cnVlIn0=
可以直接在面板内通过Happ路由编辑器导入并解码然后根据自己的需要来修改:
解码后的配置如下:
{ "Name": "China", "GlobalProxy": "true", "RemoteDNSType": "DoH", "RemoteDNSDomain": "https://dns.google/dns-query", "RemoteDNSIP": "8.8.8.8", "DomesticDNSType": "DoH", "DomesticDNSDomain": "https://dns.alidns.com/dns-query", "DomesticDNSIP": "223.5.5.5", "Geoipurl": "", "Geositeurl": "", "LastUpdated": "", "DnsHosts": { "dns.google": "8.8.8.8", "dns.alidns.com": "223.5.5.5" }, "DirectSites": [ "geosite:geolocation-cn" ], "DirectIp": [ "geoip:cn" ], "ProxySites": [ "geosite:geolocation-!cn" ], "ProxyIp": [], "BlockSites": [], "BlockIp": [], "DomainStrategy": "IPIfNonMatch", "FakeDNS": "false", "UseChunkFiles": "true" }
建议不要使用太多的geosite、geoip规则,Happ在iOS上的Xray-core有50MB内存限制,超过50MB内存就会停止运行。这些规则多了会导致Xray-core内存迅速超过50NB。
如果不需要修改我提供的这个Happ路由规则,那么只需要在Remnawave面板的订阅设置–>Happ路由,添加保存即可:
现在说一下sing-box这个客户端,这其实是我主力使用的一个客户端,这个客户端只支持json订阅,所以需要在Remnawave面板配置一个json模板:
下面是我配置好的一个模板(基于GUI for SingBox导出),目前这个配置可以直接拿来用,但是我还是要稍微提一下哈,这个模板为了兼容sing-box 1.11(iOS客户端没办法更新)所以有些配置不是当前sing-box 1.12推荐的,随着sing-box的版本更新,有些配置可能会被弃用,到时会失效。(sing-box经常出破坏性的更新,没办法)
{ "dns": { "final": "Remote-DNS", "rules": [ { "action": "route", "server": "Local-DNS", "outbound": "any" }, { "action": "route", "server": "Local-DNS", "clash_mode": "direct" }, { "action": "route", "server": "Remote-DNS", "clash_mode": "global" }, { "action": "route", "server": "Local-DNS", "rule_set": [ "GeoSite-CN" ] }, { "action": "route", "server": "Remote-DNS", "rule_set": [ "GeoLocation-!CN" ] } ], "servers": [ { "tag": "Local-DNS", "detour": "🎯 全球直连", "address": "https://223.5.5.5:443/dns-query", "address_resolver": "Local-DNS-Resolver" }, { "tag": "Local-DNS-Resolver", "detour": "🎯 全球直连", "address": "udp://223.5.5.5:53" }, { "tag": "Remote-DNS", "detour": "→ Remnawave", "address": "tls://8.8.8.8:853", "address_resolver": "Remote-DNS-Resolver" }, { "tag": "Remote-DNS-Resolver", "detour": "→ Remnawave", "address": "udp://8.8.8.8:53" } ], "disable_cache": false, "disable_expire": false, "independent_cache": false }, "log": { "level": "info", "output": "", "disabled": false, "timestamp": false }, "route": { "final": "→ Remnawave", "rules": [ { "action": "sniff", "inbound": "tun-in" }, { "action": "hijack-dns", "protocol": "dns" }, { "action": "route", "outbound": "🎯 全球直连", "clash_mode": "direct" }, { "action": "route", "outbound": "→ Remnawave", "clash_mode": "global" }, { "action": "reject", "protocol": "quic" }, { "action": "reject", "rule_set": [ "Category-Ads" ] }, { "action": "route", "outbound": "→ Remnawave", "domain_keyword": "nexon" }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoSite-Private" ] }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoSite-CN" ] }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoIP-Private" ] }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoIP-CN" ] }, { "action": "route", "outbound": "→ Remnawave", "rule_set": [ "GeoLocation-!CN" ] } ], "rule_set": [ { "tag": "Category-Ads", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/category-ads-all.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoIP-Private", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/private.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoSite-Private", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/private.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoIP-CN", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/cn.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoSite-CN", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/cn.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoLocation-!CN", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/geolocation-!cn.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" } ], "auto_detect_interface": true }, "inbounds": [ { "mtu": 9000, "tag": "tun-in", "type": "tun", "stack": "system", "address": [ "172.18.0.1/30" ], "auto_route": true, "strict_route": true, "interface_name": "WiFi-6", "endpoint_independent_nat": false } ], "outbounds": [ { "tag": "→ Remnawave", "type": "selector", "outbounds": [ "⚡️ 自动选择" ], "interrupt_exist_connections": true }, { "tag": "⚡️ 自动选择", "url": "https://www.gstatic.com/generate_204", "type": "urltest", "interval": "3m", "outbounds": null, "tolerance": 150, "interrupt_exist_connections": true }, { "tag": "🎯 全球直连", "type": "direct" } ], "experimental": { "clash_api": { "secret": "", "external_ui": "", "default_mode": "rule", "external_controller": "127.0.0.1:2413", "external_ui_download_url": "", "access_control_allow_origin": [ "*" ], "external_ui_download_detour": "🎯 全球直连", "access_control_allow_private_network": false }, "cache_file": { "path": "cache.db", "enabled": true, "cache_id": "", "store_rdrc": true, "rdrc_timeout": "7d", "store_fakeip": true } } }
我常用的几个客户端就都介绍完了,实际上你可以看到Remnawave面板的json订阅配置还支持Mihomo、Stash等,但是我不用这些这里就不介绍了。
[可选]搭建一个Remnawave Subscription Page(独立的订阅页面程序)其作用是可以隐藏Remnawave面板域名,并且提供一个更美观的订阅页面。先看下效果:
编辑Remnawave面板的.env配置文件:
cd /opt/remnawave && nano .env
把之前的这个配置:
SUB_PUBLIC_DOMAIN=remnawave.example.com/api/sub
修改为你的订阅页面域名:
SUB_PUBLIC_DOMAIN=subscription.example.com
创建compose文件:
mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano docker-compose.yml
写入如下配置:
services: remnawave-subscription-page: image: remnawave/subscription-page:latest container_name: remnawave-subscription-page hostname: remnawave-subscription-page restart: always environment: - REMNAWAVE_PANEL_URL=https://remnawave.example.com - APP_PORT=3010 - META_TITLE="Subscription Page Title" - META_DESCRIPTION="Subscription Page Description" ports: - '127.0.0.1:3010:3010' networks: - remnawave-network networks: remnawave-network: driver: bridge external: true
注意:REMNAWAVE_PANEL_URL这里要指向你的面板URL,但是有多种配置方法。
1、此订阅页面程序与面板不在同一台服务器部署,那么这里就填写面板的域名,并且去掉compose内的external: true配置。
2、在同一服务器部署,可以直接填面板服务的主机名:3000,例如:http://remnawave:3000,也可以直接填写域名。
启动:
docker compose up -d
配置反向代理,我这里用的Pangolin:
2025-08-30 12:38:46
这篇文章记录一下Remnawave节点的安装与配置。
先简单介绍一下Remnawave节点的工作方式,Remnawave节点是通过面板下发配置来运行的,也就是我们在面板内手搓Xray-core的配置文件(或者使用官方的配置模板),然后节点会获取到面板的Xray-core配置文件,之后节点根据Xray-core配置文件内的设置来运行。
Xray-core本身是支持非常多的协议与传输方式的,这些协议与传输方式大多数Remnawave都是支持的,但是有一些例外,比如ss现在还不支持2022。在这种情况下,这篇文章我只列出几个具有典型参考价值的配置示例:
Shadowsocks(配置起来最简单)
VLESS-TCP-REALITY(不需要SSL证书)
VLESS-XHTTP-REALITY(不需要SSL证书)
VLESS-XHTTP-TLS(可过CDN,需要SSL证书)
Trojan-Websocket-TLS (可过CDN,需要SSL证书,但是已经被Xray-core弃用,建议用XHTTP)
首先登录Remnawave面板,找到配置文件:
创建新的配置文件:
Shadowsocks示例配置:
{ "log": { "loglevel": "info" }, "inbounds": [ { "tag": "Shadowsocks_97591", "port": 51888, "protocol": "shadowsocks", "settings": { "clients": [], "network": "tcp,udp" }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] } } ], "outbounds": [ { "tag": "DIRECT", "protocol": "freedom" }, { "tag": "BLOCK", "protocol": "blackhole" } ], "routing": { "rules": [] } }
VLESS-TCP-REALITY示例配置:
{ "log": { "loglevel": "info" }, "inbounds": [ { "tag": "VLESS_TCP_REALITY", "port": 443, "protocol": "vless", "settings": { "clients": [], "decryption": "none" }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] }, "streamSettings": { "network": "raw", "security": "reality", "realitySettings": { "show": false, "xver": 0, "target": "www.cloudflare.com:443", "shortIds": [ "" ], "privateKey": "填写面板生成的私钥", "serverNames": [ "www.cloudflare.com" ] } } } ], "outbounds": [ { "tag": "DIRECT", "protocol": "freedom" }, { "tag": "BLOCK", "protocol": "blackhole" } ], "routing": { "rules": [] } }
VLESS-XHTTP-REALITY示例配置:
{ "log": { "loglevel": "info" }, "inbounds": [ { "tag": "VLESS_XHTTP_REALITY", "port": 8443, "protocol": "vless", "settings": { "clients": [], "decryption": "none" }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] }, "streamSettings": { "network": "xhttp", "security": "reality", "xhttpSettings": { "host": "", "mode": "auto", "path": "/fuckgfw_0x000008964" }, "realitySettings": { "target": "www.cloudflare.com:443", "shortIds": [ "" ], "privateKey": "填写面板生成的私钥", "serverNames": [ "www.cloudflare.com" ] } } } ], "outbounds": [ { "tag": "DIRECT", "protocol": "freedom" }, { "tag": "BLOCK", "protocol": "blackhole" } ], "routing": { "rules": [] } }
VLESS-XHTTP-TLS示例配置:
{ "log": { "loglevel": "info" }, "inbounds": [ { "tag": "VLESS_XHTTP_TLS", "port": 2096, "protocol": "vless", "settings": { "clients": [], "decryption": "none" }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] }, "streamSettings": { "network": "xhttp", "security": "tls", "tlsSettings": { "alpn": [ "h3", "h2", "http/1.1" ], "minVersion": "1.2", "serverName": "xhttp.example.com", "certificates": [ { "keyFile": "/var/lib/remnawave/configs/xray/ssl/xhttp.example.com.key", "certificateFile": "/var/lib/remnawave/configs/xray/ssl/xhttp.example.com.pem" } ] }, "xhttpSettings": { "host": "xhttp.example.com", "mode": "auto", "path": "/fuckgfw_0x000008964" } } } ], "outbounds": [ { "tag": "DIRECT", "protocol": "freedom" }, { "tag": "BLOCK", "protocol": "blackhole" } ], "routing": { "rules": [] } }
Trojan-Websocket-TLS示例配置:
{ "log": { "loglevel": "info" }, "inbounds": [ { "tag": "Trojan_Websocket_TLS", "port": 2087, "protocol": "trojan", "settings": { "clients": [] }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] }, "streamSettings": { "network": "ws", "security": "tls", "wsSettings": { "host": "trojan.example.com", "path": "/ws", "headers": {} }, "tlsSettings": { "minVersion": "1.2", "certificates": [ { "keyFile": "/var/lib/remnawave/configs/xray/ssl/trojan.example.com.key", "certificateFile": "/var/lib/remnawave/configs/xray/ssl/trojan.example.com.pem" } ], "cipherSuites": "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "rejectUnknownSni": true } } } ], "outbounds": [ { "tag": "DIRECT", "protocol": "freedom" }, { "tag": "BLOCK", "protocol": "blackhole" } ], "routing": { "rules": [] } }
一个配置文件可以有多个入站,也就是说你可以把刚才的这些示例配置整合在一个配置文件内,这样一个节点就可以同时选择多个入站,让一个节点同时支持多种协议、传输方式。
例如我可以将上面的VLESS-XHTTP-REALITY、VLESS-XHTTP-TLS、Trojan-Websocket-TLS都配置在一个配置文件内:
{ "log": { "loglevel": "info" }, "inbounds": [ { "tag": "Trojan_Websocket_TLS", "port": 2087, "protocol": "trojan", "settings": { "clients": [] }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] }, "streamSettings": { "network": "ws", "security": "tls", "wsSettings": { "host": "trojan.example.com", "path": "/ws", "headers": {} }, "tlsSettings": { "minVersion": "1.2", "certificates": [ { "keyFile": "/var/lib/remnawave/configs/xray/ssl/trojan.example.com.key", "certificateFile": "/var/lib/remnawave/configs/xray/ssl/trojan.example.com.pem" } ], "cipherSuites": "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "rejectUnknownSni": true } } }, { "tag": "VLESS_XHTTP_TLS", "port": 2096, "protocol": "vless", "settings": { "clients": [], "decryption": "none" }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] }, "streamSettings": { "network": "xhttp", "security": "tls", "tlsSettings": { "alpn": [ "h3", "h2", "http/1.1" ], "minVersion": "1.2", "serverName": "xhttp.example.com", "certificates": [ { "keyFile": "/var/lib/remnawave/configs/xray/ssl/xhttp.example.com.key", "certificateFile": "/var/lib/remnawave/configs/xray/ssl/xhttp.example.com.pem" } ] }, "xhttpSettings": { "host": "xhttp.example.com", "mode": "auto", "path": "/fuckgfw_0x000008964" } } }, { "tag": "VLESS_XHTTP_REALITY", "port": 8443, "protocol": "vless", "settings": { "clients": [], "decryption": "none" }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] }, "streamSettings": { "network": "xhttp", "security": "reality", "xhttpSettings": { "host": "", "mode": "auto", "path": "/fuckgfw_0x000008964" }, "realitySettings": { "target": "www.cloudflare.com:443", "shortIds": [ "" ], "privateKey": "填写面板生成的私钥", "serverNames": [ "www.cloudflare.com" ] } } } ], "outbounds": [ { "tag": "DIRECT", "protocol": "freedom" }, { "tag": "BLOCK", "protocol": "blackhole" } ], "routing": { "rules": [] } }
其中使用REALITY的配置需要生成密钥对,可以通过面板的“生成密钥”功能生成:
在面板的配置文件中只需要把生成的私钥填写上去,公钥面板会通过订阅自动配置给客户端不需要管:
对于需要使用SSL证书的节点,需要在Remnawave面板的后端服务内添加一个bind mount,将SSL证书挂载到容器内。Remnawave面板会将节点需要用到的SSL证书发送给相应节点。
在Remnawave面板项目目录内新建一个ssl目录用于存放SSL证书:
cd /opt/remnawave mkdir ssl
然后编辑compose文件:
nano docker-compose.yml
添加bind mount,示例配置:
... remnawave: image: remnawave/backend:latest container_name: 'remnawave' hostname: remnawave restart: always ports: - '127.0.0.1:3000:3000' env_file: - .env networks: - remnawave-network volumes: - ./ssl:/var/lib/remnawave/configs/xray/ssl healthcheck: test: ['CMD-SHELL', 'curl -f http://localhost:${METRICS_PORT:-3001}/health'] interval: 30s timeout: 5s retries: 3 start_period: 30s depends_on: remnawave-db: condition: service_healthy remnawave-redis: condition: service_healthy ...
这些可以过CDN的配置(VLESS-XHTTP-TLS、Trojan-Websocket-TLS)我个人建议直接使用CloudFlare的源证书,一次申请可以用15年,后续几乎不用维护:
将申请好的证书和私钥分别保存到ssl目录下,例如:xhttp.example.com.key、xhttp.example.com.pem。文件名务必与之前在配置文件内的保持一致。
同时务必在CloudFlare内将SSL/TLS模式选择为完全(严格):
另外请注意CloudFlare回源有端口限制,HTTPS仅支持以下端口:
443
2053
2083
2087
2096
8443
配置好证书后重启面板:
docker compose down docker compose up -d
回到面板内,找到节点–>管理,现在尝试创建一个节点,点击如图所示按钮将复制下来的内容保存好待会需要用到:
现在来安装节点,首先在节点服务器上也需要安装Docker:
apt -y update apt -y install curl curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh
创建目录:
mkdir /opt/remnanode && cd /opt/remnanode
创建.env文件:
nano .env
写入如下配置,其中SSL_CERT=后面的内容是之前你在面板上复制的,粘贴到这里即可:
APP_PORT=22222 SSL_CERT=CERT_FROM_MAIN_PANEL
创建compose文件:
nano docker-compose.yml
写入如下配置:
services: remnanode: container_name: remnanode hostname: remnanode image: remnawave/node:latest restart: always network_mode: host env_file: - .env
启动节点服务:
docker compose up -d
回到面板内,填写节点服务器的IP地址与端口,端口是之前在.env配置文件内设置的22222端口:
点击更改配置文件,选择之前创建的配置,可以选择一个配置文件内的单个或多个入站(如果有的话)但不能同时选择多个配置文件:
这里我为了演示就把之前的三个入站都勾选上:
等待片刻,如果一切正常,面板上面应显示节点是在线状态:
如果节点连接不上,除了网络问题外,一般是Xray-core配置有误,可以通过下面的命令来检查remnanode容器的日志:
docker compose logs -f
如果看到有类似这样的错误提示,则可以确定是Xray-core配置有误:
XML-RPC fault: SPAWN_ERROR: xray
然后使用下面的命令来查看Xray-core的日志,根据Xray-core的日志信息来解决相应的问题:
docker exec -it remnanode tail -n +1 -f /var/log/supervisor/xray.out.log
这篇文章就先写到这里,下篇文章介绍Remnawave订阅相关的内容。
2025-08-30 12:38:23
最近发现了一个俄罗斯人开发的代理面板:Remnawave,我被其颜值深深吸引了,然后安装试了一下发现这面板还挺好用,中看又中用的那种!遂记录下折腾笔记。
先简单说一下个人使用体验,因为这个面板基于Xray-core,所以有些协议是没办法支持的,比如hy2,anytls这些,算是小小的遗憾吧。这是我最不爽的地方,不过也没办法。当然也有亮点,那就是最近Xray-core新出的xhttp。只能说有得有失=。=
然后这个面板要上手的话还是有点难度的,它有几个概念初次用的话可能会有点摸不着头脑,这些稍后再详细说。
再就是虽然它是一个面板,但还是需要你自己搓配置文件,无论是Xray-core的配置还是订阅用到的json配置都是需要自己手搓的。虽然官方有提供一些配置模板,但是实测下来都不太适合中国用户使用。
那这篇文章先记录下安装的步骤,实际上官方的安装文档写的很详细了,但是我用来部署的这台机器有点特殊(没有公网IP)所以我没有用NGINX反代,而是用的Pangolin。至于Pangolin是什么,可以先看看这篇文章
安装Docker:
apt -y update apt -y install curl curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh
创建目录,在目录内下载compose文件和.env配置文件:
mkdir /opt/remnawave && cd /opt/remnawave curl -o docker-compose.yml https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml curl -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sample
配置.env文件,生成secure keys,程序安全运行的保障,必须设置复杂一点,可以用下面的命令自动生成:
sed -i "s/^JWT_AUTH_SECRET=.*/JWT_AUTH_SECRET=$(openssl rand -hex 64)/" .env && sed -i "s/^JWT_API_TOKENS_SECRET=.*/JWT_API_TOKENS_SECRET=$(openssl rand -hex 64)/" .env
生成密码,注意这个密码不是管理员的密码,这个密码仅仅用作访问后端的一些服务用,一般是不需要用到的,也可以用下面的命令自动生成:
sed -i "s/^METRICS_PASS=.*/METRICS_PASS=$(openssl rand -hex 64)/" .env && sed -i "s/^WEBHOOK_SECRET_HEADER=.*/WEBHOOK_SECRET_HEADER=$(openssl rand -hex 64)/" .env
修改POSTGRES数据库密码,使用下面的命令自动生成一个随机密码即可:
pw=$(openssl rand -hex 24) && sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env && sed -i "s|^\(DATABASE_URL=\"postgresql://postgres:\)[^\@]*\(@.*\)|\1$pw\2|" .env
再手动编辑.env配置文件:
nano .env
修改如下配置为你的域名,我这里演示就用example.com:
FRONT_END_DOMAIN=remnawave.example.com SUB_PUBLIC_DOMAIN=remnawave.example.com/api/sub
启动:
docker compose up -d
现在需要配置反向代理,我这里用Pangolin来反代,因为我这机器没有公网IP(我自己的Proxmox VE开的小鸡)。如果你是有公网IP的机器可以直接参考官方的反代文档
在Pangolin里面创建站点,隧道类型选择Newt:
往下看会有Linux系统安装的命令,但是这个仅在前台运行:
wget -O newt "https://github.com/fosrl/newt/releases/download/1.4.2/newt_linux_amd64" && chmod +x ./newt mv newt /usr/local/bin
现在要让它在后台一直运行,需要创建一个systemd服务:
nano /etc/systemd/system/newt.service
写入如下配置:
[Unit] Description=Newt After=network.target [Service] ExecStart=/usr/local/bin/newt --id yourid --secret yoursecret --endpoint https://pangolin.example.com Restart=always User=root [Install] WantedBy=multi-user.target
启动并设置开机自启:
systemctl enable --now newt.service
确保它是在线的状态:
接下来创建资源,指定刚创建的站点,并设置一个子域名,这个域名就是用来访问Remnawave的:
资源创建完成后,首先来到Authentication,将Pangolin自带的这个验证功能关掉:
来到Proxy–>Targets Configuration,按如图所示添加一个代理,IP/Hostname:127.0.0.1,Port:3000:
如果正常的话现在就能通过remnawave.example.com访问到Remnawave面板了。创建你的管理员账号并登录,这就是Remnawave面板首页的样子:
这篇文章就先写到这里,下篇文章介绍Remnawave节点的安装与配置。