分类目录归档:折腾路由器

更新全局代理设置

折腾了好久,最后发现原来的方法不太对,还有v2fly的v2ray-core不好用,新的过程在下面,参考网址:https://xtls.github.io/document/level-2/tproxy_ipv4_and_ipv6.html

项目地址:https://xtls.github.io/

TProxy 透明代理(ipv4 and ipv6)配置教程

本配置参考了TProxy 透明代理的新 V2Ray 白话文教程open in new tag透明代理(TProxy)配置教程open in new tag以及透明代理通过 gid 规避 Xray 流量open in new tag,加入了透明代理对 ipv6 的支持,并且使用 VLESS-TCP-XTLS-RPRX-Vision 方案对抗封锁 (推荐使用 1.7.2 及之后版本)。

关于 Xray 的配置并不是本文重点,使用者可依实际情况进行修改,具体可以参考官方文档示例open in new tag或其他优秀示例 比如@chika0801open in new tag 又如@lxhao61open in new tag

注意

若使用其他配置,你需要着重注意客户端配置中 outbound 中tag 为 proxy 的部分,其他部分不变

服务端配置也要同时改变

此配置意在解决例如 Netflix 等默认使用 ipv6 连接的网站无法通过旁路由进行代理的问题,或对 ipv6 代理有需要。

本文网络结构为单臂旁路由

本文中所有配置已在 Arch Linux (Kernel: 6.0.10) 环境下测试成功,如在其它环境中同理

注意安装相应程序 # sudo apt install iptables ip6tables 或 # sudo apt install nftables

若旁路由未安装 xray 程序,可以手动下载相应 xray 程序如 Xray-linux-64.zipopen in new tag ,然后复制 install-release.shopen in new tag 文件到旁路由,赋予可执行权限 # chmod 700 install-release.sh,然后使用 # ./install-release.sh --local Xray-linux-64.zip 根据提示进行本地安装。

Xray 配置

客户端配置

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "all-in",
      "port": 12345,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls", "quic"]
      },
      "streamSettings": {
        "sockopt": {
          "tproxy": "tproxy"
        }
      }
    },
    {
      "port": 10808,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls", "quic"]
      },
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      //此为默认outbound,路由(routing)模块若未匹配到任何规则,则默认走此 proxy 出口,如果你希望直连国内优先请将下面 direct 出口放到 outbound 第一,看不懂可忽略
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "yourdomain.domain", //改为你自己的域名,直接填写ipv4或ipv6地址也可以
            "port": 443,
            "users": [
              {
                "id": "uuid", //填写uuid,可通过在终端中输入 xray uuid 生成;此处也支持任意字符串(https://xtls.github.io/config/inbounds/vless.html#clientobject)
                "encryption": "none",
                "flow": "xtls-rprx-vision"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "sockopt": {
          "mark": 255
        },
        "network": "tcp",
        "security": "tls", //注意使用 xtls-rprx-vision 流控此处需为 tls
        "tlsSettings": {
          //注意使用 xtls-rprx-vision 流控此处需为 tlsSettings
          "allowInsecure": false,
          "serverName": "yourdomain.domain", //改为你自己的域名
          "fingerprint": "chrome" //此设置建议先看下Release, https://github.com/XTLS/Xray-core/releases/tag/v1.7.3
        }
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIP"
      },
      "streamSettings": {
        "sockopt": {
          "mark": 255
        }
      }
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      }
    },
    {
      "tag": "dns-out",
      "protocol": "dns",
      "streamSettings": {
        "sockopt": {
          "mark": 255
        }
      }
    }
  ],
  "dns": {
    "hosts": {
      "domain:googleapis.cn": "googleapis.com",
      "dns.google": "8.8.8.8",
      "你的VPS域名": "你的VSP IP" //如果 outbound 的 proxy 里 address 填的域名:希望代理走ipv4,这里 VPS IP 填VPS的ipv4, 希望代理走ipv6,这里VPS IP 填VPS的ipv6;outbound 的 proxy 里 address 填的 IP,这行不用写。
    },
    "servers": [
      "https://1.1.1.1/dns-query",
      {
        "address": "119.29.29.29",
        "domains": ["geosite:cn"],
        "expectIPs": ["geoip:cn"]
      },
      "https://dns.google/dns-query",
      "223.5.5.5",
      "localhost"
    ]
  },
  "routing": {
    "domainMatcher": "mph",
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["geosite:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "inboundTag": ["all-in"],
        "port": 123,
        "network": "udp",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "inboundTag": ["all-in"],
        "port": 53,
        "network": "udp",
        "outboundTag": "dns-out"
      },
      {
        "type": "field",
        "ip": ["119.29.29.29", "223.5.5.5"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "protocol": ["bittorrent"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private", "geoip:cn"], //此处可加入 VPS IP 避免 ssh 时被代理
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["1.1.1.1", "8.8.8.8"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": [
          "geosite:geolocation-!cn",
          "domain:googleapis.cn",
          "dns.google"
        ],
        "outboundTag": "proxy"
      }
    ]
  }
}

