MoreRSS

site iconSB | 烧饼修改

持有 u.sb sb.sb sha.bi域名,专注于服务器运维、专业域名投资分析。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

SB | 烧饼的 RSS 预览

Ubuntu 24.04 Noble 升级 Ubuntu 26.04 Resolute

2026-05-20 03:12:04

Ubuntu 24.04 Noble 升级 Ubuntu 26.04 Resolute

本文将指导如何升级 Ubuntu 24.04 Noble Numbat 到 Ubuntu 26.04 Resolute Raccoon。

相关教程:Ubuntu 22.04 Jammy 升级 Ubuntu 24.04 Noble

准备工作

除非你是物理服务器,以及没有用过奇奇怪怪定制或修改的内核的 KVM 构架的 VPS 和云主机,否则升级大版本更新内核是有一定机率导致 Grub 加载失败的,切记备份重要数据!

OpenVZ 和 LXC 构架的 VPS 是无法升级的,因为他们没有自己独立的内核

再强调一遍,一定要备份重要数据!

Ubuntu 26.04 LTS 已经正式发布,不过 Ubuntu LTS 版本的自动升级提示通常会等到第一个小版本发布后才会开放。如果你在 Ubuntu 26.04.1 LTS 发布前从 Ubuntu 24.04 LTS 升级,do-release-upgrade 需要加上 -d 参数。

以下操作需要在 root 用户下完成,请使用 sudo -isu root 切换到 root 用户进行操作

更新系统

首先需要更新你当前的系统

apt update
apt upgrade -y
apt dist-upgrade -y
apt autoclean
apt autoremove -y

如果内核更新了,可以重启让最新的内核生效,也可以直接进行升级。

升级系统

这里有两种升级系统的方法,第一种是使用 do-release-upgrade 命令,第二种是手动更新 apt 源文件。

方法一:使用 do-release-upgrade 命令

首先需要安装 ubuntu-release-upgrader-core 包:

apt install ubuntu-release-upgrader-core

然后修改 /etc/update-manager/release-upgrades 文件,确保 Prompt 值为 lts

cat /etc/update-manager/release-upgrades | grep lts

显示如下内容即可:

root@ubuntu ~ # cat /etc/update-manager/release-upgrades | grep lts
#  lts    - Check to see if a new LTS release is available.  The upgrader
Prompt=lts

最后执行以下命令升级系统:

do-release-upgrade -d

等 Ubuntu 26.04.1 LTS 发布并开放 LTS 自动升级后,可以直接使用:

do-release-upgrade

方法二:手动更新 apt 源文件

Ubuntu 24.04 的默认软件源配置文件已经变更为 DEB822 格式,路径为 /etc/apt/sources.list.d/ubuntu.sources。我们可以直接替换 nobleresolute

sed -i 's/noble/resolute/g' /etc/apt/sources.list.d/ubuntu.sources

如果你的系统里仍然有传统 One-Line-Style 的源文件,也可以一并替换:

