家宽无443端口ipv4\ipv6双栈访问

前言 一般家宽不给开443端口(ipv4和ipv6检测到就封),所以我用8443替代https的默认443端口来反代。 但是方案要考虑同时支持ipv4和ipv6。 本文主要利用 OpenResty将lxc容器 8443端口的ipv6流量 转发给443端口 来实现ipv6同端口访问。 环境介绍 系统:...
家宽无443端口ipv4\ipv6双栈访问
家宽无443端口ipv4\ipv6双栈访问

前言

一般家宽不给开443端口(ipv4和ipv6检测到就封),所以我用8443替代https的默认443端口来反代。
但是方案要考虑同时支持ipv4和ipv6。
本文主要利用OpenResty将lxc容器 8443端口的ipv6流量 转发给443端口来实现ipv6同端口访问。

环境介绍

系统:pve
路由:pve-ikuai虚拟机
网关:pve-lxc容器安装的1panel
域名证书:所有要发布到公网的web服务都是用的同一个通配符证书(比如:*.a.com),由1panel申请、续期。
dns管理:cloudflare

前置条件,已经配置了ikuai的ipv6,内网设备能拿到公网ipv6地址(这一步网上有大把教程)

1. 双栈域名设置

  1. 使用ikuai的ddns(动态域名),将wan口的公网ip绑定到域名,比如a.com(A记录)
  2. 使用ikuai的ddns(动态域名),将lxc的容器ipv6绑定到域名(通过终端DUID配置),比如a.com(AAAA记录)
    image

注意,ipv4和ipv6用的同一个域名。此时nslookup a.com能同时获取到ipv4和ipv6

2. ipv4设置

  1. ikuai做端口转发,将8443转发到lxc容器的443端口(同时转发8444作为备用)。这个配置只对ipv4有效
    image

实现ipv4外网访问,只需此步骤即可。

3. ipv6设置

  1. lxc容器执行1pctl listen-ip ipv6(1panel工具指令),让1panel同时监听ipv4和ipv6

  2. 1panel-容器-设置页面:打开ipv6开关,勾选ip6tables、experimental;子网填fd00:1234::/64(这里有多种填法,随便填个)。lxc执行docker network inspect bridge能看到ipv6段就成功了

    image

  3. 1panel-网站-你的网站(可能有多个,如test1.a.com)-配置-其他:勾选“监听ipv6”,保存

  4. 【重点】将lxc容器 8443端口的ipv6流量 转发给443端口
    利用 1Panel 预置的 OpenResty(网站服务组件,是docker 容器)作为本地透明代理,将 8443端口的IPv6加密流量解密后转发给443端口(后续就和普通网页分发流程一样了):

  • 找到OpenResty容器内的证书位置,因为都是用的同一个通配符证书,所以随便记录一个如/www/sites/test1.a.com/ssl/fullchain.pem/www/sites/test1.a.com/ssl/privkey.pem

  • OpenResty容器内添加转发配置文件,/usr/local/openresty/nginx/conf/nginx.conf/v6_bridge.conf:

    server {
        listen [::]:8443 ssl;
        server_name _; # 匹配所有指向此容器的域名
    
        # 引用面板自用证书
        ssl_certificate      /www/sites/test1.a.com/ssl/fullchain.pem;
        ssl_certificate_key  /www/sites/test1.a.com/ssl/privkey.pem;
    
        location / {
            proxy_pass https://127.0.0.1:443;
            
            # 透传原始 Host(含端口)和真实 IP
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            
            # 兼容 WebSocket(保证面板 SSH 终端可用)
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
    
  • OpenResty容器内执行openresty -t && openresty -s reload

拓扑图

                     【 互联网 (Internet)8443端口进 】
                          /          \
                  (IPv4) /            \ (IPv6)
                        /              \
        +-----------------------+      +-----------------------+

        |   iKuai / PVE 路由层   |      |   IPv6 直通 (Pass-thru) |
        |  (NAT 映射: 8443->443) |      |   (目标: LXC 容器 IPv6)  |
        +-----------+-----------+      +-----------+-----------+

                    |                              |
                    | (IPv4:443)                   | (IPv6:8443)
                    |                              |
    ________________|______________________________|_________________
   |                v                              v                 |
   |      +--------------------+        +-----------------------+    |
   |      |   1Panel 面板程序   | <----- |   OpenResty (Nginx)   |    |
   |      | (监听 0.0.0.0:443)  |  proxy  |    (监听 [::]:8443)    |    |
   |      +---------+----------+         +-----------+-----------+    |
   |                |                                                |
   |                |                                                |
   |       [ 最终处理与响应 ]                                         |
   |                                                                 |
   |                  【 LXC 容器内部环境 】                         |
   |_________________________________________________________________|


4. 测试

  1. 把ikuai转发的8443端口关闭(开启8444作为后备,防止在外失联)
  2. 使用蜂窝网络手机访问test1.a.com:8443,能打开页面即成功(通过ipv6直接指向了lxc的8443端口)
  3. 有ipv6的电脑测试:curl -6 -v https://test1.a.com:8443

1 个帖子 - 1 位参与者

阅读完整话题

来源: linux.do查看原文