021 树莓派安装v2ray、透明代理、软路由 - llj2kh/studynote GitHub Wiki

树莓派安装v2ray、实现透明代理及软路由

[参考文献]
1 树莓派安装V2Ray代理
2 透明代理(TPROXY)
3 本人的《vtworay安装》

0. 前言

由于树莓派一般情况下是提供服务供其它终端进行访问。只安装v2ray,在其它浏览器访问时,可以指定代理为 树莓派地址及1080端口,即可浏览器访问。树莓派本机 curl 命令也可以用 -x 参数指定,如 curl www.google.com -x 127.0.0.1:1080
如果作为软路由,配置好转发后,可以在路由器 dhcp 设置里配置网关为 树莓派 地址。则连上该路由器的流量会通过树莓派,来访问外网,但速度很慢。
利用无线网卡开启热点,设备直接连接该热点,进行访问,还没测试,不知道速度如何。

1. 安装

按照文献3的方法进行安装,可以先下载对应的安装包(zip文件),和安装脚本。运行安装脚本,-l 指定安装文件。
go.sh -l v2ray-linux-arm71.zip

可以安装参考文献3中的在线生成配置工具,生成配置,也可按照参考文献2中的配置进行设置,以实现更好的功能。

此时,可以在浏览器中设置代理,即可。

2 透明网关(旁路由)设置

2.0 写在前面

应该利用hostapd dnsmasq设置无线网卡,使其成为一个热点。连在该热点的设备可以通过v2ray访问网络,连在主路由的设备可以直接访问网络。
如果设备都登录到主路由,但是在dhcp中设置网关为树莓派,使所有流量都经过树莓派,则网络慢的死。

2.1 开启IP转发

  • 需要开启IP转发才能作为网关
    执行 echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p 。执行后将出现 net.ipv4.ip_forward=1 的提示。需要root权限。

2.2 为 v2ray 配置透明代理的入站和DNS分流

按照参考文献2提供的配置进行设置即可。

{  
  "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": 1080,  
      "protocol": "socks", // 入口协议为 SOCKS 5  
      "sniffing": {  
        "enabled": true,  
        "destOverride": ["http", "tls"]  
      },  
      "settings": {  
        "auth": "noauth"  
      }  
    }  
  ],  
  "outbounds": [  
    {  
      "tag": "proxy",  
      "protocol": "vmess", // 代理服务器  
      "settings": {  
        "vnext": [  
          ...  
        ]  
      },  
      "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"  
      }  
    ]  
  }  
}  

2.3 配置iptables

按照参考文献2进行设置

# 设置策略路由  
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  
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p tcp -j RETURN # 直连局域网,避免 V2Ray 无法启动时无法连网关的 SSH,如果你配置的是其他网段(如 10.x.x.x 等),则修改成自己的  
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN # 直连局域网,53 端口除外(因为要使用 V2Ray 的  
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1 # 给 UDP 打标记 1,转发至 12345 端口  
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1 # 给 TCP 打标记 1,转发至 12345 端口  
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 # 直连局域网  
iptables -t mangle -A V2RAY_MASK -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN # 直连局域网,53 端口除外(因为要使用 V2Ray 的 DNS)  
iptables -t mangle -A V2RAY_MASK -j RETURN -m mark --mark 0xff    # 直连 SO_MARK 为 0xff 的流量(0xff 是 16 进制数,数值上等同与上面V2Ray 配置的 255),此规则目的是避免代理本机(网关)流量出现回环问题  
iptables -t mangle -A V2RAY_MASK -p udp -j MARK --set-mark 1   # 给 UDP 打标记,重路由  
iptables -t mangle -A V2RAY_MASK -p tcp -j MARK --set-mark 1   # 给 TCP 打标记,重路由  
iptables -t mangle -A OUTPUT -j V2RAY_MASK # 应用规则  

2.4 开机自动设置iptables

  • 由于 iptables 命令有点多,所以先将 iptables 规则保存到 /etc/iptables/rules.v4 中。
    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  
  • 执行下面的命令使 tproxyrule.service 可以开机自动运行。
    systemctl enable tproxyrule

3 解决 too many open files 问题

  • 对 UDP 透明代理比较容易出现”卡住“的情况,这个时候细心的朋友可能会发现日志中出现了非常多 "too many open files" 的语句,这主要是受到最大文件描述符数值的限制,把这个数值往大调就好了。设置步骤如下。
    修改 /etc/systemd/system/v2ray.service 文件,在 [Service] 下加入 LimitNPROC=500 和 LimitNOFILE=1000000,修改后的内容如下。
[Unit]  
Description=V2Ray Service  
After=network.target  
Wants=network.target  
  
[Service]  
# This service runs as root. You may consider to run it as another user for security concerns.  
# By uncommenting the following two lines, this service will run as user v2ray/v2ray.  
# More discussion at https://github.com/v2ray/v2ray-core/issues/1011  
# User=v2ray  
# Group=v2ray  
Type=simple  
PIDFile=/run/v2ray.pid  
ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json  
Restart=on-failure  
# Don't restart in the case of configuration error  
RestartPreventExitStatus=23  
LimitNPROC=500  
LimitNOFILE=1000000  
  
[Install]  
WantedBy=multi-user.target  
  • 执行 systemctl daemon-reload && systemctl restart v2ray 生效。

4 设定网关为静态IP

参考树莓派设置即可

5 设定DHCP

登录路由器,在路由器上设定 DHCP,将网关地址指向网关设备,在本文的举例中即为树莓派的IP 192.168.1.22; DNS 随意,因为已经配置了劫持 53 端口的 UDP,当然填常规的 DNS 也更是没有问题的。