V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EvineDeng
V2EX  ›  Telegram

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

  •  1
     
  •   EvineDeng · 2023-10-13 09:25:54 +08:00 · 1501 次点击
    这是一个创建于 407 天前的主题,其中的信息可能已经有所发展或是发生改变。

    操作系统: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 大佬这是什么原因导致的?应该怎么解决?

    3 条回复    2024-09-13 10:05:40 +08:00
    blackeeper
        1
    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
        2
    EvineDeng  
    OP
       2023-10-13 11:37:21 +08:00
    @blackeeper 最后发现是我自己忘记取消 tg 中的代理设置了,用透明代理不需要给 tg 再设置代理了。。。
    D7S
        3
    D7S  
       71 天前
    nftables 如果加上 udp53 拦截 dns 就完美了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2900 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:22 · PVG 16:22 · LAX 00:22 · JFK 03:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.