Skip to content
This repository has been archived by the owner on Apr 11, 2022. It is now read-only.

IP地址类型的流量似乎没有被导入utun #6

Closed
xuhuanxxx opened this issue Feb 23, 2021 · 9 comments
Closed

IP地址类型的流量似乎没有被导入utun #6

xuhuanxxx opened this issue Feb 23, 2021 · 9 comments
Labels
help wanted Extra attention is needed

Comments

@xuhuanxxx
Copy link

xuhuanxxx commented Feb 23, 2021

刚好在 https://github.com/Dreamacro/clash 那边提过 https://github.com/Dreamacro/clash/discussions/1251类似的问题

tun模式运行的clash premium会接管53端口,域名类请求都会被clash正确地处理,但是有一些应用如Telegram、Android TV端的Netflix会直接请求IP地址类资源,这类请求似乎没有被导入utun。

我关闭了防火墙并尝试了下面的iptables规则,发现可以解决问题,但是似乎clash-premium-installer用的是nftables。

#!/bin/bash
# https://comzyh.gitbook.io/clash/real-ip-tun-example

# 创建 Clash Chain
iptables -t mangle -N clash

# 放行内网内部数据
iptables -t mangle -A clash -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A clash -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A clash -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A clash -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A clash -d 240.0.0.0/4 -j RETURN

# 其他数据打上标记
iptables -t mangle -A clash -j MARK --set-xmark 100

# 给转发流量打上fwmark
iptables -t mangle -A PREROUTING -j clash

# 放行root用户数据避免回环
# iptables -t mangle -A OUTPUT -m owner --uid-owner 0 -j RETURN

# utun添加策略路由表
ip route add default dev utun table 100
# 标记为100的包由策略路由表100处理
ip rule add fwmark 100 lookup 100

exec "$@"

所以在打开防火墙时该如何处理IP地址类的入站流量?另外“放行root用户数据避免回环”那个规则是否应该加上?

谢谢

@Kr328
Copy link
Owner

Kr328 commented Feb 23, 2021

在 iptables/nftables/tcpip协议栈 的眼里域名流量和 IP 流量没有任何区别 并且所有规则在我的设备上工作正常

