将端口 443 (IPv4) 上的所有流量路由到端口 80 (IPv6) 上的外部 IP 地址

将端口 443 (IPv4) 上的所有流量路由到端口 80 (IPv6) 上的外部 IP 地址

我想使用 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 个任务:

  1. 将所有请求转发到您的服务器
  2. 终止 SSL(Artur 描述)
  3. 将 ipv4 转换为 ipv6

要求

你的 VPS 必须是双层的。

使用的产品:(需要其中一个)

  • Nginx
  • 乌贼
  • 阿帕奇

向 Google 博士询问示例配置。

码头工人:

我会选择 Docker,但这不是必需的。docker 有一个小问题,ipv6 支持是官方实验性的,默认情况下不启用。您需要启用 IPv6。

DNS / 证书 由 Artur 描述。

相关内容