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

Openwrt 透明代理的痛点

  •  
  •   terrytw · 293 天前 · 6306 次点击
    这是一个创建于 293 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    可以不需要用 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  
       292 天前
    以上,只需要 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
       292 天前
    @azure2023us559 你真的了解透明代理嘛?用 mangle 表是为了 UDP 流量
    1 条 iptbales 就解决的前提是,你的需求很简单,我随便说几个功能,你的 iptables 条数就会不停往上涨
    1. NAS 不走透明代理
    2. NAS 不走透明代理的前提下,部分 tracker 的域名对应流量强制走代理
    3. Windows 下某个程序不走透明代理,其他所有流量自动分流
    terrytw
        25
    terrytw  
    OP
       292 天前
    @YGBlvcAK
    @missdeer
    @gesse
    @cwbsw
    手写 iptables/nftables 规则,在 mangle 表里做 return 当然是可行的,但是 fw4 restart 之后规则就没了怎么解决呢?
    以前还有 firewall.user 可以 include 在防火墙重启后,加载用户的规则,现在 firewall4 这个功能已经没有了
    大家是不是没用过 fw4....
    ftfunjth
        26
    ftfunjth  
       292 天前 via iPhone
    先说明你是通过 tproxy 还是 dnat 实现的透明代理
    azure2023us559
        27
    azure2023us559  
       292 天前
    @terrytw udp 流量主要是有哪些需求? dns ?游戏?
    azure2023us559
        28
    azure2023us559  
       292 天前
    @terrytw 新版 op 用的 fw4 还有很多 bug 。踩完坑就知道了。我主要会用到 docker ,建议退回到 old 稳定版 21.0x
    missdeer
        29
    missdeer  
       292 天前
    @terrytw iptables-persistent 了解一下
    huaxie1988
        30
    huaxie1988  
       292 天前 via Android
    @terrytw 22.3 可以用 fw3 的。
    ftfunjth
        31
    ftfunjth  
       292 天前   ❤️ 1
    mangle 链的 PREROUTING 中的 ipse 规则 t 是一个很好的方案, 它可以让你免去对 forwarded 的 ip package routing 两次的开销(network card => lo => network card), 不加 ipset 情况下使用 TPROXY 的代理工具如 v2ray 分流,一定会多 routing 一次。
    ftfunjth
        32
    ftfunjth  
       292 天前
    @Lentin 会多路由一次
    ftfunjth
        33
    ftfunjth  
       292 天前
    建议对 mangle 链的 OUTPUT 也加上分流国内 ip 的 ipset 规则。
    shamburger
        34
    shamburger  
       292 天前   ❤️ 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  
       292 天前 via Android
    op 是给小白用的,楼主既然懂 Linux ,不如直接在 debian 中搭建一套,熟练了 10 几分钟就搭建完了,上面这需求就太简单了

    话说我就是这么干的,所有工具都是自己安装的,想装什么版本就装什么版本,多套方案随意切换
    Firxiao
        37
    Firxiao  
       291 天前   ❤️ 1
    @terrytw nftables 规则放在 /etc/nftables.d
    aliensb
        38
    aliensb  
       171 天前
    老哥,这个问题最后怎么解决的呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   845 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:39 · PVG 04:39 · LAX 12:39 · JFK 15:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.