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

2022-02-16 09:02:24 +08:00
 jsjcjsjc
比如这样的:

域名 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 等

有方案可以实现吗?
感谢
3880 次点击
所在节点    Linux
20 条回复
Livid
2022-02-16 09:06:00 +08:00
之前实现过类似的。提供一个思路:

iptables + ipset + dnsmasq 可以实现。

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

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

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

你想做的是 L3 转发,但是判断条件在 L4567 ,只有部分协议(比如 L7 层的 HTTP/HTTPS )会带上解析前的域名信息,另一些协议(比如同为 L3 层的 ICMP )根本不告诉你他是通过域名 B 还是 C 解析出来 VPS-A 的,又如何转发呢?
jsjcjsjc
2022-02-16 09:36:56 +08:00
看来不能实现....那如果只转发 TCP 和 UDP 可以吗?
mywaiting
2022-02-16 09:46:04 +08:00
7 层协议可以方便各种负载均衡各种转,ICMP 是 IP 层( 3 层)的协议啊,这货也能转?插眼等答案
leavic
2022-02-16 09:47:17 +08:00
我看了半天,这不就是最基本的 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
2022-02-16 09:50:54 +08:00
注意这里的 VPS-B 和 VPS-C 是域名,不基于域名直接给 IP 是不可能分流的,然后流量仅限于 http/https ,但是你把其他流量伪装成 http ,只要 nginx 能识别应该也是可以的。
leavic
2022-02-16 09:52:06 +08:00
我又想了下,不考虑流量类型的情况下,这个方案对 http/https 肯定是可行的,就算 nginx 只能转发到本机(主要是我没试过远程),你本机端口再用别的做一次转发到远程就行了。
fisherwei
2022-02-16 10:21:30 +08:00
@jsjcjsjc
考虑一下五元组的内容:源地址,源端口,协议,目的地址,目的端口。
L4 依靠它们区分不同的连接,这里面是没有域名什么事的。

所以,你的需求的前提是,要转发的流量来自一个包含了域名信息的高层协议,比如 http/https 才可以实现。
广义的 tcp/udp 是不包含域名信息的。
blackboar
2022-02-16 11:08:09 +08:00
不行,只有 http 类才会在请求里带上主机头送到服务端,其它 3 、4 层不会带的,域名只是在客户端解析变成了 IP 而已,要么你用多 IP 来区分,要么你实现自己的应用层协议来带上域名再自己写一个代理 /转发服务。
aecra
2022-02-16 11:47:28 +08:00
ghjexxka
2022-02-16 18:54:35 +08:00
听上去就是给 VPS-A 配反向代理
jsjcjsjc
2022-02-16 20:02:38 +08:00
@fisherwei 那就是只能转发 http/https 这样的 TCP 流量? UDP 都不行?
xxb
2022-02-16 20:37:39 +08:00
如果可以实现,就能用自定义域名访问任意网站了,对吧
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
2022-02-17 21:45:19 +08:00
@xxb 貌似不能实现~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/834130

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX