在设备 A 上运行代理软件,这个软件具体是什么不太重要,B 通过某种方式将流量发送给 A ,可以是 socks5 ,tproxy ,tun 或者其他什么方式。A 的代理程序看了一下,决定直连出站,这个时候 B 访问的目标 C 看到的源 IP 是 A 的而不是 B 的。
具体的表现就是访问 test-ipv6.com ,显示 A 的 IP 。这算是一种 NAT 吗,有没有什么方法在直连的时候不改变(或者改回去)源地址?
我现在的做法是把想要直连的 IP 段写进防火墙规则,但是这就丢失了代理软件可以快速切换规则的便利性。
1
yyzh 309 天前 via Android
没有.直连吧
|
2
ysc3839 309 天前 via Android
理论可行,但实际很可能不行。方法是 A 发包时源地址设置成 B 的地址,这样目标服务器发回包时会直接发给 B
|
3
ysc3839 309 天前 via Android
@ysc3839 还没写完,不小心点到回复了。
但是实际上运营商很可能限制 A 发出包的源地址必须是 A 的地址,上述操作发出去的包会被直接丢弃。 |
4
SenLief 309 天前
你这个分流应该在 A 上做,而不是 B 上。
|
5
leonshaw 309 天前 via Android
|
6
pagxir 309 天前 via Android
你需要在 dns 那边就做分流而不是在代理应用那边。
|
7
pagxir 309 天前 via Android
dns 分流可以在网关实现,不影响便利性。
|
8
kokutou 309 天前 via Android
各种客户端软件都是 a 上面分流啊
a 上面可以拿到进程,域名, b 上面首先就没进程,而且可能域名都没得就只有 ip |
9
mantouboji 309 天前
这个涉及到你 IPv6 部分的路由分流是怎么做的。
就我自己而言,无论 v4 还是 v6 全是靠 OSPF 分流,境外的 IPv4 和 v6 流量都走 wireguard 隧道出去,所以访问境外 v6 网站看到的源地址就是我境外 VPS 的 v6 地址,访问境内 v6 网站看到的是我 PPPoE 得到的那个地址。 这没什么啊。实际上因为境内 IPv6 路由的不完备,而且 v6 路由上也要经过墙,这样折腾实际上比纯走国内 v6 路由要快一点点。 |
10
icaolei 309 天前
你只要把流量给 A 的代理程序了,就是 A 在访问 C 了。你要做的是 B 来决定哪些直连,哪些发给 A 去代理。
|
11
luoshengdu 309 天前
先试试用 DNS 分流,这个部署成本低,并且不改变网络架构。
https://github.com/pmkol/easymosdns 功能说明: *支持 EDNS 解析,根据域名与中国大陆 IP 列表智能分流,查询结果无污染* *强化 Hosts 功能,域名支持多个 IP ,支持 IPv6* *支持指定 ECS ,强制域名附带指定的 ECS 解析* |
12
journalist OP 怎么都在说 DNS ,我这里只考虑直接访问 IP 的情况
|
13
journalist OP @mantouboji 是这样的,你说的没错。
|
14
journalist OP 假设设置运行代理的机器为网关,代理程序判断是否直连显然是在应用层,而实际上直连的流量没必要进入应用层,在网络层直接转发给下一跳就可以了。如果代理程序能在流量进入 INPUT 之前就进行判断,是不是就可以达到源 IP 不变的目的?
|
15
tavimori 309 天前
@journalist 要使设备 A 使用 B 的地址作为源地址向服务器建立连接,那么目标 C 返回的包的目的地址就是 B 的地址。
如果设备 A 使用 socks5 ,tproxy 等代理技术,那么设备 A 必须能够拦截到目标 C 返回的发给 B 的包,并重新以代理响应的方式返回给 B ,这就要求目标 C 发给 B 的包在网络中一定得经过设备 A 。此外在 A 上实现这个功能也比较怪异,例如 socket 要绑定非本机 IP ,并且可能要注入一个特定的 ebpf 程序来劫持目标 C 返回的特定包。 也有一些特殊的做法可以满足你的要求,例如一个叫做 dae 的代理软件使用 ebpf 来过滤直连的流量,只要确保不启用 SNAT ,就可以实现你需要的功能。这类代理软件在处理直连的流量时行为完全与路由器是一致的。https://github.com/daeuniverse/dae/blob/main/docs/zh/how-it-works.md |