旁路由配置明细

1,717 阅读4分钟

效果

终端只需要修改网关就可以实现访问外网

前置说明

阅读本文需要有Linux,网络,和V2配置基础。

环境介绍:只要是个Linux系统就行,用PC,各种派,虚拟机都行。

硬件:树莓派4b

系统:Ubuntu Server 20.04 LTS

拓扑图

  • 路由器负责PPPoE拨号,光猫是桥接模式(非必须配置)
  • PC-1 就是常规的网络配置
  • 树莓派网络配置和PC-1看似一样。它的ip是240
  • PC-2和手机 网关指定的是240,它们可以上外网

旁路由配置

在Ubuntu Server上

1 配置常规网络

如ip为240,网关是路由器,这时它可以正常上网

2 配置转发Ubuntu Server

在sysctl启用

net.ipv4.ip_forward=1

net.ipv6.conf.all.forwarding=1

安装网络上的说法把其他网络设备网关改为240就可以上网了,可是实际测试不行还需要再加上一个nat配置

iptables -t nat -I POSTROUTING -j MASQUERADE

这时PC-2和手机就可以正常上网了

但是也发现一个问题:就是Ubuntu Server本身DNS异常,经排查 禁用本地DNS服务

systemctl disable systemd-resolved

并确保本地DNS指定正确后解决

3 测试&小结

  • 测试PC-2,手机,树莓派都可正常上网。当然外网还是不行
  • 其中PC-1和树莓派上网是直接走路由,而PC-2和手机是经树莓派转发后到路由

以上没有问题后再往下看

V2加持

Ubuntu Server会把指向自己的流量无脑转发给路由器。

可是如果它对流量进行分流后 再对部分流量加密 转发至不同的地址。

就可实现高级特效。

先口盾讲解

  1. Ubuntu Server 接收到流量由自身iptables的 PREROUTINGmangle表 转发至本地某端口 比如3080
  2. 本地v2进程listen 3080接受流量,由inbounds里的 dokodemo-door协议接收,并且sniffing嗅探出域名
  3. v2r的路由模块根据域名进行分流转发至相应的 outbounds出口,outbounds有2个,direct直连 和 proxy代理 以下为具体配置

iptables

# 设置策略路由 匹配mark1的流量 将这些流量转到回环接口
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100

# 代理局域网设备
# 在mangle表中新建V2RAY chain。在iptables中mangle表特性为可以给流量打标签 以便分流
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
# 直连局域网,避免 V2Ray 无法启动时无法连网关的 SSH,如果你配置的是其他网段(如 10.x.x.x 等),则修改成自己的
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p tcp -j RETURN
# 直连局域网,53 端口除外,因为要使用V2Ray的dns
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
# 给 UDP 打标记 1,转发至 3080 端口
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 3080 --tproxy-mark 1
# 给 TCP 打标记 1,转发至 3080 端口
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 3080 --tproxy-mark 1
# 应用规则
iptables -t mangle -A PREROUTING -j V2RAY


#### 不启用代理本机
## 代理网关本机
#iptables -t mangle -N V2RAY_MASK
#iptables -t mangle -A V2RAY_MASK -d 224.0.0.0/4 -j RETURN
#iptables -t mangle -A V2RAY_MASK -d 255.255.255.255/32 -j RETURN
## 直连局域网
#iptables -t mangle -A V2RAY_MASK -d 192.168.0.0/16 -p tcp -j RETURN
## 直连局域网,53 端口除外(因为要使用 V2Ray 的 DNS)
#iptables -t mangle -A V2RAY_MASK -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
## 直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数,数值上等同与上面V2Ray 配置的 255),此规则目的是避免代理本机(网关)流量出现回环问题
#iptables -t mangle -A V2RAY_MASK -j RETURN -m mark --mark 0xff
## 给 UDP 打标记, 重路由
#iptables -t mangle -A V2RAY_MASK -p udp -j MARK --set-mark 1
## 给 TCP 打标记,重路由
#iptables -t mangle -A V2RAY_MASK -p tcp -j MARK --set-mark 1
## 应用规则
#iptables -t mangle -A OUTPUT -j V2RAY_MASK

v2

{
  "inbounds": [
    {
      "tag": "door",
      "port": 3080,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "streamSettings": {
        "sockopt": {
          "tproxy": "tproxy"
        }
      }
    },
    {
      "tag": "lan",
      "port": 2080,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "streamSettings": {
        "sockopt": {
          "mark": 255
        }
      }
    },
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
            // 自己的配置
        ]
      },
      "streamSettings": {
        "sockopt": {
          "mark": 255
        }
      },
      "mux": {
        "enabled": true
      }
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "settings": {
      "rules": [
        {
          "type": "field",
          "inboundTag": [
            "lan"
          ],
          "outboundTag": "proxy"
        },
        {
          "type": "field",
          "domain": [
            "ext:dlc.dat:direct",
            "ipip.net"
          ],
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "domain": [
            "ext:dlc.dat:proxy",
            "google.com",
            "speedtest.net",
            "amazonaws.com"
          ],
          "outboundTag": "proxy"
        },
        {
          "type": "field",
          "ip": [
            "geoip:private",
            "geoip:cn",
            "223.5.5.5"
          ],
          "outboundTag": "direct"
        }
      ]
    }
  },
  "dns": {
    "servers": [
      "8.8.8.8",
      {
        "address": "223.5.5.5",
        "port": 53,
        "domains": [
          "geosite:cn",
          "ntp.org"
        ]
      }
    ]
  }
  //"log": {
  //  "access": "/tmp/v2ray_access.log",
  //  "error": "/tmp/v2ray_access.log",
  //  "loglevel": "debug"
  //}
}

v2配置讲解

  • inbounds[0] dokodemo-door 是核心入口 端口是3080
  • inbound[1] socks 是方便有些有些app继续使用socks5代理
  • outbounds[0] freedom 是直连出口,第一个是默认出口,也就是说默认直连
  • outbounds[1] vmess(其他协议也可以) 是代理出口
  • routing.domainStrategy 使用了AsIs ,仅域名匹配 简单 快。
  • routing.settings.rules[0] 规定从socks5来的流量走代理
  • routing.settings.rules[1] 匹配到列表内域名后走直连
  • routing.settings.rules[2] 匹配到列表内域名后走代理
  • routing.settings.rules[2] 的 ext:dlc.dat:proxy 写法为外置域名文件,dlc.dat文件下载地址和生成规则见 github.com/WillGhost/p…

测试

这时拓扑图中架构已完成