Clash: Fake IP 模式作为网关代理的几个问题

创建于 2019-05-12  ·  17评论  ·  资料来源: Dreamacro/clash

  1. 目前对于fake ip 的ICMP 包,Clash 不进行回应,这可能会导致某些应用程式非预期的行为
  2. 因为用了Fake IP,加上目前Clash 还不具备UDP 转发的能力,所以某些UDP 应用会尝试连到fake ip 而失败(例如TeamSpeak)

所有17条评论

TUN 模式会解决这两个问题

想请问一下,我现在用clash在路由器上做透明代理,希望使用fake-ip,请问能使用TUN模式吗,如果可以,能分享一点配置的资料吗?

希望使用fake ip(相较于redir-host)的原因是觉得更合理一点,目前几乎所有情况都工作的很好,唯一的问题是王者荣耀检测延迟时连接不通,我猜想是因为udp使用了fake ip的问题,所以想请教一下。

多谢。

TUN 还没实作,我个人目前的作法是不需要UDP 的走fakeip、需要的走redir-host(也就是开两个Clash Instance)

On Sat, Jul 27, 2019 at 2:43 AM AylinZhao [email protected] wrote:

想请问一下,我现在用clash在路由器上做透明代理,希望使用fake-ip,请问能使用TUN模式吗,如果可以,能分享一点配置的资料吗?

希望使用fake
ip(相较于redir-host)的原因是觉得更合理一点,目前几乎所有情况都工作的很好,唯一的问题是王者荣耀检测延迟时连接不通,我猜想是因为udp使用了fake
ip的问题,所以想请教一下。

多谢。


You are receiving this because you authored the thread.

Reply to this email directly, view it on GitHub
https://github.com/Dreamacro/clash/issues/179?email_source=notifications&email_token=AB6FI752JQQZPMZBH4KYEHLQBNAWRA5CNFSM4HMJDBC2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD25M73Q#issuecomment-515559406 ,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AB6FI7YKTOA2BX525XOUELLQBNAWRANCNFSM4HMJDBCQ
.

@BirkhoffLee 谢谢,这个思路很赞,请问是通过iptables分流到不同的instance吗?如果是,能分享一下分流的方法吗

@BirkhoffLee谢谢,这个思路很赞,请问是通过iptables分流到不同的instance吗?如果是,能分享一下分流的方法吗

跟一个instance 是一样的方法,只是是两条iptables DNAT:

# 到 fake ip range 的 tcp 全部轉發到 clash fakeip
iptables -t nat -A clash_lan -p tcp -d 198.18.0.0/16 -j DNAT --to-destination 10.0.1.6:23456

# 其他 tcp 80/443 全部轉發到 clash redirhost
iptables -t nat -A clash_lan \! -d 198.18.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.6:9999
iptables -t nat -A clash_lan \! -d 198.18.0.0/16 -p tcp --dport 443 -j DNAT --to-destination 10.0.1.6:9999

iptables -t nat -A PREROUTING -p tcp -j clash_lan

加上Sukka 发明的Fake DNS

iptables -t nat -N clash_fakedns
iptables -t nat -A clash_fakedns -p udp --dport 53 -j DNAT --to-destination 10.0.1.6:23453
iptables -t nat -A clash_fakedns -p tcp --dport 53 -j DNAT --to-destination 10.0.1.6:23453

iptables -t nat -A PREROUTING -p udp -d 198.19.0.0/24 -j clash_fakedns
iptables -t nat -A PREROUTING -p tcp -d 198.19.0.0/24 -j clash_fakedns

这样子需要Fake IP 的设备把DNS 改到198.19.0.1 就可以了

EDIT: 更正Fake IP CIDR

谢谢分享。我理解这是通过给不同设备设置不同的dns的方式,来实现不同的解析策略。

我目前的情况是在路由器设置透明代理的条件下,同一个设备(我的手机),的某些udp流量(王者荣耀延迟测试)希望能得到正确的处理,不知道有什么办法没有。

倾向的解决方案是所有事情在路由器上搞定,而对所有设备透明。

谢谢分享。我理解这是通过给不同设备设置不同的dns的方式,来实现不同的解析策略。

我目前的情况是在路由器设置透明代理的条件下,同一个设备(我的手机),的某些udp流量(王者荣耀延迟测试)希望能得到正确的处理,不知道有什么办法没有。

倾向的解决方案是所有事情在路由器上搞定,而对所有设备透明。

暂时没有

了解,再次感谢

