V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
jsjcjsjc
V2EX  ›  Linux

有方案可以基于域名分流,转发所有流量吗(不限于 TCP,UDP,TLS,PPTP,ICMP 等)?

  •  
  •   jsjcjsjc · 2022-02-16 09:02:24 +08:00 · 4098 次点击
    这是一个创建于 1007 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如这样的:

    域名 B 指向 VPS-A,VPS-A 在 443 端口接收来自域名 B 的流量全部转发到 VPS-B 的 443 端口,(另外一个域名 B2 指向 VPS-B)
    域名 C 指向 VPS-A,VPS-A 在 443 端口接收来自域名 C 的流量全部转发到 VPS-C 的 443 端口,(另外一个域名 C2 指向 VPS-C)

    想要的效果是
    访问域名 B 和域名 B2,效果是完全一样的
    访问域名 C 和域名 C2,效果是完全一样的

    这里的 443 端口只是举个例子,其他端口也一样
    总的来说就是 VPS-A 只是作为跳板,根据不同的域名转发所有的流量,不限于 TCP,UDP,TLS,PPTP,ICMP 等

    有方案可以实现吗?
    感谢
    20 条回复    2022-02-17 21:45:19 +08:00
    Livid
        1
    Livid  
    MOD
       2022-02-16 09:06:00 +08:00   ❤️ 1
    之前实现过类似的。提供一个思路:

    iptables + ipset + dnsmasq 可以实现。

    不同的 ipset 使用不同的 iptables 转发规则。

    dnsmasq 里把不同的域名解析到指定的 ipset 。
    des
        2
    des  
       2022-02-16 09:06:54 +08:00 via iPhone   ❤️ 1
    不可以,只有 tls 、http 这种才有戏
    defunct9
        3
    defunct9  
       2022-02-16 09:07:06 +08:00   ❤️ 1
    icmp 转不了。我知道 443 的 tcp 可以转发这些:HTTP, TLS/SSL (including SNI and ALPN), SSH, OpenVPN, tinc, XMPP, SOCKS5
    des
        4
    des  
       2022-02-16 09:09:38 +08:00 via iPhone   ❤️ 1
    @Livid 自己控制路由器可以返回假 ip 然后映射,vps 的话明显不行
    opengps
        5
    opengps  
       2022-02-16 09:10:45 +08:00   ❤️ 1
    如果从物理架构层面理解,这就是 dns 负载均衡,用于让用户访问就近的中心节点,这种多中心架构要求有高速的数据同步服务

    如果从单一的中心实现这个,我只能用 tcp 来说:这听起来像是多个域名,最终转发给同一个服务,如果系统没有多域名组合使用的话,nginx 可以轻松实现(比如我自己就是这样用谷歌搜索的,自己的域名,转发到了实际的谷歌搜索网页)
    bearice
        6
    bearice  
       2022-02-16 09:21:38 +08:00   ❤️ 1
    如果你的 VPS-A 有多个公网 IP 的话可以,否则不行
    fisherwei
        7
    fisherwei  
       2022-02-16 09:34:11 +08:00   ❤️ 1
    这个需求又一些矛盾。

    你想做的是 L3 转发,但是判断条件在 L4567 ,只有部分协议(比如 L7 层的 HTTP/HTTPS )会带上解析前的域名信息,另一些协议(比如同为 L3 层的 ICMP )根本不告诉你他是通过域名 B 还是 C 解析出来 VPS-A 的,又如何转发呢?
    jsjcjsjc
        8
    jsjcjsjc  
    OP
       2022-02-16 09:36:56 +08:00
    看来不能实现....那如果只转发 TCP 和 UDP 可以吗?
    mywaiting
        9
    mywaiting  
       2022-02-16 09:46:04 +08:00   ❤️ 1
    7 层协议可以方便各种负载均衡各种转,ICMP 是 IP 层( 3 层)的协议啊,这货也能转?插眼等答案
    leavic
        10
    leavic  
       2022-02-16 09:47:17 +08:00   ❤️ 1
    我看了半天,这不就是最基本的 web host 配置?
    一个 IP 绑定多个域名,无非就是这些域名最终的目的不是本机,而是转发到远程机器上。

    没有具体试过转发到远程的,可以试试在 VPS-A 的 nginx 上做如下配置,B2,C2 就普通的域名绑定不用说了吧:
    '''
    server {
    listen 443;
    server_name VPS-B;


    location / {
    proxy_pass http://VPS-B:443/;
    proxy_redirect off;

    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;
    }

    }

    server {
    listen 443;
    server_name VPS-C;


    location / {
    proxy_pass http://VPS-C:443/;
    proxy_redirect off;

    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;
    }

    }
    '''
    leavic
        11
    leavic  
       2022-02-16 09:50:54 +08:00
    注意这里的 VPS-B 和 VPS-C 是域名,不基于域名直接给 IP 是不可能分流的,然后流量仅限于 http/https ,但是你把其他流量伪装成 http ,只要 nginx 能识别应该也是可以的。
    leavic
        12
    leavic  
       2022-02-16 09:52:06 +08:00
    我又想了下,不考虑流量类型的情况下,这个方案对 http/https 肯定是可行的,就算 nginx 只能转发到本机(主要是我没试过远程),你本机端口再用别的做一次转发到远程就行了。
    fisherwei
        13
    fisherwei  
       2022-02-16 10:21:30 +08:00   ❤️ 1
    @jsjcjsjc
    考虑一下五元组的内容:源地址,源端口,协议,目的地址,目的端口。
    L4 依靠它们区分不同的连接,这里面是没有域名什么事的。

    所以,你的需求的前提是,要转发的流量来自一个包含了域名信息的高层协议,比如 http/https 才可以实现。
    广义的 tcp/udp 是不包含域名信息的。
    blackboar
        14
    blackboar  
       2022-02-16 11:08:09 +08:00   ❤️ 1
    不行,只有 http 类才会在请求里带上主机头送到服务端,其它 3 、4 层不会带的,域名只是在客户端解析变成了 IP 而已,要么你用多 IP 来区分,要么你实现自己的应用层协议来带上域名再自己写一个代理 /转发服务。
    aecra
        15
    aecra  
       2022-02-16 11:47:28 +08:00 via Android   ❤️ 2
    ghjexxka
        16
    ghjexxka  
       2022-02-16 18:54:35 +08:00 via Android
    听上去就是给 VPS-A 配反向代理
    jsjcjsjc
        17
    jsjcjsjc  
    OP
       2022-02-16 20:02:38 +08:00
    @fisherwei 那就是只能转发 http/https 这样的 TCP 流量? UDP 都不行?
    xxb
        18
    xxb  
       2022-02-16 20:37:39 +08:00   ❤️ 1
    如果可以实现,就能用自定义域名访问任意网站了,对吧
    jim9606
        19
    jim9606  
       2022-02-17 00:15:32 +08:00
    因为不是所有应用层 /传输层协议都在 packet 中包含域名信息(例如 TLS 的 SNI extension 和 HTTP 的 Host 头)。

    所以如果要完美的话,需要劫持 DNS (遇上 DoT 、DoH 、enforce DNSSEC 、私家 HTTPDNS 还是没辙),将所有域名查询与一个保留地址池(例如 E 类 IPv4 关联)并作为 DNS 响应返回,然后根据关联 IP 进行路由。

    如果你把支持的协议做一下限定,会简单不少。
    jsjcjsjc
        20
    jsjcjsjc  
    OP
       2022-02-17 21:45:19 +08:00
    @xxb 貌似不能实现~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5440 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:20 · PVG 09:20 · LAX 17:20 · JFK 20:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.