sed -i 's/noble/resolute/g' /etc/apt/sources.list
sed -i 's/noble/resolute/g' /etc/apt/sources.list.d/*.list

如果没有对应文件会提示诸如 sed: can't read /etc/apt/sources.list: No such file or directory 的错误,忽略即可。

或者直接一行命令:

sed -i 's/noble/resolute/g' /etc/apt/sources.list /etc/apt/sources.list.d/*.{list,sources} 2>/dev/null

使用 DEB822 格式的源文件 /etc/apt/sources.list.d/ubuntu.sources 应该是类似这样的:

Types: deb
URIs: https://archive.ubuntu.com/ubuntu
Suites: resolute resolute-updates resolute-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu
Suites: resolute-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

国内服务器可以替换 archive.ubuntu.comsecurity.ubuntu.commirrors.tuna.tsinghua.edu.cn

如果你有第三方源或 PPA,建议先备份并根据情况临时禁用,升级完成后再确认是否支持 Ubuntu 26.04:

mkdir -p /root/apt-sources-backup
cp -a /etc/apt/sources.list.d /root/apt-sources-backup/

第三方源通常需要单独检查,不能简单把 noble 替换成 resolute

然后我们再次执行更新系统:

apt update
apt upgrade -y
apt full-upgrade -y

更新过程中会提示一些软件是否需要自动重启,选 Yes 即可,以及一些软件的配置文件是否需要更新,按照自己的情况选择即可,默认回车即视为使用旧的配置文件,一般会出现在 OpenSSH 等软件的更新上。

更新后删除不必要的软件和依赖:

apt autoclean
apt autoremove -y

然后我们使用 reboot 命令重启系统,耐心等待后,查看最新的系统版本:

root@ubuntu ~ # lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 26.04 LTS
Release:	26.04
Codename:	resolute
root@ubuntu ~ # uname -a
Linux Nana 7.0.0-15-generic #15-Ubuntu SMP PREEMPT_DYNAMIC Wed Apr 22 16:06:43 UTC 2026 x86_64 GNU/Linux

这时我们就已经更新到了最新的 Ubuntu 26.04 Resolute 和内核了。

WSL 2 使用 Docker 桥接模式网络访问 HTTPS 超时的解决方法

2026-01-21 12:53:46

WSL 2 使用 Docker 桥接模式网络访问 HTTPS 超时的解决方法

本文介绍在 WSL 2 中使用 Docker 的桥接模式(bridge network)访问 HTTPS 时出现超时问题的解决方法。

最近一直在 Windows 下使用基于 WSL 2 的 Debian 进行开发。许多场景下需要使用 Docker 构建镜像,但过程中遇到一个奇怪的问题,在 Docker 容器内部访问 HTTP 站点时一切正常:

$ docker run --rm curlimages/curl time curl -s http://ip.gs
192.0.2.2
real    0m 0.02s
user    0m 0.00s
sys     0m 0.00s

一旦切换为 HTTPS,访问就会明显变慢,并且有一定概率出现超时:

$ docker run --rm curlimages/curl time curl -s https://ip.gs
192.0.2.2
real    0m 6.52s
user    0m 0.00s
sys     0m 0.00s

然而,如果将 Docker 切换到 Host 模式(--network=host),访问又恢复正常:

$ docker run --rm --network=host curlimages/curl time curl -s https://ip.gs
192.2.0.2
real    0m 0.28s
user    0m 0.00s
sys     0m 0.00s

在排查了 WSL 2 的 Debian 系统配置后,最终请教 ChatGPT 得到结论:

Path MTU 与防火墙流量检查(inspection)不兼容导致问题

解决方法很简单:将 WSL 2 虚拟网络的 MTU 下调为 1400 即可。

1、添加 Docker 配置

在 WSL 2 的系统里,使用 root 用户修改 /etc/docker/daemon.json 文件:

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "mtu": 1400,
    "dns": [
      "8.8.8.8",
      "1.1.1.1"
    ]
}

其中 "mtu": 1400, 是关键配置。

然后在 Windows 下把 WSL 2 关闭:

wsl --shutdown

2、修改 WSL 2 网卡配置

在 Windows 下使用管理员身份运行 Powershell,检查网卡名称:

PS C:\Users\showfom> Get-NetAdapter | Where-Object { $_.Name -like "*WSL*" }

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
vEthernet (WSL (Hyper-V … Hyper-V Virtual Ethernet Adapter #3          41 Up           12-34-56-78-AB-CD        10 Gbps

PS C:\Users\showfom> Get-NetAdapter | Format-Table -AutoSize

Name                               InterfaceDescription                      ifIndex Status       MacAddress        Lin
                                                                                                                    kSp
                                                                                                                    eed
----                               --------------------                      ------- ------       ----------        ---
vEthernet (Default Switch)         Hyper-V Virtual Ethernet Adapter               35 Up           12-34-56-78-AB-AB …ps
vEthernet (WSL (Hyper-V firewall)) Hyper-V Virtual Ethernet Adapter #3            41 Up           12-34-56-78-AB-CD …ps

输出可以看到完整名称为 vEthernet (WSL (Hyper-V firewall)),然后为其设置 MTU:

netsh interface ipv4 set subinterface "vEthernet (WSL (Hyper-V firewall))" mtu=1400 store=persistent

出现 Ok. 字样即代表设置成功。

3、测试 WSL 2 中的 Docker 网络

然后重新运行 WSL 2 虚拟机:

wsl -d debian

再次测试:

$ docker run --rm curlimages/curl time curl -s https://ip.gs
192.0.2.2
real    0m 0.28s
user    0m 0.00s
sys     0m 0.00s

问题已完美解决,可以继续愉快地 Vibe Coding 了! ★,°:.☆( ̄▽ ̄)/$:.°★

Debian / Ubuntu 下使用 nginx-acme 自动签发并配置 SSL 证书

2026-01-16 11:05:21

Debian / Ubuntu 下使用 nginx-acme 自动签发并配置 SSL 证书

本文将介绍在 Debian 或 Ubuntu 下使用 nginx-acme 自动签发并配置 SSL 证书的方法。

本文适合 Debian Stable 和 Ubuntu LTS,请使用 root 用户进行操作。

1、什么是 nginx-acme

nginx-acme 是 Nginx 官方开发的基于 ACME 协议自动签发 SSL 证书的模块,隔壁 Caddy 都出了几百年的功能, Nginx 也终于赶上了。

和 Nginx 使用 C 语言开发不同,这个模块是用 Rust 语言开发的,这里就不做评价。

这个模块支持 RFC8555RFC8737RFC8738draft-ietf-acme-profiles 等规范,目前我实际测试下来已经基本可以用于生产环境。

2、安装 N.WTF

这里我们使用烧饼博客打包的 N.WTF,这个项目已经集成了 nginx-acme 模块,可以做到开箱即用。

首先,安装一些必要的软件包:

sudo apt update
sudo apt upgrade -y
sudo apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后加入 N.WTF 的 GPG 公钥和 apt 源:

curl -sSL https://n.wtf/public.key | sudo bash -c 'gpg --dearmor > /usr/share/keyrings/n.wtf.gpg'
sudo bash -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/n.wtf.gpg] https://mirror-cdn.xtom.com/sb/nginx/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/n.wtf.list'

国内机器可以用清华 TUNA 的国内源:

curl -sSL https://mirrors.tuna.tsinghua.edu.cn/n.wtf/public.key | sudo bash -c 'gpg --dearmor > /usr/share/keyrings/n.wtf.gpg'
sudo bash -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/n.wtf.gpg] https://mirrors.tuna.tsinghua.edu.cn/n.wtf/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/n.wtf.list'

Debian 下也可以直接使用 extrepo:

sudo apt update
sudo apt install extrepo -y
sudo extrepo enable n.wtf

接着更新系统并安装 Nginx:

sudo apt update
sudo apt install nginx-extras -y

3、nginx-acme 准备工作

准备工作很简单,我们需要建立一个目录来存放 SSL 证书并给予正确的权限,这里我们以 /var/cache/nginx/letsencrypt 为演示:

sudo mkdir -p /var/cache/nginx
sudo mkdir -p /var/cache/nginx/letsencrypt
sudo chown 33:33 /var/cache/nginx -R

然后别忘了把域名解析到你的服务器哦!

4、配置 Nginx 站点

我们以 example.com 为例,假设你的邮箱是 [email protected],需要配置的域名是 example.comwww.example.com,并且希望访问 www.example.com 跳转到 example.com

直接修改 /etc/nginx/sites-enabled/default 文件:

resolver 8.8.8.8:53 ipv6=off valid=5s;

acme_issuer letsencrypt {
    uri         https://acme-v02.api.letsencrypt.org/directory;
    contact     [email protected];
    state_path  /var/cache/nginx/letsencrypt;
    accept_terms_of_service;
    ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
    ssl_verify off;
}

acme_shared_zone zone=ngx_acme_shared:1M;

server {
    # Listen on port 80 for all IPv4 and IPv6 addresses
    listen 80 default_server;
    listen [::]:80 default_server;
   
    # Match all domain names
    server_name _;

    location /.well-known/ {
        return 404;
    }

    location / {
        # Redirect all other HTTP requests to HTTPS using 301 permanent redirect
        return 301 https://$host$request_uri;
    }
}

server {
    # Standard TLS listening
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    # HTTP/2 protocol support
    http2 on;
   
    # HTTP/3 QUIC protocol support
    listen 443 quic reuseport;
    listen [::]:443 quic reuseport;
    add_header Alt-Svc 'h3=":443"; ma=86400' always;
    add_header X-Protocol $server_protocol always;

    server_name example.com;
    root /var/www/html;
    index index.html;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    acme_certificate letsencrypt;

    ssl_certificate       $acme_certificate;
    ssl_certificate_key   $acme_certificate_key;

    # do not parse the certificate on each request
    ssl_certificate_cache max=2;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    http2 on;

    listen 443 quic;
    listen [::]:443 quic;

    add_header Alt-Svc 'h3=":443"; ma=86400' always;
    add_header X-Protocol $server_protocol always;

    server_name www.example.com;
    return 301 https://example.com$request_uri;

    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    acme_certificate letsencrypt;

    ssl_certificate       $acme_certificate;
    ssl_certificate_key   $acme_certificate_key;

    # do not parse the certificate on each request
    ssl_certificate_cache max=2;
}

然后验证 Nginx 配置并重新加载:

sudo nginx -t
sudo nginx -s reload

此时,在默认的 Nginx 日志文件 /var/log/nginx/access.log 中可以看到 Let's Encrypt 验证服务器的请求记录:

23.178.112.210 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
34.212.137.78 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
18.222.179.58 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
16.171.19.61 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
13.228.72.222 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2600:3000:2710:200::81 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2600:1f14:804:fd02:f7fd:3c68:dec7:a062 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2600:1f16:269:da00:c9ce:508c:ea69:9c2 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2a05:d016:39f:3101:8b83:62b8:2603:d15d - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2406:da18:85:1401:1f69:967a:a988:cdc8 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

等待数秒后即可访问 https://example.com/ 了。

如果要给 IP 地址签发证书,则需要在 acme_issuer letsencrypt {} 段里添加一行 profile shortlived;,并且 server_name 必须写入完整的 IP 地址,不能直接用 server_name _ 哦。

不过目前 nginx-acme 最新版本 0.3.1 签发 IP 证书还是会失败,开发版已经修复,应该需要等下一个版本才能使用。

目前最新版本已经支持 IP 地址证书的签发,可以在 accept_terms_of_service; 下方加入一条 profile shortlived; 并且自行修改 server_name example.com; 为你的 IP 地址,比如 server_name 192.0.2.2 2001:db8::2; 即可。

读者们在使用过程中如果遇到问题,可以在 V2EX 交流讨论:

https://be.st/Mv7j

使用 acme.sh 配置 Let's Encrypt 签发的 IP 地址 SSL 证书

2025-12-18 00:13:37

使用 acme.sh 配置 Let's Encrypt 签发的 IP 地址 SSL 证书

本文将介绍使用 acme.sh 配置 Let's Encrypt 为 IP 地址签发 SSL 证书。

之前写过一篇使用 acme.sh 签发证书的教程,但在很长一段时间里,Let's Encrypt 只能给域名签发证书。

经过几个月的测试之后,现在终于可以对 IP 地址 下手了。

为什么要给 IP 签发证书

在很多场景下,我们并不一定需要域名,但确实需要 HTTPS。比如:

  1. DNS over HTTPS(DoH)服务无需依赖域名解析

直接通过 IP 提供 DoH 服务,避免「为了安全先做一次不安全的域名解析」这种哲学问题。

  1. Web 服务默认站点隐藏真实域名

默认站点只暴露 IP,不暴露真实域名,顺便还能挡掉一部分不太礼貌的爬虫。

  1. 临时服务或测试环境

临时起个服务,只想加个锁,不想再去 DNS 那边折腾。

  1. 避免证书透明日志(Certificate Transparency Log)暴露域名,保护隐私

有些域名不太想出现在公开日志里,低调一点总是好的。

准备工作

首先更新 acme.sh 到最新版本:

acme.sh --upgrade

因为 IP 证书目前只能通过 http-01tls-alpn-01 方式进行验证,所以你需要检查服务器的防火墙,设置允许 TCP 80 和 TCP / UDP 443 端口在公网可以访问。

配置 Nginx 80 端口的默认站点

这里我只介绍在 Nginx 下的配置吧,我们可以直接写入 80 端口的默认配置:

如果你在 Debian 或 Ubuntu 下安装 Nginx,可以直接覆盖 /etc/nginx/sites-available/default 文件:

server {
    # Listen on port 80 for all IPv4 and IPv6 addresses
    listen 80 default_server;
    listen [::]:80 default_server;
   
    # Match all domain names
    server_name _;

    # Merge Let's Encrypt and SSL verification path configuration
    location ~ ^/.well-known/(acme-challenge|pki-validation)/ {
        add_header Content-Type text/plain;
        root /var/www/letsencrypt;
    }

    # Redirect all other HTTP requests to HTTPS using 301 permanent redirect
    location / {
        return 301 https://$host$request_uri;
    }
}

然后创建两个目录并重新加载 Nginx:

mkdir -p /var/www/letsencrypt
mkdir -p /etc/nginx/ssl
nginx -t
nginx -s reload

使用 acme.sh 签发 IP 证书

假设你服务器的 IP 地址是 192.0.2.22001:db8::2

acme.sh --issue --server letsencrypt -d 192.0.2.2 -d 2001:db8::2 \
  -w /var/www/letsencrypt \
  --certificate-profile shortlived \
  --days 3

注意这里我们必须使用 shortlived 这个 Profile,因为 Let's Encrypt 的 IP 证书有效期只有 6.66666 天(160 小时),同时 acme.sh 需要更短的时间来进行检查更新证书,所以可以设置 --days 3 参数,让它 3 天检查并更新一次,你也可以设置 4 或 5,但是不要设置 6,否则可能证书过期了都没更新哦。

执行命令以后会看到类似的申请成功返回:

[Wed Dec 17 05:46:28 AM UTC 2025] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Wed Dec 17 05:46:28 AM UTC 2025] Multi domain='IP:192.0.2.2,IP:2001:db8::2'
[Wed Dec 17 05:46:30 AM UTC 2025] Getting webroot for domain='192.0.2.2'
[Wed Dec 17 05:46:30 AM UTC 2025] Getting webroot for domain='2001:db8::2'
[Wed Dec 17 05:46:30 AM UTC 2025] Verifying: 192.0.2.2
[Wed Dec 17 05:46:31 AM UTC 2025] Pending. The CA is processing your order, please wait. (1/30)
[Wed Dec 17 05:46:34 AM UTC 2025] Success
[Wed Dec 17 05:46:34 AM UTC 2025] Verifying: 2001:db8::2
[Wed Dec 17 05:46:35 AM UTC 2025] Pending. The CA is processing your order, please wait. (1/30)
[Wed Dec 17 05:46:38 AM UTC 2025] Success
[Wed Dec 17 05:46:38 AM UTC 2025] Verification finished, beginning signing.
[Wed Dec 17 05:46:38 AM UTC 2025] Let's finalize the order.
[Wed Dec 17 05:46:38 AM UTC 2025] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/blablablablablablablabla/blablablablablablablabla'
[Wed Dec 17 05:46:41 AM UTC 2025] Downloading cert.
[Wed Dec 17 05:46:41 AM UTC 2025] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/blablablablablablablabla'
[Wed Dec 17 05:46:42 AM UTC 2025] Cert success.
-----BEGIN CERTIFICATE-----
blablablablablablablablablablablablablablablablablablabla
-----END CERTIFICATE-----
[Wed Dec 17 05:46:42 AM UTC 2025] Your cert is in: /root/.acme.sh/192.0.2.2_ecc/192.0.2.2.cer
[Wed Dec 17 05:46:42 AM UTC 2025] Your cert key is in: /root/.acme.sh/192.0.2.2_ecc/192.0.2.2.key
[Wed Dec 17 05:46:42 AM UTC 2025] The intermediate CA cert is in: /root/.acme.sh/192.0.2.2_ecc/ca.cer
[Wed Dec 17 05:46:42 AM UTC 2025] And the full-chain cert is in: /root/.acme.sh/192.0.2.2_ecc/fullchain.cer

然后我们可以把申请好的证书放在 /etc/nginx/ssl 目录:

mkdir -p /etc/nginx/ssl

acme.sh --install-cert -d 192.0.2.2 \
  --key-file       /etc/nginx/ssl/ip.key  \
  --fullchain-file /etc/nginx/ssl/ip.crt \
  --ca-file        /etc/nginx/ssl/ip.ca.crt \
  --reloadcmd     "systemctl restart nginx"

配置 Nginx 443 端口的默认站点

安装完证书后我们即可配置 Nginx 默认的 443 端口了,你可以把这段配置一起放入 /etc/nginx/sites-available/default 文件:

# HTTPS Server block - Handle all HTTPS requests
server {
    # Standard TLS listening
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    # HTTP/2 protocol support
    http2 on;
   
    # HTTP/3 QUIC protocol support
    listen 443 quic reuseport;
    listen [::]:443 quic reuseport;
    add_header Alt-Svc 'h3=":443"; ma=86400' always;
    add_header X-Protocol $server_protocol always;
   
    # Match all domain names
    server_name _;
    return 403;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    ssl_certificate /etc/nginx/ssl/ip.crt;
    ssl_certificate_key /etc/nginx/ssl/ip.key;
}

然后检查并重新加载 Nginx:

nginx -t
nginx -s reload

一切就绪以后就可以直接访问 https://192.0.2.2/ 并返回 403 错误页面,我们可以看到证书里 Subject Alt Names 字段也显示 IP Address 了:

读者们在使用过程中如果遇到问题,可以在 V2EX 交流讨论或在下方评论:

https://be.st/pGx9

RDAP.SS - 基于 RDAP 协议的 Whois 查询网站

2025-11-04 01:01:40

RDAP.SS - 基于 RDAP 协议的 Whois 查询网站

RDAP.SS 是一个基于 RDAP 协议的 Whois 查询网站,本文介绍 RDAP 协议以及如何使用。

1、什么是 RDAP 协议?

RDAP,全称 Registration Data Access Protocol,由 IETF(互联网工程任务组)制定,主要用于查询以下注册信息:

  • 域名(Domain)
  • IP 地址(IPv4 / IPv6)
  • ASN(自治系统号)

它定义在 RFC 74807481748274837484 等系列标准中。

2、RDAP 和 Whois 协议的区别

以下是对两者主要区别的总结:

比较项目 WHOIS RDAP
传输协议 基于 TCP 文本协议 基于 HTTPS RESTful API
数据格式 纯文本、非结构化 JSON 格式、结构化
国际化支持 差,编码不统一 完全支持 UTF-8
安全性 无加密、无认证 支持 HTTPS、OAuth
分布式查询 依靠人工跳转 内置 bootstrap 机制,可自动重定向至正确注册局
标准化程度 各注册局格式不同 格式统一,易于机器读取与解析

在传统的 Whois 协议中,用户需要给 Whois 服务器的 43 端口发送查询,然后 Whois 服务器返回纯文本的结果。

这导致了传统的 Whois 协议有几个无法修补的劣势:

  1. 非结构化的文本输出,没有标准化的接口

传统的 Whois 没有统一的查询和返回 API,只有简单的文本命令,这导致每家注册局返回的信息格式不一致,例如有的字段写作 Registrant Email,有的写作 Contact Email。这给开发者带来了巨大的解析工作量,需要为不同注册局甚至注册商编写对应的匹配规则。

  1. 非加密传输

TCP 43 端口使用明文传输,任何中间节点(包括运营商)都能看到查询内容。🤷‍♂️ 这在 2025 年已经难以被接受。

  1. 缺乏访问控制权限

Whois 服务器只能识别查询的 IP 地址,无法针对单个用户分配权限或进行身份区分,安全设置也只能基于 IP 层面。

  1. 管理混乱

Whois 客户端需要为每个 TLD 手动配置对应的 Whois 服务器,缺乏类似 RDAP 的自动 bootstrap 机制。

3、RDAP 协议的优势

而 RDAP 协议完美的弥补了这些劣势:

  1. 标准化的 JSON 输出

RDAP 返回的数据是结构化的 JSON,字段统一定义,例如:

{
  "objectClassName": "domain",
  "ldhName": "example.com",
  "status": ["active"],
  "entities": [...]
}

这让程序能直接解析字段,无需依赖正则或人工格式识别。

  1. 统一的 API

RDAP 基于 HTTP/HTTPS 的 RESTful API,支持 GET 请求、分页、过滤等现代查询方式。

例如:

GET https://rdap.verisign.com/com/v1/domain/example.com

即可从注册局调用 example.com 的信息

  1. Bootstrap 自动重定向

RDAP 客户端无需知道具体注册商,它会根据 IANA 的 bootstrap 数据自动跳转到正确的注册局或 RIR

IANA 的 Bootstrap 数据是公开的,可在以下地址访问:

https://data.iana.org/rdap/

按照 RDAP.org 的统计,目前大约有 77% 的注册局已经接入了 RDAP 协议,除了少部分 TLD 需要手工添加 RDAP 服务器,大部分已经都接入了 IANA 的 bootstrap 数据。

  1. 安全和隐私

RDAP 强制使用 HTTPS,保障查询与返回内容的完整性与保密性。防止中间人攻击与数据监听。

如有需要,注册局还可以通过 OAuth 2.0 或 Token 认证实现访问控制,根据用户身份(如公众、注册商或执法机构)返回不同级别的信息。这非常契合 GDPR 等隐私法规的要求。

  1. 可扩展性

RDAP 支持使用 extensions(扩展字段),注册局可以在标准字段外添加自定义信息,而不会破坏兼容性。

例如:

"rdapConformance": ["rdap_level_0", "icann_rdap_technical_implementation_guide_0"]

4、RDAP.SS 网站

基于 RDAP 的优势,我使用 Claude Code 开发了一个基于 RDAP 协议的 Whois 查询网站: RDAP.SS

技术栈:

  • Next.js
  • Tailwind CSS
  • Redis 缓存

目前支持如下格式的 Whois 查询:

仅当对应的 TLD 注册局支持 RDAP 协议时,域名查询才可用;未支持的注册局会降级为传统 Whois 协议返回结果。

如果在使用过程中遇到问题,请随时在 GitHub 提交 issue

Debian 使用 extrepo 配置第三方软件源

2025-10-21 13:45:49

Debian 使用 extrepo 配置第三方软件源

本文将指导如何在 Debian 下使用 extrepo 配置第三方软件源。

什么是 extrepo?

extrepo 用于管理 Debian 中的外部软件源。

在没有 extrepo 之前,想要使用未被 Debian 官方打包的软件,用户通常需要手动编写 APT 配置文件、以 root 身份运行未经签名的脚本,或安装一个包含所有系统配置的未签名 .deb 包。

遗憾的是,这些方法都不是很安全。

打个比方,我们要添加 Docker 的软件源,有三种方式。

第一种是传统的 One-Line Style

curl -sSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor > /usr/share/keyrings/docker-ce.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" | sudo bash -c 'cat > /etc/apt/sources.list.d/docker-ce.list'

sudo apt update
sudo install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

第二种是新的 DEB822 格式:

curl -sSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor > /usr/share/keyrings/docker-ce.gpg

sudo bash -c 'cat > /etc/apt/sources.list.d/docker-ce.sources << EOF
Components: stable
Architectures: $(dpkg --print-architecture)
Suites: $(lsb_release -cs)
Types: deb
Uris: https://download.docker.com/linux/debian
Signed-By: /usr/share/keyrings/docker-ce.gpg
EOF'

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

第三种方法则更为简单粗暴,直接运行脚本:

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

在以上这些方法中(包括第三种脚本方式),我们都需要手动下载并导入 GPG 密钥,创建必要的 APT 配置文件,更新软件列表,然后再安装软件。而我们推荐使用 extrepo 的话,只需要简单的三个命令即可完成整个过程。

安装并使用 extrepo

Debian Stable 下直接用如下命令安装 extrepo 即可:

sudo apt update
sudo apt install extrepo -y

接着我们就可以启用比如 Docker CE 的仓库源:

sudo extrepo enable docker-ce

然后更新系统并安装 Docker:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

此时我们会发现在 /etc/apt/sources.list.d 目录中多了一个 extrepo_docker-ce.sources 文件:

# cat /etc/apt/sources.list.d/extrepo_docker-ce.sources 
Suites: trixie
Types: deb
Uris: https://download.docker.com/linux/debian
Components: stable
Architectures: amd64 arm64 armhf s390x ppc64el
Signed-By: /var/lib/extrepo/keys/docker-ce.asc

换句话说,extrepo 帮我们完成了以下工作:

  1. 抓取经过验证的 GPG Key
  2. 使用 DEB822 格式写入 APT 配置

对比之前的几种方法,你可能还需要满大街找配置命令,找脚本命令,现在只要敲几行命令就可以搞定,何乐而不为呢?

External Repository Metadata

看到这里读者可能有疑问,extrepo 的数据又是谁维护的呢?它是由 Debian External Repositories Team 维护,成员主要为志愿者(包括本文作者),数据本身也有个仓库叫做 extrepo-data

我个人维护了一些仓库,包括 RedisMariaDBN.WTF 等,你可以从这里看到我的 commits

任何人都可以对这个 Git 仓库做出贡献,而且 YAML 语法也十分容易上手,你可以参考默认的模板文件

需要查看完整的第三方软件源列表的话,你可以在这里浏览所有的第三方仓库的 .yaml 文件。

了解了 extrepo 的机制和优势后,我们再来总结一下。

结论

总之,使用 extrepo 是一种既安全又方便的添加第三方软件源的方法。

它的主要优点在于:

  1. 可以让你快速启用经过测试和验证的软件源,而无需手动搜索和复制第三方软件源的配置信息。
  2. 当第三方仓库的 GPG 密钥过期或 URI 发生变化(这种情况相当常见)时,也不再需要手动更新。

比如,使用 extrepo 时,只需运行 extrepo enable docker-ceextrepo update docker-ce,它就会自动刷新 Docker CE 仓库的 GPG 密钥和 URI。

不过,extrepo 也有一定的缺点:

  1. 目前只兼容 Debian 系统,Ubuntu 因为没有人维护 extrepo-data 所以基本没有可以用的第三方软件源。
  2. 默认的 extrepo-data 托管在 Debian 官方的 GitLab Pages,这对一些网络不通畅的服务器来说获取仓库信息就有点困难,而自建 extrepo-data 的过程相对繁琐,并不算方便。

That will save a lot of time

English Version