内容纲要

前言

v2ray是一款模块化的代理工具,提供了诸多代理协议的支持,其中dokodemo-door协议配合iptables能够实现透明代理。

透明代理相对与非透明代理(如:sock5代理、http代理等)有诸多优势,但其配置过程较复杂,入门门槛较高。这篇博文是博主在自家软路由上配置透明代理的过程记录,如果你正在寻找这方面的成功案例,不妨往下看。

在开始之前,你需要一个能够正常工作的v2ray节点,可以是自建也可以是从机场主处购买。如何自建或购买v2ray节点不在本篇讨论范围内,博主稍后会推出相关博文。

此外,正如博文题目中提道的,一个运行OpenWrt系统的路由器是必须的。博主强烈建议你使用x86平台的软路由,其他平台的路由由于性能或者存储空间上的局限,并不一定能够给你提供完整舒适的爱国体验。

准备工作

该部分将指导你如何远程登录到路由器内并执行命令。如非特殊说明,下列{YOUR_ROUTER_IP}指代你的路由器IP地址,在实际操作时请用路由器IP地址替代。

  1. 如果你正在使用Linux操作系统
    你一定知道如何通过ssh工具连接到路由器:

    ssh [email protected]{YOUR_ROUTER_IP}
  2. 如果你正在使用MacOS操作系统
    请打开控制终端应用,并在应用中输入:

    ssh [email protected]{YOUR_ROUTER_IP}
  3. 如果你正在使用Windows操作系统
    请下载MobaXterm软件(或其他同类软件,如:Putty、xshell等)并安装。安装完成过后,打开MobaXterm并按快捷键{Ctrl}+{Shift}+{N}新建一个SSH会话。在Remote host中填入路由器的IP地址,勾选Specify username并填入同户名root:
    新建SSH会话
    点击Ok按钮后将会其实你输入路由器密码,注意输入密码时不会显示,输入完成后按Enter键进入路由器。

进入路由器后输入:

uname -m

查看路由器CPU的架构。比如,博主自家的软路由输入是这样的:

[email protected]:~# uname -m
x86_64
[email protected]:~#

v2ray的安装

首先,请前往v2ray在Github发行页面下载与你路由器操作系统与架构匹配的发行文件。对于OpenWrt来说,请选择v2ray-linux-{ARCH}.zip文件下载,其中{ARCH}为你路由器的CPU架构。

将下载的发行文件解压,将以下几个文件上传到路由器/tmp目录下:

  • v2ray:V2Ray 程序;
  • v2ctl:V2Ray 工具;
  • geoip.dat:IP 数据文件
  • geosite.dat:域名数据文件
    登录路由器并执行:

    mkdir -p /usr/bin/v2ray
    mv /tmp/v2ray /tmp/v2ctl /tmp/geoip.dat /tmp/geosite.dat /usr/bin/v2ray

    然后新建/etc/init.d/v2ray文件,该脚本用于开机启动v2ray服务,内容为:

    #!/bin/sh /etc/rc.common
    START=99
    STOP=10
    NAME=v2ray
    DAEMON=/usr/bin/v2ray/v2ray
    PIDFILE=/var/run/$NAME.pid
    DAEMON_OPTS="-config /etc/config/v2ray"
    start() {
        mkdir -p /var/log/v2ray
        ulimit -n 65536
        start-stop-daemon -S -q -p $PIDFILE -x $DAEMON -b -m -- $DAEMON_OPTS
    }
    stop() {
        start-stop-daemon -K -q -p $PIDFILE
        rm -f $PIDFILE
    }
    restart() {
        stop
        start
    }

    然后执行:

    chmod +x /etc/init.d/v2ray
    /etc/init.d/v2ray enable

    然后,开始准备v2ray的配置文件,配置文件将位于/etc/config/v2ray,我将给出一个配置文件模板,请根据你的v2ray节点信息做修改:

    {
    "inbounds":[
    {
      "protocol":"dokodemo-door",
      "port":1080,
      "settings":{
        "network":"tcp,udp",
        "followRedirect":true
      },
      "sniffing":{
        "enabled":true,
        "destOverride":[
          "http",
          "tls"
        ]
      },
      "streamSettings": {
        "sockopt": {
          "mark": 100,
          "tproxy": "tproxy"
        }
      }
    }
    ],
    "outbounds":[
    {
      "protocol":"vmess",
      "settings":{
        "vnext":[
          {
           ...
          }
        ]
      },
      "streamSettings":{
        "sockopt":{
          "mark":255
        }
      },
      "tag":"proxy"
    },
    {
      "protocol":"freedom",
      "settings":{ },
      "streamSettings": {
        "sockopt":{
          "mark":255
        }
      },
      "tag":"direct"
    },
    {
      "protocol": "blackhole",
      "settings":{},
      "tag": "adblock"
    }
    ],
    "routing":{
    "domainStrategy":"IPOnDemand",
    "settings":{
      "rules":[
        {
          "type":"field",
          "outboundTag":"direct",
          "domain": ["geosite:cn"]
        },
        {
           "type": "field",
           "outboundTag": "direct",
           "ip": [
             "geoip:cn",
             "geoip:private"
           ]
        },
        {
            "type": "field",
            "protocol":[
                "bittorrent"
            ],
            "outboundTag":"direct"
        }
      ]
    }
    }
    }

iptables及路由配置

首先,请确认路由器安装了iptables-mod-extrakmod-ipt-extra这两个包:

opkg update
opkg install iptables-mod-extra kmod-ipt-extra

打开/etc/firewall.user,在文件末尾添加:

iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -m addrtype --dst-type LOCAL,MULTICAST,BROADCAST -j RETURN
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 1080 --tproxy-mark 1
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 1080 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j V2RAY

打开/etc/config/network,在文件末尾添加:

config rule
        option mark '0x1'
        option lookup '100'

config route 'tproxy'
        option interface 'loopback'
        option target '0.0.0.0'
        option netmask '0.0.0.0'
        option table '100'
        option type 'local'

注意:
在重启前,再次确认iptables-mod-extrakmod-ipt-extra已经安装,请运行:

iptables -m addrtype -h

如果输出的末尾含有:

Address type match options:
 [!] --src-type type[,...]      Match source address type
 [!] --dst-type type[,...]      Match destination address type
     --limit-iface-in           Match only on the packet's incoming device
     --limit-iface-out          Match only on the packet's outgoing device

Valid types:
                                UNSPEC
                                UNICAST
                                LOCAL
                                BROADCAST
                                ANYCAST
                                MULTICAST
                                BLACKHOLE
                                UNREACHABLE
                                PROHIBIT
                                THROW
                                NAT
                                XRESOLVE

则证明已经安装。

如果上述两个软件包无法安装,请将/etc/firewall.user文件中的

iptables -t mangle -A V2RAY -m addrtype --dst-type LOCAL,MULTICAST,BROADCAST -j RETURN

替换为

iptables -t mangle -A V2RAY -d {YOU_ROUTER_IP}/32 -j RETURN
最后修改日期:2019年10月25日

留言

发表评论