至于为什么所谓的 IP 流量没有进入 clash 建议检查其他设备的路由表 (作为旁路由设备同样也进行过测试 (Switch 的 UDP NAT 穿越 正常

最后 所谓防火墙 Linux 下有一万种实现 (最基本的 iptables 或者是 firewalld 或者 ufw 不知道你这说的那种以及规则是什么

@Kr328 Kr328 added the question Further information is requested label Feb 23, 2021
@xuhuanxxx
Copy link
Author

在 iptables/nftables/tcpip协议栈 的眼里域名流量和 IP 流量没有任何区别 并且所有规则在我的设备上工作正常

至于为什么所谓的 IP 流量没有进入 clash 建议检查其他设备的路由表 (作为旁路由设备同样也进行过测试 (Switch 的 UDP NAT 穿越 正常

最后 所谓防火墙 Linux 下有一万种实现 (最基本的 iptables 或者是 firewalld 或者 ufw 不知道你这说的那种以及规则是什么

换了个debian 10测试了一下,运行起来非常正常。看来可能是fedora上的问题。

@xuhuanxxx
Copy link
Author

发现在不能正常工作的 Fedora 33 上运行 nft list ruleset,结果是空的。又尝试手动执行 /usr/lib/clash/setup-tun.sh ,一切都变正常了。初步怀疑是 /usr/lib/udev/rules.d/99-clash.rules 的问题。
然后分别在 Fedora 33(工作不正常)、Ubuntu 20.10(工作正常)、Debian 9(工作正常)分别执行 udevadm test /devices/virtual/net/utun,结果规则其实都可以匹配到。

Fedora 33

DEVPATH=/devices/virtual/net/utun
INTERFACE=utun
IFINDEX=7
ACTION=add
SUBSYSTEM=net
ID_MM_CANDIDATE=1
ID_NET_DRIVER=tun
ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
TAGS=:systemd:
SYSTEMD_ALIAS=/sys/subsystem/net/devices/utun
USEC_INITIALIZED=11197218
run: '/usr/lib/clash/setup-tun.sh'
run: '/usr/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/utun --prefix=/net/ipv4/neigh/utun 
--prefix=/net/ipv6/conf/utun --prefix=/net/ipv6/neigh/utun'

Ubuntu 20.10

DEVPATH=/devices/virtual/net/utun
INTERFACE=utun
IFINDEX=7
ACTION=add
SUBSYSTEM=net
ID_MM_CANDIDATE=1
ID_NET_DRIVER=tun
ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
TAGS=:systemd:
SYSTEMD_ALIAS=/sys/subsystem/net/devices/utun
USEC_INITIALIZED=7258502732
run: '/lib/open-iscsi/net-interface-handler start'
run: '/usr/lib/clash/setup-tun.sh'
run: '/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/utun --prefix=/net/ipv4/neigh/utun 
--prefix=/net/ipv6/conf/utun --prefix=/net/ipv6/neigh/utun'

Debian 9

DEVPATH=/devices/virtual/net/utun
INTERFACE=utun
IFINDEX=15
ACTION=add
SUBSYSTEM=net
net.ifnames=0
ID_MM_CANDIDATE=1
ID_NET_DRIVER=tun
ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
TAGS=:systemd:
SYSTEMD_ALIAS=/sys/subsystem/net/devices/utun
USEC_INITIALIZED=280126571617
run: 'ifupdown-hotplug'
run: '/usr/lib/clash/setup-tun.sh'
run: '/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/utun --prefix=/net/ipv4/neigh/utun 
--prefix=/net/ipv6/conf/utun --prefix=/net/ipv6/neigh/utun'

所以可能是Fedora本身,因为某种原因阻止了setup-tun.sh的执行。

@xuhuanxxx xuhuanxxx reopened this Mar 16, 2021
@Kr328 Kr328 added help wanted Extra attention is needed and removed question Further information is requested labels Mar 16, 2021
@ghost
Copy link

ghost commented Mar 17, 2021

你遇到的问题似乎和 #2 (comment) 相同,把 /usr/lib/udev/rules.d/99-clash.rules 改成 /lib/udev/rules.d/99-clash.rules(引用这个文件的相关文件也要修改)试试。

@xuhuanxxx
Copy link
Author

xuhuanxxx commented Mar 17, 2021

你遇到的问题似乎和 #2 (comment) 相同,把 /usr/lib/udev/rules.d/99-clash.rules 改成 /lib/udev/rules.d/99-clash.rules(引用这个文件的相关文件也要修改)试试。

这俩其实是一样的地址吧。原因不在rules的位置,它其实是可以匹配到并执行setup.tun的,只是执行的时候出了问题。而且我看了下一下他fork的版本,也不是用udev的rules执行setup-tun.sh

@xuhuanxxx
Copy link
Author

xuhuanxxx commented Mar 17, 2021

重新看了一下 systemd-udevd 的日志,selinux 关闭的情况下应该不存在权限的问题。
图片

@xuhuanxxx
Copy link
Author

问题大概搞明白了,Fedora 系统 udev 规则执行脚本时的环境似乎是 device 自身的环境,所以就找不到 setup-tun.sh 和 clean-tun.sh 中涉及到的命令,修改一下 RUN+= 后面的命令就可以正确执行了。不过不知道为啥加/bin/sh也没用,只能改成 /bin/sudo。
99-clash.rules

SUBSYSTEM=="net",ENV{INTERFACE}=="utun",ACTION=="add",RUN+="/bin/sudo /usr/lib/clash/setup-tun.sh"
SUBSYSTEM=="net",ENV{INTERFACE}=="utun",ACTION=="remove",RUN+="/bin/sudo /usr/lib/clash/clean-tun.sh"

udevadm control --reload-rules

上面这种是最容易修改的,还有一种方案是创建一个 clash-tun.service,udev 规则调用 service 来完流量重定向。

SUBSYSTEM=="net",ENV{INTERFACE}=="utun",ACTION=="add",RUN+="clash-setup-tun.service"
SUBSYSTEM=="net",ENV{INTERFACE}=="utun",ACTION=="remove",RUN+="clash-clean-tun.service"

这样就还需要再创建两个 service。如果 udev 的 RUN 可以调用 service 的同时传递参数倒是可以省事一点,不过好像不行。

@senocids
Copy link

senocids commented Mar 28, 2021

raspbian buster 10, kernel 64bit, userland 32bit
遇到同样的问题.

同样是 $ (sudo)? nft list ruleset 输出为空.

尝试根据上一个 post 在 99-clash.rules 里添加 /bin/sudo, 未果.

$ sudo udevadm test /devices/virtual/net/utun,
输出没有 run: '/bin/sudo /home/pi/lib/clash/setup-tun.sh'.

尝试更改 installer.sh99-clash.rules 安装路径至 /etc/udev/rules.d/99-clash.rules (原先为自己改的 /home/pi/udev/rules.d/99-clash.rules).
测试 $ sudo udevadm test /devices/virtual/net/utun,

成功解决 udev 的 99-clash.rules 失败导入.
...
Reading rules file: /etc/udev/rules.d/99-clash.rules
...
Config file /lib/systemd/network/99-default.link applies to device utun
link_config: autonegotiation is unset or enabled, the speed and duplex are not writable.
DEVPATH=/devices/virtual/net/utun
INTERFACE=utun
IFINDEX=5
ACTION=add
SUBSYSTEM=net
ID_NET_DRIVER=tun
ID_NET_LINK_FILE=/lib/systemd/network/99-default.link
TAGS=:systemd:
SYSTEMD_ALIAS=/sys/subsystem/net/devices/utun
USEC_INITIALIZED=903257523
run: 'bridge-network-interface'
run: 'ifupdown-hotplug'
run: '/home/pi/lib/clash/setup-tun.sh'
run: '/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/utun --prefix=/net/ipv4/neigh/utun --prefix=/net/ipv6/conf/utun --prefix=/net/ipv6/neigh/utun'
Unload module index
Unloaded link configuration context.

可是,
nft 依旧为空

`$ systemctl status systemd-udevd.service` 日志输出
● systemd-udevd.service - udev Kernel Device Manager
   Loaded: loaded (/lib/systemd/system/systemd-udevd.service; static; vendor preset: enabled)
   Active: active (running) since dateTime; 10min ago
     Docs: man:systemd-udevd.service(8)
           man:udev(7)
 Main PID: 155 (systemd-udevd)
   Status: "Processing with 26 children at max"
    Tasks: 1
   CGroup: /system.slice/systemd-udevd.service
           └─155 /lib/systemd/systemd-udevd

dateTime raspberrypi systemd[1]: Starting udev Kernel Device Manager...
dateTime raspberrypi systemd[1]: Started udev Kernel Device Manager.
dateTime raspberrypi systemd-udevd[157]: Using default interface naming scheme 'v240'.
dateTime raspberrypi systemd-udevd[157]: link_config: autonegotiation is unset or enabled, the speed and duplex are not writable.
dateTime raspberrypi systemd-udevd[164]: link_config: autonegotiation is unset or enabled, the speed and duplex are not writable.
dateTime raspberrypi systemd-udevd[178]: Using default interface naming scheme 'v240'.
dateTime raspberrypi systemd-udevd[178]: link_config: autonegotiation is unset or enabled, the speed and duplex are not writable.
dateTime raspberrypi systemd-udevd[1524]: link_config: autonegotiation is unset or enabled, the speed and duplex are not writable.
dateTime raspberrypi systemd-udevd[1524]: Process '/bin/sudo /home/pi/lib/clash/setup-tun.sh' failed with exit code 1.

尝试 99-clash.rules 里删除之前添加的 /bin/sudo.
$ sudo nft list ruleset 成功返回...

折腾错方向了...  不过感谢各位相关的 debug 知识

@xuhuanxxx
Copy link
Author

raspbian buster 10, kernel 64bit, userland 32bit
遇到同样的问题.

同样是 $ (sudo)? nft list ruleset 输出为空.

尝试根据上一个 post 在 99-clash.rules 里添加 /bin/sudo, 未果.

$ sudo udevadm test /devices/virtual/net/utun,
输出没有 run: '/bin/sudo /home/pi/lib/clash/setup-tun.sh'.

尝试更改 installer.sh99-clash.rules 安装路径至 /etc/udev/rules.d/99-clash.rules (原先为自己改的 /home/pi/udev/rules.d/99-clash.rules).
测试 $ sudo udevadm test /devices/virtual/net/utun,
成功解决 udev 的 99-clash.rules 失败导入.

可是,
nft 依旧为空
$ systemctl status systemd-udevd.service 日志输出

尝试 99-clash.rules 里删除之前添加的 /bin/sudo.
$ sudo nft list ruleset 成功返回...

折腾错方向了... 不过感谢各位相关的 debug 知识

我感觉是因为 udev 的规则本来就不支持放在用户目录底下,除非自己魔改一下 systemd-udevd 😂

udev 规则以管理员身份编写并保存在 /etc/udev/rules.d/ 目录,其文件名必须以 .rules 结尾。各种软件包提供的规则文件位于 /lib/udev/rules.d/。如果 /usr/lib 和 /etc 这两个目录中有同名文件,则 /etc 中的文件优先。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

3 participants