V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
terrytw
V2EX  ›  宽带症候群

Openwrt 透明代理的痛点

  •  
  •   terrytw · 2023-05-15 20:48:26 +08:00 · 7797 次点击
    这是一个创建于 565 天前的主题,其中的信息可能已经有所发展或是发生改变。

    虽然说很多工具都没用过,但是看下来基本上 Openwrt 上透明代理自动分流,都是依赖 iptables/nftables 来匹配并转发发至透明代理 这样产生的一个问题是,openwrt 自身设置的一些规则往往就无效了

    比如在 openwrt 里设置目标 IP 1.2.3.4 的包全部丢弃,但是这个规则是在 filter 表里的,而透明代理一般都是在 mangle 表里的,优先级更高,如果 1.2.3.4 走透明代理的话,上述规则就彻底失效了

    不知道有谁有什么好的建议呢

    第 1 条附言  ·  2023-05-16 09:16:48 +08:00
    其实解决办法是有的,最直接的就是把 1.2.3.4 不走代理就行了
    但是感觉真的不怎么优雅。
    38 条回复    2023-09-14 17:02:32 +08:00
    Lentin
        1
    Lentin  
       2023-05-15 20:58:18 +08:00
    在 mangle 表里面处理=。=
    yaott2020
        2
    yaott2020  
       2023-05-15 21:00:02 +08:00 via Android
    用 tun ?
    terrytw
        3
    terrytw  
    OP
       2023-05-15 21:01:58 +08:00
    @Lentin 以前我还在 raw 表里处理呢,感觉不是什么很好的办法
    @yaott2020 tun 的分流怎么做的呀
    terrytw
        4
    terrytw  
    OP
       2023-05-15 21:04:45 +08:00
    主要是现在 22.03 里面,没法在 fw4 restart 之后附加规则了,所以在 raw 表里加规则都不行了
    Lentin
        5
    Lentin  
       2023-05-15 21:17:00 +08:00
    lovelylain
        6
    lovelylain  
       2023-05-15 21:20:12 +08:00 via Android
    terrytw
        7
    terrytw  
    OP
       2023-05-15 21:30:18 +08:00
    @lovelylain 看到你说 iptables+fwmark ,难道你的 iptables 规则不是在 mangle 和 nat 表嘛?
    terrytw
        8
    terrytw  
    OP
       2023-05-15 21:30:59 +08:00
    @Lentin 看来看去 openclash 也是用 iptables 在 mangle 表做分流啊,不知道你想表达什么意思
    Lentin
        9
    Lentin  
       2023-05-15 22:44:22 +08:00 via iPhone   ❤️ 1
    @terrytw clash 本身有一套规则可以 reject 不需要 iptable 再屏蔽了
    crysislinux
        10
    crysislinux  
       2023-05-16 00:20:02 +08:00 via Android
    感觉确实没有太好的办法,可以多加一个 openwrt 来先处理这些 IP 。但是这样一样透明代理又不能针对某个 lan 上的设备做特殊处理了。
    yanyanjia
        11
    yanyanjia  
       2023-05-16 00:37:53 +08:00
    加一个 openwrt ,两个 openwrt 之间用 ospf 协议分流呢?
    huaxie1988
        12
    huaxie1988  
       2023-05-16 00:45:46 +08:00 via Android
    @terrytw 22.3 可以删除 nft 使用 iptables 。
    opkg remove luci-ssl luci luci-app-firewall firewall4
    opkg install iptables-legacy firewall luci
    而且你这种需要在透明代理的规则前可以加一条 ipset 跳过代理,封 ip 规则也写为封锁该 ipset ,然后将需要封锁的 ip 添加到该 ipset ,ipset 比一条一条的 ip 规则效率更高。
    ccde8259
        13
    ccde8259  
       2023-05-16 02:02:57 +08:00 via iPhone
    一套 OpenWRT 不行就两套……主路由 ER2260T 通过策略路由分流,目标地址国内 IP 或者源地址旁路网关直接上行宽带提供商,其余绕行旁路网关。再在旁路网关上走代理出去……
    qwvy2g
        14
    qwvy2g  
       2023-05-16 02:18:54 +08:00 via Android
    是的,如果流量被分流到代理中,openwrt 防火墙设置就无效了。不如考虑在 openwrt 代理软件中添加绕过代理或者直接在代理里面添加新规则 IPblock 这些 IP 。
    unnamedhao
        15
    unnamedhao  
       2023-05-16 04:10:18 +08:00 via iPhone
    mangle 里把 1.2.3.4 return
    kokutou
        16
    kokutou  
       2023-05-16 08:11:46 +08:00 via Android
    最精确的还得是客户机上装客户端。。。
    mritd
        17
    mritd  
       2023-05-16 08:21:02 +08:00 via iPhone
    搞不明白 openwrt ,自己搓了一个 github.com/mritd/tpclash
    cwbsw
        18
    cwbsw  
       2023-05-16 10:56:18 +08:00
    手写规则就可以了,用现成工具肯定多多少少有不如意的地方。
    gesse
        19
    gesse  
       2023-05-16 12:05:33 +08:00
    学学 GFW ,哈哈哈
    iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT --to 2.2.2.2
    missdeer
        20
    missdeer  
       2023-05-16 13:41:03 +08:00
    不要用一键安装的插件就行了,自己手写 iptables
    YGBlvcAK
        21
    YGBlvcAK  
       2023-05-16 14:06:26 +08:00
    这还不简单吗? mangle 表里 return ,再在 filter 表的 FORWARD 链 drop 掉
    azure2023us559
        22
    azure2023us559  
       2023-05-16 19:27:00 +08:00
    你真的了解透明代理吗?

    可以不需要用 mangle 表,请配合 ipset

    ss-libev 给的方案太粗鲁了,将所有国外 ip 经过代理,其实完全不需要。

    完全可以通过 ipset 解决。



    /etc/firewall.user
    # create ipset
    ipset create gfw hash:ip hashsize 4096

    # for gfw vultr us
    iptables -t nat -I PREROUTING -p tcp -m set --match-set gfw dst -m multiport --dports 80,443 -j REDIRECT --to-ports 1234
    iptables -t nat -I OUTPUT -p tcp -m set --match-set gfw dst -m multiport --dports 80,443 -j REDIRECT --to-ports 1234

    配合 dnsmasq.conf
    ipset=/google.com/gfw
    server=/google.com/127.0.0.1#5300

    /etc/rc.local
    # for gfw
    /opt/ss-libev/ss-tunnel -c /opt/ss-libev/ss.json -b 127.0.0.1 -l 5678 -L 127.0.0.1:53 -f /var/run/ss-tunnel.pid
    /opt/ss-libev/dns-forwarder -b 0.0.0.0 -p 5300 -s 127.0.0.1:5678 &
    /opt/ss-libev/ss-redir -c /opt/ss-libev/ss.json -b 0.0.0.0 -l 1234 -f /var/run/ss-redir.pid
    azure2023us559
        23
    azure2023us559  
       2023-05-16 19:31:04 +08:00
    以上,只需要 1 条 iptables 解决

    # for gfw vultr us
    iptables -t nat -I PREROUTING -p tcp -m set --match-set gfw dst -m multiport --dports 80,443 -j REDIRECT --to-ports 1234

    output 链是让本地路由器访问 gfw ,也可以走代理。
    terrytw
        24
    terrytw  
    OP
       2023-05-16 20:34:29 +08:00
    @azure2023us559 你真的了解透明代理嘛?用 mangle 表是为了 UDP 流量
    1 条 iptbales 就解决的前提是,你的需求很简单,我随便说几个功能,你的 iptables 条数就会不停往上涨
    1. NAS 不走透明代理
    2. NAS 不走透明代理的前提下,部分 tracker 的域名对应流量强制走代理
    3. Windows 下某个程序不走透明代理,其他所有流量自动分流
    terrytw
        25
    terrytw  
    OP
       2023-05-16 20:37:44 +08:00
    @YGBlvcAK
    @missdeer
    @gesse
    @cwbsw
    手写 iptables/nftables 规则,在 mangle 表里做 return 当然是可行的,但是 fw4 restart 之后规则就没了怎么解决呢?
    以前还有 firewall.user 可以 include 在防火墙重启后,加载用户的规则,现在 firewall4 这个功能已经没有了
    大家是不是没用过 fw4....
    ftfunjth
        26
    ftfunjth  
       2023-05-16 21:15:40 +08:00 via iPhone
    先说明你是通过 tproxy 还是 dnat 实现的透明代理
    azure2023us559
        27
    azure2023us559  
       2023-05-16 21:37:55 +08:00
    @terrytw udp 流量主要是有哪些需求? dns ?游戏?
    azure2023us559
        28
    azure2023us559  
       2023-05-16 21:42:03 +08:00
    @terrytw 新版 op 用的 fw4 还有很多 bug 。踩完坑就知道了。我主要会用到 docker ,建议退回到 old 稳定版 21.0x
    missdeer
        29
    missdeer  
       2023-05-16 21:57:26 +08:00
    @terrytw iptables-persistent 了解一下
    huaxie1988
        30
    huaxie1988  
       2023-05-16 22:14:02 +08:00 via Android
    @terrytw 22.3 可以用 fw3 的。
    ftfunjth
        31
    ftfunjth  
       2023-05-16 22:37:09 +08:00   ❤️ 1
    mangle 链的 PREROUTING 中的 ipse 规则 t 是一个很好的方案, 它可以让你免去对 forwarded 的 ip package routing 两次的开销(network card => lo => network card), 不加 ipset 情况下使用 TPROXY 的代理工具如 v2ray 分流,一定会多 routing 一次。
    ftfunjth
        32
    ftfunjth  
       2023-05-16 22:37:50 +08:00
    @Lentin 会多路由一次
    ftfunjth
        33
    ftfunjth  
       2023-05-16 22:38:47 +08:00
    建议对 mangle 链的 OUTPUT 也加上分流国内 ip 的 ipset 规则。
    shamburger
        34
    shamburger  
       2023-05-16 22:38:50 +08:00   ❤️ 1
    我在使用 pbr (policy-based routing) 即策略路由插件,好在以纳入 openwrt 的主 repo 。
    - 支持 fw4 + nft 或 fw3 + iptables
    - 可以通过 luci-app-pbr 填写规则 或 拼接自定义脚本(比如 china-ip 分流)
    - 自动识别 wan 和隧道出口,并搭建相应的 fwmark 、ipset 、nftset
    - 通过 hotplug.d 热插拔即自动刷新

    规则导流对象主要为 openvpn 或 wireguard 隧道出口。我不确定 pbr 是否支持代理工作模式。
    https://docs.openwrt.melmac.net/pbr/
    YGBlvcAK
        35
    YGBlvcAK  
       2023-05-16 22:53:35 +08:00 via Android
    op 是给小白用的,楼主既然懂 Linux ,不如直接在 debian 中搭建一套,熟练了 10 几分钟就搭建完了,上面这需求就太简单了

    话说我就是这么干的,所有工具都是自己安装的,想装什么版本就装什么版本,多套方案随意切换
    cwbsw
        36
    cwbsw  
       2023-05-17 08:57:44 +08:00   ❤️ 1
    Firxiao
        37
    Firxiao  
       2023-05-17 23:09:36 +08:00   ❤️ 1
    @terrytw nftables 规则放在 /etc/nftables.d
    aliensb
        38
    aliensb  
       2023-09-14 17:02:32 +08:00
    老哥,这个问题最后怎么解决的呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:28 · PVG 03:28 · LAX 11:28 · JFK 14:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.