MENU

【歪门邪道】在宿舍使用Openwrt路由器实现V2Ray透明代理

December 9, 2018 • 瞎折腾

今天一晚上尝试了一下给宿舍的wifi做了透明代理。历经千辛万苦终于成功了,因此我决定将这个经历分享出来,说不定能帮到一些人。

准备

我这里使用的是二手的LinkSys的WRT1200AC路由器,刷入了目前最新的18.06.1版本的OpenWRT固件。这里推荐使用WRT系列的高性能路由器,像是TPLink或其他性能较弱的机型,可能无法流畅运行V2Ray。

另外你还需要一个对应版本的V2Ray预编译。我这款路由器的SoC是ARMv7的,因此下载ARM版本的,使用其中ARMv7的编译版本,可能性能会有一些优化的吧。

另外的另外,也是重中之重,你需要有一个可用的V2Ray服务器。

客户端配置

Screen

首先安装Screen,它能够让V2Ray在后台运行。安装命令如下:

opkg update && opkg install screen

V2Ray配置

这是我使用的配置文件。其中只有任意门的入站路由部分的设置比较重要。任意门入站是必须的,它接收iptables转发来的流量,而路由部分则决定这些流量该走哪里。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [{
    "port": 1080,
    "listen": "0.0.0.0",
    "tag": "socks-inbound",
    "protocol": "socks",

    "settings": {
      "auth": "noauth",
      "udp": false,
      "ip": "127.0.0.1"
    }
  },{
        "domainOverride": ["tls","http"],
             "port": 10086,
             "protocol": "dokodemo-door",
             "settings": {
                 "network": "tcp",
                 "followRedirect": true
             },
             "tag":"door"
  }],

  "outbounds": [{
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "【服务器地址】",
          "port": 【服务器端口】,
          "users": [
            {
              "id": "【UUID】",
              "alterId": 【alterId】,
              "security": "auto",
              "level": 0
            }
          ]
        }
      ]
    },
    "tag": "server"
  },  
  {
    "protocol": "freedom",
    "settings": {},
    "tag": "direct"
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],

  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [
        {
            "type": "field",
            "outboundTag": "direct",
            "domain": ["geosite:cn"] 
        },
        {
            "type": "chinaip",
            "outboundTag": "direct",
            "ip": [
                "geoip:cn",
                "geoip:private"
            ]
      }
    ]
},

  "dns": {
    "hosts": {},
    "servers": [
      "8.8.8.8",
      "1.1.1.1",
      "9.9.9.9",
      "localhost"
    ]
  }
}

需要注意的是出站设置中的第一个元素是主出站设置,即路由规则之外的流量自动走server这个出站,即走代理。只有当匹配到是国内的网站或服务器时才直连。

为了让v2ray开机自动运行,在/etc/rc.local的最后一个exit前面插入下一行:

sleep 10 && screen -dmS v2ray 【v2ray路径】/v2ray -config 【v2ray设置路径】/config.json

其中sleep是为了等待路由器连上外网。

iptables

这里使用iptable进行转发流量的操作。配置如下:

iptables -t nat -N V2RAY
iptables -t nat -A V2RAY -d 【你的服务器ip】 -j RETURN
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 10086
iptables -t nat -A PREROUTING -p tcp -j V2RAY

这里需要注意的是第二行。避免对你的服务器ip也进行转发,这样就会形成一个循环,可能的后果包括网速极慢或压根没法翻墙。

检验

重启路由器看看效果即可。记得关掉你电脑上的翻墙软件。

用户端

我在测试时遇到一个问题:DNS污染。即便已经搭建了一个翻墙的系统,但是在看youtube时被提示DNS服务器无法解析youtube.com的IP地址。因此我的解决方案是让路由器内建一个DNS服务器,利用SecDNS或其他方式转发或查询正确的DNS解析结果。这里推荐的DNS服务器有谷歌的8.8.8.8,IBM的9.9.9.9,还有刚刚知道的1.1.1.1

小结

我在尝试的时候整体都挺顺利的,唯独卡在了Iptables的转发上。一开始参考了kiri大佬的文章,结果发现并不起作用,遂去网上现学iptables。找到了这篇文章,iptables那部分基本上就是照这个来的。总之好歹是弄好了,而且效果差不多还不错,就发出来了。一方面是分享,一方面是存作备忘吧。


知识共享许可协议
【歪门邪道】在宿舍使用Openwrt路由器实现V2Ray透明代理天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code