我想使用 Yggdrasil 网络在家中托管一个网站。Yggdrasil 为我提供了一个静态 IPv6 地址(即使在 DNS 后面)。但是“普通”用户无法路由到该 IP 地址,除非他们自己使用 Yggrasil,但这要求太高了。
因此,我的解决方案是租用一个具有静态 IPv4 地址的小型 VPS,并在其上运行 Yggdrasil。因此,现在我需要将 VPS 上 https 端口 443 上的所有 IPv4 流量路由到我家用机器的静态 Yggdrasil IPv6 地址上的端口 80,由于它也运行着 Yggdrasil 网络,因此 VPS 可以看到该地址。
哪种 Linux 工具可以让我最有效且轻松地做到这一点?
基本上:将一台机器的 IPv4:443 上的所有流量路由到另一台机器的 IPv6:80。
在 Artur Meinild 详细回答后进行编辑:
虽然我知道 GUI 很棒,但我更喜欢轻量级、高性能、基于命令行且尽可能接近 Linux 哲学的东西。
答案1
我在用着Nginx 代理管理器管理反向代理。这为 Nginx 反向代理配置提供了一个不错的 UI。还有其他反向代理解决方案可以做同样的事情,例如HA代理和特拉菲克。
实现这一目标的先决条件是:
- 您已使用公共 DNS 服务为您的网站设置了 DNS A 记录 (IPv4) (
yoursite.yourdomain.tld
) - 你有设置 Docker在你的 VPS 上(包括 Docker Compose)
安装和配置:
安装 Nginx 代理管理器,我已经配置好了详细内容在这里。
基本上,您要创建一个docker-compose.yml
这样的文件 - 在您希望持久数据所在的目录中(我的是/mnt/docker-data/nginx-proxy-manager
):
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./data/mysql:/var/lib/mysql
您可以在其中进行以下调整:
'81:81' # Admin Web Port
'9999:81
:如果您希望将管理界面的端口 9999 而不是端口 81 暴露给外部,请更改为。- 您可以根据自己的喜好更改 MYSQL 用户和密码。
完成后.yml
,运行:(Docker Compose V2)
docker compose up -d
或者对于旧版本:(Docker Compose V1)
docker-compose up -d
现在转到ip.of.your.vps:9999
(如果您将管理端口更改为此),并使用默认用户登录:
Email: [email protected]
Password: changeme
您必须更改此信息。
现在,创建一个新的代理主机,您将看到如下窗口:
输入以下内容:
- 在“域名”中输入使用 DNS 设置的 FQDN(在我的示例中
yoursite.yourdomain.tld
) - 在“方案”中输入
HTTP
(因为您转发到 HTTP/端口 80) - 在“转发主机名”中输入你的家用机器的 IPv6 地址
- 在“转发端口”中输入
80
点击“保存”。
此外,您可以为网站设置 SSL 证书(使用内置的 Let's Encrypt 功能),这样您就可以在 VPS 上的端口 443 上使用 HTTPS。
该解决方案的好处:
- 漂亮的图形用户界面
- 所有配置(转发、证书等)均在单一界面进行管理
- 灵活,您也可以将其用于其他网站(反向代理在子域上进行过滤)
该解决方案的挑战:
- 需要对 DNS、Docker 和容器本身进行额外设置
- 如果你只需要这个网站,那就太过分了
答案2
这是我自己的答案。接收 vps 上端口上的任何 http 或 https 流量,并将其全部转发到外部 IPv6 端口 80。运行良好。
global
maxconn 4096
spread-checks 3
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend ipv4-in
bind *:80
bind *:443
default_backend ipv4-to-ipv6
backend ipv4-to-ipv6
server ipv6 [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]:80
尚未弄清楚证书的含义。
答案3
读完你的问题后,我问自己为什么不将你的网站托管在 VPS 上并摆脱这种代理方案。如果你使用代理走这条路,你需要一个服务器(或转发)代理。此代理有 3 个任务:
- 将所有请求转发到您的服务器
- 终止 SSL(Artur 描述)
- 将 ipv4 转换为 ipv6
要求:
你的 VPS 必须是双层的。
使用的产品:(需要其中一个)
- Nginx
- 乌贼
- 阿帕奇
向 Google 博士询问示例配置。
码头工人:
我会选择 Docker,但这不是必需的。docker 有一个小问题,ipv6 支持是官方实验性的,默认情况下不启用。您需要启用 IPv6。
DNS / 证书 由 Artur 描述。