OpenWrt 搭建透明代理

openclash、shellclash 之类的方案感觉都太复杂了。我的需求只是给 chromecast 用上代理,并且在代理失效时不要影响局域网中的其他设备。所以想找一个简单的方案。

经过一番摸索,发现 Macvlan 很适合我,具体步骤如下:

  • 创建一个 macvlan 设备

    config device
            option type 'macvlan'
            option ifname 'br-lan'
            option mode 'bridge'
            option name 'br-lanmac0'
            option ipv6 '1'
    

    注意这里需要选择启用 ipv6,否则 br-lan 不会下发 RA,导致局域网内设备没有 v6 地址,具体原因还不清楚。

  • 创建一个接口绑定到这个设备

    config interface 'clash'
            option proto 'static'
            option device 'br-lanmac0'
            option ipaddr '192.168.2.2'
            option netmask '255.255.255.0'
            option gateway '192.168.2.1'
            option defaultroute '0'
    

    IP 地址分配一个在局域网段下的,网关填 lan 地址。注意关闭默认路由,否则会把 PPPoE 的路由给删了,导致局域网内设备连不上网,具体原因也不清楚。这个接口不需要任何路由规则。

  • 把这个接口添加到防火墙的 lan zone 中,否则 lan 发给该接口的包会被丢弃

  • 下载 mihomo (原 clash-meta)二进制,配置 tun 绑定到之前的设备上

    tun:
      enable: true
      stack: system
      auto-route: true
      auto-redirect: true
      include-interface:
      - br-lanmac0
    
  • 写入 init 脚本到 /etc/init.d/clash,以便开机自启

    #!/bin/sh /etc/rc.common
    
    START=99
    
    start() {        
            export HOME=/root
            nohup /root/clash/clash > /root/clash/log.txt &
            # commands to launch application
    }                 
    
    stop() {          
            # commands to kill application 
            killall clash
    }
    

    启用脚本 /etc/init.d/clash enable

  • 在需要代理的设备上指定网关为 192.168.2.2

然后,就没有然后了。它工作!具体为什么能工作呢,咱也不知道…


最后修改于 2024-11-24