华硕AC86U配置v2ray

华硕AC86U官方固件支持配置iptables, 因此不需要刷梅林或者其他所谓官改固件就能运行v2ray, 实现透明代理.

ssh登陆路由器

ssh <用户名>@router.asus.com

运行v2ray

  1. 下载v2ray
    cd /jffs/  # /jffs/是非易失性存储, 重启路由器不会有数据丢失
    mkdir v2ray
    cd v2ray/
    wget https://github.com/v2fly/v2ray-core/releases/download/v4.45.2/v2ray-android-arm64-v8a.zip -O v2ray.zip # 一定要下载arm版本
    unzip v2ray.zip
    
  2. 下载增强版geosite
    wget https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat
    
  3. 修改v2ray配置文件
{
    "log": {
        "loglevel": "error"
    },
    "inbounds": [
        {
            "tag":"transparent",
            "port": 9999,
            "protocol": "dokodemo-door",
            "settings": {
                "network": "tcp",
                "followRedirect": true
            },
            "sniffing": {
                "enabled": true,
                "destOverride": ["http", "tls"]
            },
            "streamSettings": {
                "sockopt": {
                    "tproxy": "tproxy",
                    "mark": 255
                }
            }
        }
    ],
    "outbounds": [
        {
            "tag": "direct",
            "protocol": "freedom",
            "settings": {
                "domainStrategy": "AsIs"
            },
            "streamSettings": {
                "sockopt": {
                    "mark": 255
                }
            }
        },
        {
            "protocol": "vmess",
            "tag": "proxy",
            "settings": {
                "vnext": [ // 你的v2ray 配置
                ]
            },
        }
    ],
    "routing": {
        "domainStrategy": "AsIs",
        "domainMatcher": "mph", // 减小内存占用
        "rules": [
            { // 苹果相关流量走直连
                "type": "field",
                "domain": [ "geosite:apple", "geosite:apple-cn" ],
                "outboundTag": "direct"
            },
            { // 非中国网站走代理
                "type": "field",
                "domain": [ "geosite:geolocation-!cn" ],
                "outboundTag": "proxy"
            }
        ]
    }
}
  1. 启动v2ray
kill $(ps | grep /jffs/ | grep v2ray | awk '{ print $1 }') # 杀死正在运行的v2ray
nohup /jffs/v2ray/v2ray -c /jffs/v2ray/config.json >/dev/null 2>&1 & # 启动新的进程

至此, v2ray进程就已经在运行了. 接下来配置iptables, 使流量经过v2ray代理.

配置iptables, 让v2ray代理网络访问


modprobe xt_TPROXY # 系统加载透明代理模块(默认没有加载)

# 设置策略路由
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100

# 代理局域网设备
iptables -t mangle -N v2ray
iptables -t mangle -A v2ray -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A v2ray -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A v2ray -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A v2ray -d 192.168.0.0/16 -j RETURN # 直连局域网
iptables -t mangle -A v2ray -j RETURN -m mark --mark 0xff    # 直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数,数值上等同与上面v2ray 配置的 255),此规则目的是解决v2ray占用大量CPU(https://github.com/v2ray/v2ray-core/issues/2621)
iptables -t mangle -A v2ray -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 9999 --tproxy-mark 1 # 给 TCP 打标记 1,转发至 9999 端口
iptables -t mangle -A PREROUTING -j v2ray # 应用规则

如果一切顺利, v2ray已经开始代理流量了. 访问www.google.com试试.

可能遇到的坑

  1. v2ray启动时报错: fatal error: runtime: cannot allocate memory

    华硕ac86u的内存只有512MB, 因此如果v2ray配置的路由规则过多, 则会消耗掉所有内存, 甚至如上报错启动失败. 有两个解决办法:

    • 增加虚拟内存

    • 精简v2ray的路由规则(上面的配置只包含了两个路由规则, 实测没问题)

  2. iptables 报错: iptables: No chain/target/match by that name.

    华硕ac86u的固件包含了透明代理模块, 但是默认没有启用. 因此我们需要在配置iptables前先执行modprobe xt_TPROXY以启用. 模块的具体地址可执行find /lib/modules/$(uname -r) -type f -name '*.ko*' | grep 'xt_TPROXY'查看.