Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

为什么最后移除掉tun的ethernet封装? #105

Closed
taikulawo opened this issue Aug 9, 2021 · 10 comments
Closed

为什么最后移除掉tun的ethernet封装? #105

taikulawo opened this issue Aug 9, 2021 · 10 comments

Comments

@taikulawo
Copy link

你好,我是从这过来的,shadowsocks/shadowsocks-rust#199 (comment)

看seeker 2020年的代码,seeker曾用过smoltcp的ethernet封装,但似乎最新的master已经去掉了

现在采用封包后发给socks服务器,而不需要从packet里自行封装TCPListener。但封包发给socks服务器需要编写路由表将socks ip排除。不太灵活

想知道最后去掉ethenet的原因是什么?

@gfreezy
Copy link
Owner

gfreezy commented Aug 10, 2021

实现比较复杂,并且 fork 了 smoltcp 暴露了一些内部的接口,长期不容易维护。后来发现可以用系统的网络栈就改成用系统的了

@taikulawo
Copy link
Author

那必须额外加个路由,把socks地址排除掉对吗

@gfreezy
Copy link
Owner

gfreezy commented Aug 10, 2021

不需要啊。现在依赖 DNS,把需要翻墙的域名解析到 tun 所在的网段,不需要翻墙的域名走系统的DNS解析,也就不会走到 tun。

@gfreezy
Copy link
Owner

gfreezy commented Aug 10, 2021

不过需要在配置文件里面指定 socks server 直连

@taikulawo
Copy link
Author

我看里面有这句话

如果使用了本机 socks5 代理,则必须确保 socks5 不会直连加入路由表的网段,否则会死循环。

那就是加路由的时候,对socks5的流量要放行,这种实现不应该就是加个更短的socks5路由条目吗

@gfreezy
Copy link
Owner

gfreezy commented Aug 10, 2021

tun 对应的网段为: 10.0.0.0/16
翻墙服务器域名: A

  • 如果在 config.yml 里面指定了A 为 DIRECT ,则 A 解析永远是正常的IP,不需要做任何处理。
  • 如果没有在 config.yml 里面指定 A 为 DIRECT ,seeker 会自动探测,A 有可能解析成 tun 网段的 IP。这种情况下会形成死循环: 正常流量 -> tun -> 本地 socks 服务器 -> tun

@gfreezy
Copy link
Owner

gfreezy commented Aug 10, 2021

我看里面有这句话

如果使用了本机 socks5 代理,则必须确保 socks5 不会直连加入路由表的网段,否则会死循环。

那就是加路由的时候,对socks5的流量要放行,这种实现不应该就是加个更短的socks5路由条目吗

文档写的有点问题,应该是远程的翻墙服务器必须配置成 DIRECT 规则

@taikulawo
Copy link
Author

我看没有涉及到修改默认路由,并没有将全部的流量都转发到tun网卡。

  1. seeker应该listen全部的53端口,将DNS拦截,最后返回个fake ip,这样client会主动来连接到tun网卡,由tun根据session决定是否去socks server,还是直接direct,对吗?

  2. 如果对的话,不拦截全部的流量,seeker对clash的IP过滤不好处理吧

@gfreezy
Copy link
Owner

gfreezy commented Aug 10, 2021

  1. dns拦截后并不是所有的域名都返回 fake ip。会根据 config.yml 里面的配置判断是返回 fake ip 还是返回真实 IP
  2. 目前没实现。实现方法只能在启动的时候读一下配置文件,然后对这些 IP 单独加一条路由表
  3. fake ip 的方法想要实现 IP 过滤,只能通过路由表。

@taikulawo
Copy link
Author

感谢作者!通过阅读seeker源代码,受益良多!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants