openwrt软路由使用v2ray做透明代理简单教程

01 May 2021

1. 自己的云服务器的设置

根据服务器上运行的系统版本下载v2raycore,我用的是64位的centos7,直接下载的编译好的zip文件,由于系统不自带zip解压软件,用yum先下载了zip,下面上指令:

yum install -y zip unzip
curl -LO https://github.com/v2ray/v2ray-core/releases/download/v4.28.2/v2ray-linux-64.zip
unzip v2ray-linux-64.zip -d v2ray
cd v2ray
setsid ./v2ray --config=myconfig/config.json

curl -O 是将获取内容输出为文件,且文件名为源文件名称不变

curl -L 是获取重定向后的下载地址,不加此指令无法下载,详情请自行查询manpage

我这里为了简单使用了setsid作为后台运行的方法,实测比较稳定,我的理解是setsid是把程序进程挂载到进程id为1的超级进程上运行,用ps -ef查询可看到v2ray进程的ppid为1,直接启动的话是挂载到当前终端的进程下,终端退出运行程序的进程也会一同销毁,而这个超级进程是系统启动的第一个进程,很多驱动和系统服务也是挂载到这个进程上实现的后台运行

配置文件使用的是myconfig/config.json这个文件,这是一个v2ray文件夹下的相对路径,启动前请把配置自行写入config.json,官网都有不赘述

2. 路由器设定

为了方便,我使用的是预装好openwrt的路由器

路由器

首先使用lscpu或者查看/proc/cpuinfo文件来确定cpu型号和使用的指令集

我的cpu使用的是mips指令集,查了一下还有big和little两种版本(mips是big-endian的mips架构,mipsle是little-endian的mips架构,他们之间的区别就是内存中存放的数据的字节顺序相反,也就是把低位放在低地址还是高地址),对应预编译的版本中的mips和mipsle,经测试v2ray发布版本中预编译的mipsle这个版本是可以使用的

因为使用环境变量开启代理的方法一旦退出终端就会失效,所以实现透明代理最好的方法是通过iptables实现流量转发到v2ray客户端端口,我的路由器默认是开启ipv4转发的,如果不是请自行修改配置文件,具体步骤见扩展阅读

加入如下规则到防火墙的启动配置文件中,openwrt直接写到custom rules里面就可以

防火墙配置

防火墙配置

# v2ray-tcp
iptables -t nat -N V2RAY # Create a new chain called V2RAY
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN # Direct connection 192.168.0.0/16
iptables -t nat -A V2RAY -p tcp -j RETURN -m mark --mark 0xff # Directly connect SO_MARK to 0xff traffic (0xff is a hexadecimal number, numerically equivalent to 255), the purpose of this rule is to avoid proxy loopback with local (gateway) traffic
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345 # The rest of the traffic is forwarded to port 12345 (ie V2Ray)
iptables -t nat -A PREROUTING -p tcp -j V2RAY # Transparent proxy for other LAN devices
iptables -t nat -A OUTPUT -p tcp -j V2RAY # Transparent proxy for this machine
# v2ray-udp
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_MASK
iptables -t mangle -A V2RAY_MASK -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A V2RAY_MASK -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -p udp -j V2RAY_MASK

还得在v2ray配置文件里加入如下内容,省略部分为常规配置项目,我的配置是用v2rayN这款软件导出的这样比较方便

 {
  "routing": {...},
  "inbounds": [
    {
      ...
    },
    {
      "port": 12345, // The open port
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true // Need to be set as true to accept traffic from iptables
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      ...
      "streamSettings": {
        ...
        "sockopt": {
          "mark": 255  // Here is SO_MARK,used for iptables to recognise. Each outbound needs to configure; you can use other value other than 255 but it needs to be consistant as in iptables rules; if there are multiple outbounds, it is recommended that you set all SO_MARK value the same for all outbounds.
        }
      }
    }
    ...
  ]
}

由于路由器没有setsid所以我用了如下指令实现后台运行,为了方便可以写入系统启动配置文件/etc/rc.local

./v2ray --config=config.json &

扩展阅读:

  1. Linux 技巧:让进程在后台可靠运行的几种方法:https://www.linuxprobe.com/process-run-in-background.html
  2. LINUX PID 1 和 SYSTEMD:https://blog.csdn.net/weixin_36841920/article/details/79437754?utm_term=linux%E4%B8%ADPID%E4%B8%BA1%E7%9A%84%E8%BF%9B%E7%A8%8B&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-2-79437754&spm=3001.4430
  3. V2Ray Beginner’s Guide - Transparent Proxy:https://guide.v2fly.org/en_US/app/transparent_proxy.html#procedures
  4. Linux 让终端走代理的几种方法:https://zhuanlan.zhihu.com/p/46973701

如有侵权联系删除

创作不易,感谢支持

请选择支付方式
USD

比特币-打赏地址:

1DGiAzDacFRxewyos23C14cKcgD5LGZ5hK

狗币-打赏地址:

DRpHTcQXKcauPktjz9WMALST3Vnf5SviDs

以太坊-打赏地址:

0xd34447399c497337a61eccb29cc2ef3e0dad7d13

其他加密货币-打赏地址:

coming soon