可否考虑这样一种模式fake-ip-proxy-only:

  1. 对于需要代理的域名,返回fake ip
  2. 对于其它域名,一律返回真实ip
    2.1 如果有域名规则定义了直连,是需要真实ip的
    2.2 对于需要代理的ip段(geo rules),本身也需要先查询真实ip然后对比geo数据库,然后才会发起连接
    2.3 对于剩下直连的ip段,也是需要真实ip的

这样对于需要代理的域名,依然不会产生不必要的dns查询。
对于需要代理的ip段,发起连接的时间也是一样的。
对于其它情况,都是需要真实ip的。

不知道我对流程的理解是否正确,麻烦指正。

可否考虑这样一种模式fake-ip-proxy-only:

  1. 对于需要代理的域名,返回fake ip
  2. 对于其它域名,一律返回真实ip
    2.1 如果有域名规则定义了直连,是需要真实ip的
    2.2 对于需要代理的ip段(geo rules),本身也需要先查询真实ip然后对比geo数据库,然后才会发起连接
    2.3 对于剩下直连的ip段,也是需要真实ip的

这样对于需要代理的域名,依然不会产生不必要的dns查询。
对于需要代理的ip段,发起连接的时间也是一样的。
对于其它情况,都是需要真实ip的。

不知道我对流程的理解是否正确,麻烦指正。

对rules里面要代理的域名才进行fake ip返回,其它都返回real ip?

@beyondkmp 是的

@BirkhoffLee谢谢,这个思路很赞,请问是通过iptables分流到不同的instance吗?如果是,能分享一下分流的方法吗

跟一个instance 是一样的方法,只是是两条iptables DNAT:

# 到 fake ip range 的 tcp 全部轉發到 clash fakeip
iptables -t nat -A clash_lan -p tcp -d 198.18.0.0/16 -j DNAT --to-destination 10.0.1.6:23456

# 其他 tcp 80/443 全部轉發到 clash redirhost
iptables -t nat -A clash_lan \! -d 198.18.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.6:9999
iptables -t nat -A clash_lan \! -d 198.18.0.0/16 -p tcp --dport 443 -j DNAT --to-destination 10.0.1.6:9999

iptables -t nat -A PREROUTING -p tcp -j clash_lan

加上Sukka 发明的Fake DNS

iptables -t nat -N clash_fakedns
iptables -t nat -A clash_fakedns -p udp --dport 53 -j DNAT --to-destination 10.0.1.6:23453
iptables -t nat -A clash_fakedns -p tcp --dport 53 -j DNAT --to-destination 10.0.1.6:23453

iptables -t nat -A PREROUTING -p udp -d 198.19.0.0/24 -j clash_fakedns
iptables -t nat -A PREROUTING -p tcp -d 198.19.0.0/24 -j clash_fakedns

这样子需要Fake IP 的设备把DNS 改到198.19.0.1 就可以了

EDIT: 更正Fake IP CIDR

你的方法不错,我想试试,请问一下,
如何开2个Clash实例?其中一个的代理端口设为9999?

  1. 目前对于fake ip 的ICMP 包,Clash 不进行回应,这可能会导致某些应用程式非预期的行为
  2. 因为用了Fake IP,加上目前Clash 还不具备UDP 转发的能力,所以某些UDP 应用会尝试连到fake ip 而失败(例如TeamSpeak)

https://github.com/vernesong/OpenClash/releases/tag/v0.33.7-beta
openclash 0.33.7版通过建立了一个域名名单让特定域名走特定dns提供了一种解决方案。

https://github.com/Dreamacro/clash/releases/tag/TUN 可以试试实验性的 TUN 二进制

这个fakeip机制这么复杂,不能像v2ray那样直接拆包获取host不是更方便

在 fake ip 模式下,坚果云连不上网

可否考虑这样一种模式fake-ip-proxy-only:

  1. 对于需要代理的域名,返回fake ip
  2. 对于其它域名,一律返回真实ip
    2.1 如果有域名规则定义了直连,是需要真实ip的
    2.2 对于需要代理的ip段(geo rules),本身也需要先查询真实ip然后对比geo数据库,然后才会发起连接
    2.3 对于剩下直连的ip段,也是需要真实ip的

这样对于需要代理的域名,依然不会产生不必要的dns查询。
对于需要代理的ip段,发起连接的时间也是一样的。
对于其它情况,都是需要真实ip的。

不知道我对流程的理解是否正确,麻烦指正。

希望开发者能考虑这样的新功能,目前看来还是无法做到这样。

此页面是否有帮助?
0 / 5 - 0 等级