服务端配置

{
  "log": {
    "loglevel": "warning"
  },
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        //阻止 cnip 提高安全性,或者可以将 cn 流量导入 warp 中,详见https://xtls.github.io/document/level-2/warp.html
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "block"
      }
    ]
  },
  "inbounds": [
    {
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "uuid", //与客户端相同
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "dest": 8080 //回落,需要 web 配合,参见白话文,不设置也行
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "certificates": [
            {
              "certificateFile": "/etc/ssl/private/fullchain.crt",
              "keyFile": "/etc/ssl/private/crt.key" //参照小小白话文将生成的 fullchain.crt 以及 cert.key证书的路径相应填于此处(https://xtls.github.io/document/level-0/ch06-certificates.html#_6-4-%E6%AD%A3%E5%BC%8F%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7)
            }
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

Netfilter 配置

首先设置策略路由

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

# 设置策略路由 v6
ip -6 rule add fwmark 1 table 106
ip -6 route add local ::/0 dev lo table 106

# 直连从主路由发出
ip route add default via 192.168.31.1 #写主路由 ipv4, 采用局域网设备上网设置方法一可不写此命令
ip -6 route add default via fd00:6868:6868::1 #写主路由 ipv6, 采用局域网设备上网设置方法一可不写此命令

使用方法

直接将命令复制到旁路由终端执行

关于直连从主路由发出

在旁路由使用命令ip route show,如果使用下属方法一,则default via后应是主路由 ip,无需更改;如使用下述方法二,则default via后应是旁路由 ip,此时直连网站 DNS 解析会回环,造成直连网站无法访问,因此需指定为主路由 ip。

如果是在路由器上指定了默认网关为旁路由(亦即下述“局域网设备上网设置方法二”),那么就需要设置上述 # 直连从主路由发出 ,除了通过 iproute2 命令行方式设置,也可以通过 dhcpcd 或者 systemctl-network 设置静态 IP,这里以 dhcpcd 为例,编辑 /etc/dhcpcd.conf 文件,在最下方加入如下配置,具体 IP 根据你的实际情况修改,其中 interface 可以通过 # ip link show 查看要设定的网口或者无线设备。

interface enp0s25
static ip_address=192.168.31.100/24
static ip6_address=fd00:6868:6868::8888/64
static routers=192.168.31.1
static domain_name_servers=192.168.31.1 fd00:6868:6868::1

这样通过静态 IP 设置 IP 及网关后就无需每次开机设置 # 直连从主路由发出

注意

以下 nftables 配置与 iptables 配置二选一,不可同时使用。

使用 iptables

此处配置将 ipv4 与 ipv6 写在同一文件中。

# 代理局域网设备 v4
iptables -t mangle -N XRAY
iptables -t mangle -A XRAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p tcp -j RETURN
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A XRAY -j RETURN -m mark --mark 0xff
iptables -t mangle -A XRAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j XRAY

# 代理局域网设备 v6
ip6tables -t mangle -N XRAY6
ip6tables -t mangle -A XRAY6 -d ::1/128 -j RETURN
ip6tables -t mangle -A XRAY6 -d fe80::/10 -j RETURN
ip6tables -t mangle -A XRAY6 -d fd00::/8 -p tcp -j RETURN
ip6tables -t mangle -A XRAY6 -d fd00::/8 -p udp ! --dport 53 -j RETURN
ip6tables -t mangle -A XRAY6 -j RETURN -m mark --mark 0xff
ip6tables -t mangle -A XRAY6 -p udp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
ip6tables -t mangle -A XRAY6 -p tcp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
ip6tables -t mangle -A PREROUTING -j XRAY6

# 代理网关本机 v4
iptables -t mangle -N XRAY_MASK
iptables -t mangle -A XRAY_MASK -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A XRAY_MASK -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A XRAY_MASK -d 192.168.0.0/16 -p tcp -j RETURN
iptables -t mangle -A XRAY_MASK -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A XRAY_MASK -j RETURN -m mark --mark 0xff
iptables -t mangle -A XRAY_MASK -p udp -j MARK --set-mark 1
iptables -t mangle -A XRAY_MASK -p tcp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -j XRAY_MASK

# 代理网关本机 v6
ip6tables -t mangle -N XRAY6_MASK
ip6tables -t mangle -A XRAY6_MASK -d fe80::/10 -j RETURN
ip6tables -t mangle -A XRAY6_MASK -d fd00::/8 -p tcp -j RETURN
ip6tables -t mangle -A XRAY6_MASK -d fd00::/8 -p udp ! --dport 53 -j RETURN
ip6tables -t mangle -A XRAY6_MASK -j RETURN -m mark --mark 0xff
ip6tables -t mangle -A XRAY6_MASK -p udp -j MARK --set-mark 1
ip6tables -t mangle -A XRAY6_MASK -p tcp -j MARK --set-mark 1
ip6tables -t mangle -A OUTPUT -j XRAY6_MASK

# 新建 DIVERT 规则,避免已有连接的包二次通过 TPROXY,理论上有一定的性能提升 v4
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT

# 新建 DIVERT 规则,避免已有连接的包二次通过 TPROXY,理论上有一定的性能提升 v6
ip6tables -t mangle -N DIVERT
ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT

使用方法

将上述配置写入一个文件(如 iptables.rules),之后将该文件赋予可执行权限# chmod 700 ./iptables.rules

最后使用 root 权限执行该文件即可:# ./iptables.rules# source iptables.rules

使用 nftables

此处合并 ipv4 与 ipv6

#!/usr/sbin/nft -f

flush ruleset

table inet xray {
        chain prerouting {
                type filter hook prerouting priority filter; policy accept;
                ip daddr { 127.0.0.0/8, 224.0.0.0/4, 255.255.255.255 } return
                meta l4proto tcp ip daddr 192.168.0.0/16 return
                ip daddr 192.168.0.0/16 udp dport != 53 return
                ip6 daddr { ::1, fe80::/10 } return
                meta l4proto tcp ip6 daddr fd00::/8 return
                ip6 daddr fd00::/8 udp dport != 53 return
                meta mark 0x000000ff return
                meta l4proto { tcp, udp } meta mark set 0x00000001 tproxy ip to 127.0.0.1:12345 accept
                meta l4proto { tcp, udp } meta mark set 0x00000001 tproxy ip6 to [::1]:12345 accept
        }

        chain output {
                type route hook output priority filter; policy accept;
                ip daddr { 127.0.0.0/8, 224.0.0.0/4, 255.255.255.255 } return
                meta l4proto tcp ip daddr 192.168.0.0/16 return
                ip daddr 192.168.0.0/16 udp dport != 53 return
                ip6 daddr { ::1, fe80::/10 } return
                meta l4proto tcp ip6 daddr fd00::/8 return
                ip6 daddr fd00::/8 udp dport != 53 return
                meta mark 0x000000ff return
                meta l4proto { tcp, udp } meta mark set 0x00000001 accept
        }

        chain divert {
                type filter hook prerouting priority mangle; policy accept;
                meta l4proto tcp socket transparent 1 meta mark set 0x00000001 accept
        }
}

使用方法

将上述配置写入一个文件(如 nftables.rules),之后将该文件赋予可执行权限# chmod 700 ./nftables.rules

最后使用 root 权限执行该文件即可:# ./nftables.rules# source nftables.rules

其中,网关地址192.168.0.0/16fd00::/8等可由ip address | grep -w inet | awk '{print $2}'以及ip address | grep -w inet6 | awk '{print $2}'获得open in new tag

或者在 windows 网络设置中查看。

又或者在路由器“上网设置”中查看。

如果前缀192.168fd00:相同可不更改,若不同如 fc00:fe00: 等则更改为相应值,写法可通过 Goolge 搜索得到如 fc00::/7fe00::/9

开机自动运行 Netfilter 配置

首先确认已经运行过上述相应 Netfilter 命令,并且成功测试透明代理配置,以确保接下来输出正确的文件。

若使用 iptables 配置

  1. 首先通过 # iptables-save > /root/iptables.rulesv4 # ip6tables-save > /root/iptables.rulesv6 将 iptables 配置写入 iptables.rulesv4 和 iptables.rulesv6 文件中
  2. 然后在 /etc/systemd/system/ 目录下创建一个名为 tproxyrules.service 的文件,添加以下内容并保存
[Unit]
Description=Tproxy rules

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; \
/sbin/ip -6 rule add fwmark 1 table 106 ; \
/sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route add local ::/0 dev lo table 106 ; \
/sbin/ip route add default via 192.168.31.1 ; \
/sbin/ip -6 route add default via fd00:6868:6868::1 ; \
/sbin/iptables-restore /root/iptables.rulesv4 ; \
/sbin/ip6tables-restore /root/iptables.rulesv6
ExecStop=/sbin/ip rule del fwmark 1 table 100 ; \
/sbin/ip -6 rule del fwmark 1 table 106 ; \
/sbin/ip route del local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route del local ::/0 dev lo table 106 ; \
/sbin/ip route del default via 192.168.31.1 ; \
/sbin/ip -6 route del default via fd00:6868:6868::1 ; \
/sbin/iptables -t mangle -F ; \
/sbin/ip6tables -t mangle -F

[Install]
WantedBy=multi-user.target
  1. 最后执行 systemctl enable tproxyrules 命令。

如果使用 nftables 配置

  1. 首先通过 # nft list ruleset > /root/nftables.rulesv46 将 nftables 配置写入 nftables.rulesv46 文件中
  2. 在 /etc/systemd/system/ 目录下创建一个名为 tproxyrules.service 的文件,然后添加以下内容并保存
[Unit]
Description=Tproxy rules

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; \
/sbin/ip -6 rule add fwmark 1 table 106 ; \
/sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route add local ::/0 dev lo table 106 ; \
/sbin/ip route add default via 192.168.31.1 ; \
/sbin/ip -6 route add default via fd00:6868:6868::1 ; \
/sbin/nft -f /root/nftables.rulesv46 ;
ExecStop=/sbin/ip rule del fwmark 1 table 100 ; \
/sbin/ip -6 rule del fwmark 1 table 106 ; \
/sbin/ip route del local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route del local ::/0 dev lo table 106 ; \
/sbin/ip route del default via 192.168.31.1 ; \
/sbin/ip -6 route del default via fd00:6868:6868::1 ; \
/sbin/nft flush ruleset

[Install]
WantedBy=multi-user.target
  1. 最后执行 systemctl enable tproxyrules 命令。

tproxyrules.service

注意其中主路由器 IP 地址,根据实际修改

ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;' 命令为确保获得 IP 地址后再执行命令,否则会诡异报错,其中 IP 地址为主路由器地址,根据实际修改。

注意

如果通过 dhcpcd 等设置了静态 IP 及网关,则上述相关 ip route add/del 设置需删除

局域网设备上网设置

此处假定旁路由 ipv4, ipv6 地址分别为192.168.31.100fd00:6868:6868::8866, 旁路由的 ipv4, ipv6 地址可由命令ip add获得。

方法一

局域网设备上网有两种方式,第一种就是在使用设备上进行静态 IP 的配置,将网关指向旁路由 IP。注意绝大部分手机仅支持手动配置 ipv4 网关,不支持手动配置 ipv6 网关,除非 root 后进行相关设置。

以 windows 设备为例,可以先开启 DHCP 记录自动分配的 IP 以参考,然后手写静态配置。

DNS 设置

此配置劫持 DNS 流量,DNS 可以随便写

建议设置为旁路由 IP,防止 DNS 泄露

image
image

方法二

局域网设备上网的第二种方式,是在路由器上进行网关设置,这种方法对于连接到此路由器的设备无需做任何设置即可科学上网,但注意有些路由器不支持 ipv6 的网关设置,有 ipv6 需求的设备仍需在所需设备上单独手动配置 ipv6 相关设置参考方法一。

image

Finally

按照以上方法设置后设备即可双栈访问,进入测试网站比如 https://ipv6-test.com/ 可以看到如下结果 (需要代理此网站才能看到如下结果)

image

写在最后

如今 ipv6 并未完全普及,我们日常访问的流量 99%仍为 ipv4 流量;很多 VPS 商家虽然提供 ipv6 地址,但线路优化非常垃圾,甚至处于不可用状态,为何要加入 ipV6 的设置?

可以看到目前 ipv6 处于很尴尬的境地,各种设备对于 ipv6 的支持很烂,但是都在逐步完善,同时 Windows 系统对于 ipv6 的优先级也在提高,很多浏览器也会优先进行 ipv6 的解析以及访问,很多网站也开始默认使用 ipv6 进行访问(比如 Netflix, 如果没有配置 ipv6, 浏览器打开 Netflix 会显示 Not Available 是因为没有代理 Netflix 的 ipv6 请求,当然可以选择禁用 Windows 的 ipv6,但支持 ipv6 的 pt 站就无法使用)

这种情况下 ipv4 无法完全胜任网络冲浪的需求,即使是那 1%的流量,遇到了也会让人头疼不已。

而可以预见 ipv6 也会逐步与 ipv4 分庭抗礼,所以有必要加入 ipv6 的设置。

华硕路由器官版固件自动执行自定义脚本的方法

以前开放的华硕路由器官版固件开机自动执行脚本的很多方法,目前已经失效。根据网上搜索和自己实践的情况看,目前只有利用usb_mount时候的钩子自动执行脚本还可以用,前提是插一个U盘在路由器上。

开启U盘装载自动执行脚本方法如下:

nvram set script_usbmount="sh /jffs/init.sh"
nvram commit

其中/jffs/init.sh是需要自动执行的脚本,例如:

#!/bin/sh
sed -i '$a192.168.3.123 myhost' /etc/hosts

#不能通过重启服务的方式,因为会还原hosts文件,只能kill
killall -SIGHUP dnsmasq

树莓派配置V2ray客户端及透明网关

透明网关搭建

v2搭建及测试

安装v2

  1. 官方一键脚本1
    sudo bash <(curl -L -s https://install.direct/go.sh)
  2. 下载脚本安装,其实与第1种方法一样
    wget https://install.direct/go.sh
    sudo chmod +x go.sh
    sudo bash go.sh
  3. 离线安装,在网络不佳或不合适的情况下使用本地安装在第2步中下载 go.sh 同时在v2ray-core-releases下载 v2ray-linux-arm.zip ,如果树莓派中网络不佳可以在自己的PC机下载完之后迁移文件到树莓派中。
    wget -O v2ray_install.sh https://install.direct/go.sh
    chmod +x v2ray_install.sh
    sudo ./v2ray_install.sh –local v2ray-linux-arm.zip
    配置v2
  4. 后续操作默认切换到 root 权限下,填写v2的配置json。
    sudo su root
    cat > /etc/v2ray/config.json << EOF
    {
    “log”: {
    “loglevel”: “warning”
    },
    “inbounds”: [
    {
    “tag”: “proxy”,
    “port”: 1090, // 监听端口
    “listen”: “127.0.0.1”,
    “protocol”: “socks”, // 入口协议为 SOCKS 5
    “sniffing”: {
    “enabled”: true,
    “destOverride”: [
    “http”,
    “tls”
    ]
    },
    “settings”: {
    “auth”: “noauth”, //socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
    “udp”: true
    },
    “streamSettings”: null
    }
    ],
    “outbounds”: [
    {
    “tag”: “proxy”,
    “protocol”: “vmess”, // 出口协议
    “settings”: {
    “vnext”: [
    {
    “address”: “server.com”, // 服务器地址,请修改为你自己的服务器 IP 或域名
    “port”: 10010, // 服务器端口
    “users”: [
    {
    “id”: “b831381d-6324-4d53-ad4f-8cda48b30811”, // 用户 ID,必须与服务器端配置相同
    “alterId”: 32 // 此处的值也应当与服务器相同
    }
    ]
    }
    ]
    }
    }
    ]
    }
    EOF
    对上述配置中的protocol以及vnext 下的 address 、 port 、 id 、 alterId 进行修改,这是必须修改的内容,其含义可参照注释,其他内容可不改变,如果懂得配置的话可以自行修改其余内容。
  5. 开启v2服务下面命令中以 # 开头为注释内容。
    systemctl start v2ray
    # 或使用 service v2ray start
    ps -ef|grep v2ray
    # 或使用 service v2ray status
    正常情况下,v2已经开始运行,查看状态结果如下图。
    v2正常运行配置
    v2正常运行状态

全局代理及测试

  1. 配置全局代理编译安装 ProxyChains-NG 进行全局代理设置。
    git clone https://github.com/rofl0r/proxychains-ng.git
    cd /home/pi/proxychains-ng/
    ./configure && make && make install

    # 设置及修改配置
    cp ./src/proxychains.conf /etc/proxychains.conf
    vim /etc/proxychains.conf
    proxychains.conf配置文件的最后部分内容做以下修改:1
    2
    – socks4 127.0.0.1 9050
    + socks5 127.0.0.1 1090
  2. 测试v2通过 IP 以及 HTTP 响应码测试 v2 是否搭建成功。
    # 返回未代理前的本地公网地址
    curl ip.sb
    # 返回代理过的v2服务器地址,表示搭建成功,若长时间无响应或返回非服务端 IP 地址的内容则表示搭建失败
    proxychains4 curl ip.sb
    # 返回 200 或 301 表示搭建成功,若返回 000 或长时间无反应则表示搭建失败
    proxychains4 curl -so /dev/null -w “%{http_code}” google.com -x socks5://127.0.0.1:1090

透明网关搭建

V2配置透明代理的入站和DNS分流

将以下配置内容覆盖原先的v2配置内容,即修改 /etc/v2ray/config.json 下的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
{
“inbounds”: [
{
“tag”:”transparent”,
“port”: 12345,
“protocol”: “dokodemo-door”,
“settings”: {
“network”: “tcp,udp”,
“followRedirect”: true
},
“sniffing”: {
“enabled”: true,
“destOverride”: [
“http”,
“tls”
]
},
“streamSettings”: {
“sockopt”: {
“tproxy”: “tproxy” // 透明代理使用 TPROXY 方式
}
}
},
{
“port”: 1090,
“protocol”: “socks”, // 入口协议为 SOCKS 5
“sniffing”: {
“enabled”: true,
“destOverride”: [“http”, “tls”]
},
“settings”: {
“auth”: “noauth”
}
}
],
“outbounds”: [
{
“tag”: “proxy”,
“protocol”: “vmess”, // 代理服务器
“settings”: {
“vnext”: [
{
“address”: “server.com”, // 服务器地址,请修改为你自己的服务器 IP 或域名
“port”: 10010, // 服务器端口
“users”: [
{
“id”: “b831381d-6324-4d53-ad4f-8cda48b30811”, // 用户 ID,必须与服务器端配置相同
“alterId”: 32 // 此处的值也应当与服务器相同
}
]
},
“streamSettings”: {
“sockopt”: {
“mark”: 255
}
},
“mux”: {
“enabled”: true
}
},
{
“tag”: “direct”,
“protocol”: “freedom”,
“settings”: {
“domainStrategy”: “UseIP”
},
“streamSettings”: {
“sockopt”: {
“mark”: 255
}
}
},
{
“tag”: “block”,
“protocol”: “blackhole”,
“settings”: {
“response”: {
“type”: “http”
}
}
},
{
“tag”: “dns-out”,
“protocol”: “dns”,
“streamSettings”: {
“sockopt”: {
“mark”: 255
}
}
}
],
“dns”: {
“servers”: [
“8.8.8.8”, // 非中中国大陆域名使用 Google 的 DNS
“1.1.1.1”, // 非中中国大陆域名使用 Cloudflare 的 DNS(备用)
“114.114.114.114”, // 114 的 DNS (备用)
{
“address”: “223.5.5.5”, //中国大陆域名使用阿里的 DNS
“port”: 53,
“domains”: [
“geosite:cn”,
“ntp.org”, // NTP 服务器
“$myserver.address” // 此处改为你 VPS 的域名
]
}
]
},
“routing”: {
“domainStrategy”: “IPOnDemand”,
“rules”: [
{ // 劫持 53 端口 UDP 流量,使用 V2Ray 的 DNS
“type”: “field”,
“inboundTag”: [
“transparent”
],
“port”: 53,
“network”: “udp”,
“outboundTag”: “dns-out”
},
{
// 直连 123 端口 UDP 流量(NTP 协议)
“type”: “field”,
“inboundTag”: [
“transparent”
],
“port”: 123,
“network”: “udp”,
“outboundTag”: “direct”
},
{
“type”: “field”,
“ip”: [
// 设置 DNS 配置中的国内 DNS 服务器地址直连,以达到 DNS 分流目的
“223.5.5.5”,
“114.114.114.114”
],
“outboundTag”: “direct”
},
{
“type”: “field”,
“ip”: [
// 设置 DNS 配置中的国内 DNS 服务器地址走代理,以达到 DNS 分流目的
“8.8.8.8”,
“1.1.1.1”
],
“outboundTag”: “proxy” // 改为你自己代理的出站 tag
},
{
// 广告拦截
“type”: “field”,
“domain”: [
“geosite:category-ads-all”
],
“outboundTag”: “block”
},
{
// BT 流量直连
“type”: “field”,
“protocol”:[“bittorrent”],
“outboundTag”: “direct”
},
{
// 直连中国大陆主流网站 ip 和 保留 ip
“type”: “field”,
“ip”: [
“geoip:private”,
“geoip:cn”
],
“outboundTag”: “direct”
},
{
// 直连中国大陆主流网站域名
“type”: “field”,
“domain”: [
“geosite:cn”
],
“outboundTag”: “direct”
}
]
}
}

同样的,对上述配置中的protocol以及 vnext 下的 address 、 port 、 id 、 alterId 进行修改,这是必须修改的内容,其含义可参照注释,其他内容可不改变,如果懂得配置的话可以自行修改其余内容。

配置透明代理规则

本文使用方法是tproxy,同时保证树莓派和其他客户端均能实现科学上网。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 设置策略路由
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
# 直连局域网,避免 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,转发至 12345 端口
iptables -t mangle -A V2RAY -p udp -j TPROXY –on-port 12345 –tproxy-mark 1
# 给 TCP 打标记 1,转发至 12345 端口
iptables -t mangle -A V2RAY -p tcp -j TPROXY –on-port 12345 –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

设置开机服务自启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mkdir -p /etc/iptables && iptables-save > /etc/iptables/rules.v4

# /etc/systemd/system/ 目录下创建一个名为 tproxyrule.service 的文件,写入以下内容
[Unit]
Description=Tproxy rule
After=network.target
Wants=network.target

[Service]

Type=oneshot

#注意分号前后要有空格
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; /sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; /sbin/iptables-restore /etc/iptables/rules.v4

[Install]
WantedBy=multi-user.target

# 执行以下命令完成开机自启
systemctl enable tproxyrule

注意事项

  1. 下载离线版v2时如果树莓派安装的是官方镜像系统则按照文中方法,如果自行安装了64位系统则需要下载 v2ray-linux-arm64.zip
  2. v2的客户端代理端口有点区别,就是socks下和HTTP下是相差一个数的,具体可自行体会;
  3. 配置文件中需要注意树莓派所在网段以及本地代理地址。

结束

树莓派的使用还有许多可待拓展,本文只是介绍了目前最新的将树莓派作为透明网关的配置方法。

参考网址:

https://linwhitehat.github.io/Blog/2020/03/24/%E7%8E%A9%E8%BD%AC%E6%A0%91%E8%8E%93%E6%B4%BE%EF%BC%88%E4%BA%8C%EF%BC%89.html

https://toutyrater.github.io/app/tproxy.html

AC86U官版固件安装vlmcsd KMS服务

 1.开启jffs和ssh(或telnet),登陆路由器管理界面,通过系统管理-系统设置开启jffs和ssh。

2.通过官方下载vlmcsd可执行文件(官方提供源码及一堆各环境下的编译好的可执行文件,有兴趣可以自己编译)https://github.com/Wind4/vlmcsd/releases/。
       3.上传vlmcsd可执行文件到路由器/
          mips架构的路由器使用/binaries/Linux/mips/little-endian/static/vlmcsd-mips32el-uclibc-static
          AC86U使用这个:arm架构的路由器使用/binaries/Linux/armlittle-endian/static/vlmcsd-armv7el-uclibc-static
          将文件重命名为vlmcsd,通过xftp,winscp等工具上传到路由器/jffs目录下
  4.通过ssh或telnet连接路由器
          赋予vlmcsd可执行权限
          chmod 700 vlmcsd
          启动vlmcsd
          /jffs/vlmcsd

          使用命令netstat -an |grep 1688 检查vlmcsd是否启动成功。

5.修改/jffs/scripts/nat-start,增加vlmcsd,实现自动运行。

6.增加dns解析,添加srv记录到/jffs/configs/dnsmasq.conf.add。  

输入命令
       echo “srv-host=_vlmcs._tcp,router,1688”>>/jffs/configs/dnsmasq.conf.add
  其中 _vlmcs._tcp 为服务名;router为路由在内网中的网络名称(可通过uname –n查看);1688为kms激活服务默认端口号;
       输入命令service restart_dnsmasq重启dnsmasq服务。

组建AiMesh分布式WiFi网络

新房子装修的时候有一个严重失误,就是没有预埋足够的网线,特别是卧室没有布线,导致主卧WiFi信息极差,曾经搞过多种方案,什么电力猫、WiFi中继这些,效果都不太理想。自从把工作了多年的Netgera WNDR4300(已刷Openwrt)换成华硕的86U,就在琢磨华硕的AiMesh,不知道这种分布式网络能不能解决家里的WiFi覆盖问题。开始考虑降低成本,再加一个66U B1,后来看Lyra Trio织女星挺不错,京东上两个套装也不到1千,效果肯定比一个66U强,而且外观挺漂亮,索性搞一套试试。

AiMesh组网网上有不少文章可以参考,不过一般都是普通路由器的组合,还少有像86U这样的路由器和织女星这类原本设计的分布式路由器组合的,所以有些操作需要摸索一下。总体来说过程不算太复杂,也没有走啥弯路,和用普通路由器组Mesh差不多,只是需要注意几点:

  1. 一开始按照织女星的说明进行初始化,将织女星的WAN口接到路由器上,模式选DHCP,完成后自动升级固件到382版本,然后可以加入后续节点。这不是我需要的模式,我是要把织女星加入到已有的AiMesh中,这样我又到86U里面,进入AiMesh里面搜索,但怎么也搜索不到。查了一下说明,看到了这篇https://www.asus.com/support/FAQ/1038071,里面说要重置后才能加入,于是重置了织女星,发现仍然无法搜索到。然后注意到,文章里面说织女星要384以后的版本才支持AiMesh,而自动升级的固件才382,难道是这个原因?既然自动升级不行,手动升级一下吧。果然,升级完成后再次重置,这次很快就搜到了,然后加入就可以啦。
  2. 按照华硕官方给的操作步骤,略显繁琐。其实要升级固件,完全不用完成织女星的初始化,不需要在Asus Lyra App里面进行操作。在新的织女星启动完成,白灯常亮以后,直接用电脑连接织女星的WiFi,然后在浏览器里输入router.asus.com/Main_Login.asp进入登录页面,首先会让你设置管理员密码,设置完成后会进入路由器管理界面,直接在完成固件升级即可。后续就和官方文档里面的一样啦。
  3. Lyra APP在织女星加入AiMesh后就不能用了,不过可以用Asus Router APP来查看。

AiMesh组建完成后,从实际使用效果来看,主卧的台式机下载能超过100Mbps, 比以前的几种方案效果都要好一些,应该说还是有效果的,而且手机在几个房间漫游也能无缝切换,总的来说基本满意。

开启路由器IPv6

IPv6其实发布很久啦,只是实际上网的时候用的还是少。好像去年开始,发现手机上网的时候,有的App会提示使用的是IPv6。这几天在折腾路由器,就在想既然手机都能用IPv6啦,那宽带应该也可以吧。以前主路由器用的OpenWRT的,默认开启了IPv6,但那个WAN6始终处于未联机状态。这次换了华为的86U,是支持IPv6的,只是没有开启。打开IPv6配置页面,好多模式,不知道该用哪个,也没有详细说明,上网查了一下,有的说用Native加PPP,有的又说用Passthrough加局域网,只好一个个试。

结果几个组合都试完还是不行,然后再到网上查,发现一篇文章里面说了,需要在光猫里面配置一下才行。重点就是IP模式要改成“IPv4&IPv6”。需要注意的是,配置这些参数需要进入维护界面,需要使用隐藏超级用户才行,我的路由器上用户名是useradmin,密码是nE7jA%5m,或者参考http://www.52asus.com/thread-12939-1-1.html

配完之后,openwrt路由器的WAN6立马激活了,86U经过测试,下面的组合是有效的。

然后到https://test-ipv6.com/测试一下就知道成没成啦。