Clash: Fake IP 模式作為網關代理的幾個問題

Created on 12 May 2019  ·  17Comments  ·  Source: Dreamacro/clash

  1. 目前對於 fake ip 的 ICMP 包,Clash 不進行回應,這可能會導致某些應用程式非預期的行為
  2. 因為用了 Fake IP,加上目前 Clash 還不具備 UDP 轉發的能力,所以某些 UDP 應用會嘗試連到 fake ip 而失敗(例如 TeamSpeak)

All 17 comments

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 notifications@github.com 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的。

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

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

Was this page helpful?
0 / 5 - 0 ratings

Related issues

ingjieye picture ingjieye  ·  6Comments

Anankke picture Anankke  ·  5Comments

luvletter2333 picture luvletter2333  ·  5Comments

Tsahao picture Tsahao  ·  4Comments

nobody-65534 picture nobody-65534  ·  3Comments