1
Livid MOD 之前实现过类似的。提供一个思路:
iptables + ipset + dnsmasq 可以实现。 不同的 ipset 使用不同的 iptables 转发规则。 dnsmasq 里把不同的域名解析到指定的 ipset 。 |
2
des 2022-02-16 09:06:54 +08:00 via iPhone 1
不可以,只有 tls 、http 这种才有戏
|
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
|
5
opengps 2022-02-16 09:10:45 +08:00 1
如果从物理架构层面理解,这就是 dns 负载均衡,用于让用户访问就近的中心节点,这种多中心架构要求有高速的数据同步服务
如果从单一的中心实现这个,我只能用 tcp 来说:这听起来像是多个域名,最终转发给同一个服务,如果系统没有多域名组合使用的话,nginx 可以轻松实现(比如我自己就是这样用谷歌搜索的,自己的域名,转发到了实际的谷歌搜索网页) |
6
bearice 2022-02-16 09:21:38 +08:00 1
如果你的 VPS-A 有多个公网 IP 的话可以,否则不行
|
7
fisherwei 2022-02-16 09:34:11 +08:00 1
这个需求又一些矛盾。
你想做的是 L3 转发,但是判断条件在 L4567 ,只有部分协议(比如 L7 层的 HTTP/HTTPS )会带上解析前的域名信息,另一些协议(比如同为 L3 层的 ICMP )根本不告诉你他是通过域名 B 还是 C 解析出来 VPS-A 的,又如何转发呢? |
8
jsjcjsjc OP 看来不能实现....那如果只转发 TCP 和 UDP 可以吗?
|
9
mywaiting 2022-02-16 09:46:04 +08:00 1
7 层协议可以方便各种负载均衡各种转,ICMP 是 IP 层( 3 层)的协议啊,这货也能转?插眼等答案
|
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; } } ''' |
11
leavic 2022-02-16 09:50:54 +08:00
注意这里的 VPS-B 和 VPS-C 是域名,不基于域名直接给 IP 是不可能分流的,然后流量仅限于 http/https ,但是你把其他流量伪装成 http ,只要 nginx 能识别应该也是可以的。
|
12
leavic 2022-02-16 09:52:06 +08:00
我又想了下,不考虑流量类型的情况下,这个方案对 http/https 肯定是可行的,就算 nginx 只能转发到本机(主要是我没试过远程),你本机端口再用别的做一次转发到远程就行了。
|
13
fisherwei 2022-02-16 10:21:30 +08:00 1
@jsjcjsjc
考虑一下五元组的内容:源地址,源端口,协议,目的地址,目的端口。 L4 依靠它们区分不同的连接,这里面是没有域名什么事的。 所以,你的需求的前提是,要转发的流量来自一个包含了域名信息的高层协议,比如 http/https 才可以实现。 广义的 tcp/udp 是不包含域名信息的。 |
14
blackboar 2022-02-16 11:08:09 +08:00 1
不行,只有 http 类才会在请求里带上主机头送到服务端,其它 3 、4 层不会带的,域名只是在客户端解析变成了 IP 而已,要么你用多 IP 来区分,要么你实现自己的应用层协议来带上域名再自己写一个代理 /转发服务。
|
15
aecra 2022-02-16 11:47:28 +08:00 via Android 2
|
16
ghjexxka 2022-02-16 18:54:35 +08:00 via Android
听上去就是给 VPS-A 配反向代理
|
18
xxb 2022-02-16 20:37:39 +08:00 1
如果可以实现,就能用自定义域名访问任意网站了,对吧
|
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 进行路由。 如果你把支持的协议做一下限定,会简单不少。 |