archlinux 上使用 tproxy 设置 nftables 规则透明代理本机流量,如何让 telegram 的纯 ip 流量也走透明代理?

2023-10-13 09:25:54 +08:00
 EvineDeng

操作系统:archlinux ;代理软件:clash-meta ,已添加 route-mark 为 666 ;我的笔记本只有一块无线网卡,在系统中为wlp1s0,已对其添加 ip 规则如下:

ip inet rule add fwmark 1 lookup 100
ip inet route add local default dev wlp1s0 table 100

同时设置了 nftables 规则如下:

## 只处理指定网卡的流量
define interface = wlp1s0

## clash 的透明代理端口
define tproxy_port = 7895

## clash 打的标记( routing-mark )
define clash_mark = 666

## 常规流量标记,ip rule 中加的标记,和 ip 规则中保持一致
define default_mark = 1

## 保留 ip 地址
define private_address = {
    127.0.0.0/8,
    100.64.0.0/10,
    169.254.0.0/16,
    224.0.0.0/4,
    240.0.0.0/4,
    255.255.255.255,
    10.0.0.0/8,
    172.16.0.0/12,
    192.168.0.0/16
}

## 大陆 ip 地址
include "/var/lib/clash/geoip4_cn.nft"

table ip clash {
    chain prerouting {
        type filter hook prerouting priority mangle; policy accept;
        fib daddr type local accept
        ip daddr $private_address accept
        ip daddr $geoip4_cn accept
        # meta l4proto udp accept  # udp 流量也走代理
        meta l4proto { tcp, udp } socket transparent 1 meta mark set $default_mark accept
        meta l4proto { tcp, udp } tproxy to :$tproxy_port meta mark set $default_mark
    }

    chain output {
        type route hook output priority mangle; policy accept;
        oifname != $interface accept
        meta mark $clash_mark accept
        fib daddr type local accept
        tcp dport { 53, 853 } accept
        udp dport { 53, 853, 123, 137 } accept
        ip daddr $private_address accept
        ip daddr $geoip4_cn accept
        meta l4proto {tcp, udp} meta mark set $default_mark
    }
}

以上的 nftables 规则通过nft list ruleset可以显示出来。另外,通过其他软件设置了将 dns 查询转发到 clash-meta 的 dns 监听端口,事实上只要是通过域名访问的流量,也正常走向了透明代理,在 clash-meta 的连接情况中也能如实反映。但是 telegram 的流量是纯 ip 形式的,基于以上的设置内容,telegram 却无法正常连接,在 clash-meta 的连接情况中也看不到任何纯 ip 形式的流量,我设置的大陆 ip 清单geoip4_cn.nft也没有包含 telegram 的 ip 。请问这里的各位 nftables 大佬这是什么原因导致的?应该怎么解决?

1499 次点击
所在节点    Telegram
3 条回复
blackeeper
2023-10-13 10:59:36 +08:00
直接把目的 IP 为:telegram_ip 转到透明代理的端口就可以了
ip daddr $telegram_ip meta l4proto { tcp, udp } tproxy to :$tproxy_port
EvineDeng
2023-10-13 11:37:21 +08:00
@blackeeper 最后发现是我自己忘记取消 tg 中的代理设置了,用透明代理不需要给 tg 再设置代理了。。。
D7S
69 天前
nftables 如果加上 udp53 拦截 dns 就完美了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/981529

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX