v2ray 梯子实现公司局域网全局自动匹配实现梯子

lance 2019-12-10 AM 2872℃ 12条

前言

这篇文章基于上两篇文章而成(SS 最佳的替代品,从 0 开始部署 v2ray 梯子(1)/ SS 最佳的替代品,从 0 开始部署 v2ray 梯子(2))
因为前段时间公司有几个外国友人来开会,问道:我怎么上不了 google 呀?我要查资料的呀。
后来因为临近公司搬家,没去管这事,现在公司搬完家了,着手搞这个连上公司无线网络后自动就能适配规则来实现梯子功能。


准备工作

在公司无线网络同网段下,接入一台 Centos7 系统的服务器(我这里用虚拟机代替,视之为 网关设备),IP 为 10.18.30.20


初步配置

网关设备上关闭 firewalld 和 selinux,安装 iptables,优化内核参数,校准时间等

[[email protected] ~]# yum -y install iptables-services
[[email protected] ~]# systemctl stop firewalld && systemctl disable firewalld && systemctl start iptables && systemctl enable iptables
[[email protected] ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[[email protected] ~]# cat >> /etc/security/limits.conf <<EOF
> * - nofile 65535
> * - nproc 65536
> EOF
[[email protected] ~]# sed -i 's#4096#65536#g' /etc/security/limits.d/20-nproc.conf
[[email protected] ~]# (crontab -l;echo '*/30 * * * * /usr/sbin/ntpdate ntp1.aliyun.com && /usr/sbin/hwclock -w') | crontab
[[email protected] ~]# echo '*/30 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com && /usr/sbin/hwclock -w' >> /etc/crontab
[[email protected] ~]# /usr/sbin/ntpdate ntp1.aliyun.com && /usr/sbin/hwclock -w
[[email protected] ~]# cat >> /etc/sysctl.conf <<EOF
> net.ipv4.ip_forward = 1
> net.ipv4.tcp_fin_timeout = 2
> net.ipv4.tcp_tw_reuse = 1
> net.ipv4.tcp_tw_recycle = 1
> net.ipv4.tcp_syncookies = 1
> net.ipv4.tcp_keepalive_time = 600
> net.ipv4.ip_local_port_range = 4000 65000
> net.ipv4.tcp_max_syn_backlog = 16384
> net.ipv4.tcp_max_tw_buckets = 36000
> net.ipv4.route.gc_timeout = 100
> net.ipv4.tcp_syn_retries = 1
> net.ipv4.tcp_synack_retries = 1
> net.core.somaxconn = 16384
> net.core.netdev_max_backlog = 16384
> net.ipv4.tcp_max_orphans = 16384
> net.netfilter.nf_conntrack_max = 25000000
> net.netfilter.nf_conntrack_tcp_timeout_established = 180
> net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
> net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
> EOF
[[email protected] ~]# sysctl -p >/dev/null 2>&1

根据 SS 最佳的替代品,从 0 开始部署 v2ray 梯子(2) 所配置好的客户端,导出配置文件待用

05003-guh67uwr0fc.png

54240-rxq7c0amhrl.png

56930-c6w3za8jt3.png

网关设备上安装 v2ray 客户端,同时把修改过的客户端配置文件内容粘贴进去并启动 v2ray 客户端

[[email protected] ~]# cd /usr/local/src/
[[email protected] src]# curl -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh && curl -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-dat-release.sh
[[email protected] src]# bash install-release.sh && bash install-dat-release.sh
[[email protected] src]# vim /usr/local/etc/v2ray/config.json
{
  "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, 
      "listen": "0.0.0.0",
      "protocol": "socks", // 入口协议为 SOCKS 5
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess", // 代理服务器
      "settings": {
        "vnext": [
          {
            "address": "www.itwordsweb.top", //把所有域名改成你自己的 v2ray 域名
            "port": 443,
            "users": [
              {
                "id": "XXXXXX", //改成你自己的 id
                "alterId": 64,
                "email": "[email protected]",
                "security": "aes-128-gcm"
              }
            ]
          }
        ]
      },
      "tag": "top",
      "streamSettings": {
        "sockopt": {
          "mark": 255
        },
        "wsSettings": {
          "path": "/top",
          "headers": {
            "Host": "www.itwordsweb.top"
          }
        },
        "quicSettings": {
          "key": "",
          "header": {
            "type": "none"
          },
          "security": "none"
        },
        "tlsSettings": {
          "allowInsecure": false,
          "alpn": ["http/1.1"],
          "serverName": "www.itwordsweb.top",
          "allowInsecureCiphers": false
        },
        "httpSettings": {
          "path": "/top", //改成你自己 path
          "host": ["www.itwordsweb.top"]
        },
        "kcpSettings": {
          "header": {
            "type": "none"
          },
          "mtu": 1350,
          "congestion": false,
          "tti": 20,
          "uplinkCapacity": 5,
          "writeBufferSize": 1,
          "readBufferSize": 1,
          "downlinkCapacity": 20
        },
        "tcpSettings": {
          "header": {
            "type": "none"
          }
        },
        "security": "tls",
        "network": "ws"
      }
    },
    {
      "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 服务器
          "www.itwordsweb.top" // 此处改为你的域名
        ]
      }
    ]
  },
  "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 分流目的
          "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"
      }
    ]
  }
}
[[email protected] src]# systemctl start v2ray

测试网关设备是否能用梯子,有以下内容返回,则说明网关设备能正常是用梯子了

[[email protected] src]# curl -x socks5://127.0.0.1:1080 google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

中期工作

重启网关设备并关闭 iptables

[[email protected] src]# init 6
[[email protected] ~]# systemctl stop iptables

在局域网内 PC 机配置 IP 地址信息,网关指向网关设备,看是否能正常上网

06639-zf5aod4kxjh.png

94361-dlqdlraxq3c.png

回到网关设备,开启网关设备 iptables 防火墙和配置 iptables 规则

[[email protected] ~]# cd /usr/local/src/
[[email protected] src]# vim Trroxy.sh
# 设置策略路由
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 10.18.30.0/24 -p tcp -j RETURN
# 直连局域网,避免 V2Ray 无法启动时无法连网关的 SSH,如果你配置的是其他网段(如 10.x.x.x 等),则修改成自己的
iptables -t mangle -A V2RAY -d 10.18.30.0/24 -p udp ! --dport 53 -j RETURN
# 直连局域网,53 端口除外(因为要使用 V2Ray 的 DNS)
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 10.18.30.0/24 -p tcp -j RETURN
# 直连局域网,避免 V2Ray 无法启动时无法连网关的 SSH,如果你配置的是其他网段(如 10.x.x.x 等),则修改成自己的
iptables -t mangle -A V2RAY_MASK -d 10.18.30.0/24 -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 打标记 1,转发至 12345 端口
iptables -t mangle -A V2RAY_MASK -p tcp -j MARK --set-mark 1
# 给 TCP 打标记 1,转发至 12345 端口
iptables -t mangle -A OUTPUT -j V2RAY_MASK
# 应用规则
[[email protected] src]# chmod 755 Trroxy.sh && bash Trroxy.sh
[[email protected] src]# iptables -nL -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
V2RAY      all  --  0.0.0.0/0            0.0.0.0/0           

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
V2RAY_MASK  all  --  0.0.0.0/0            0.0.0.0/0           

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain V2RAY (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            127.0.0.1           
RETURN     all  --  0.0.0.0/0            224.0.0.0/4         
RETURN     all  --  0.0.0.0/0            255.255.255.255     
RETURN     tcp  --  0.0.0.0/0            10.18.30.0/24       
RETURN     udp  --  0.0.0.0/0            10.18.30.0/24        udp dpt:!53
TPROXY     udp  --  0.0.0.0/0            0.0.0.0/0            TPROXY redirect 0.0.0.0:12345 mark 0x1/0xffffffff
TPROXY     tcp  --  0.0.0.0/0            0.0.0.0/0            TPROXY redirect 0.0.0.0:12345 mark 0x1/0xffffffff

Chain V2RAY_MASK (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            224.0.0.0/4         
RETURN     all  --  0.0.0.0/0            255.255.255.255     
RETURN     tcp  --  0.0.0.0/0            10.18.30.0/24       
RETURN     udp  --  0.0.0.0/0            10.18.30.0/24        udp dpt:!53
RETURN     all  --  0.0.0.0/0            0.0.0.0/0            mark match 0xff
MARK       udp  --  0.0.0.0/0            0.0.0.0/0            MARK set 0x1
MARK       tcp  --  0.0.0.0/0            0.0.0.0/0            MARK set 0x1
[[email protected] src]# service iptables save

后期工作

重启一下 v2ray 和 iptables

[[email protected] src]# systemctl restart v2ray && systemctl restart iptables.service

回到局域网内 PC 机测试是否可以正常使用梯子

85522-a3l39n2di0f.png

配置局域网 DHCP 服务器分配的网关为网关设备 IP 地址,使局域网内机器获取到的网关地址均为网关设备的 IP 地址

[[email protected] ~]# cat /etc/dhcp/dhcpd.conf
subnet 10.18.30.0 netmask 255.255.255.0 {
                range 10.18.30.11 10.18.30.199;
                option domain-name "wifi.cf.local";
                option routers 10.18.30.20;
}

局域网内设备先断网,再联网,从 DHCP 服务器中重新获取地址,会发现网关变成了网关设备的 IP 地址了
此时,就实现了局域网内全局自动使用梯子的需求啦~
至于如何判断哪些地址走梯子,哪些地址走普通线路,是通过你要访问的地址的 IP 来决定的,当你访问的地址的 IP 是国外 IP,就会自动走梯子,当你访问的地址的 IP 是国内 IP,就会走普通线路。


扩展

优化 v2ray 配置文件,避免出现 too many open files 问题

[[email protected] ~]# vim  /etc/systemd/system/v2ray.service
[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
[[email protected] ~]# systemctl daemon-reload && systemctl restart v2ray

参考资料

透明代理(TPROXY)
透明代理(REDIRECT)
安装 V2Ray
SS 最佳的替代品,从 0 开始部署 v2ray 梯子(1)
SS 最佳的替代品,从 0 开始部署 v2ray 梯子(2)


非特殊说明,本博所有文章均为博主原创。

觉得文章不错,打赏一点吧,1分也是爱😀

WeChat Pay

微信打赏

Alipay

支付宝打赏

评论啦~



已有 12 条评论


  1. LOkd
    LOkd

    真是郁闷,在v2ray透明网关使用socks5连接google正常,网关没开启iptables连接网关国内网络能连接,iptables规则配置了,然后启用iptables服务国内和国外网络都不能访问!透明网关和下一跳路由IP都能ping通。

    回复 2020-08-11 17:54
    1. lance
      lance 博主

      那么就是iptables规则没设置对

      回复 2020-08-11 18:18
      1. LOkd
        LOkd

        我系统是Centos 7,配置基本是按照你这来的,除了局域网IP地址修改成我自己的,也都重启过系统和服务,但是一开启iptables连baidu都不能访问!

        回复 2020-09-10 03:09
        1. lance
          lance 博主

          你要先确定你的v2ray已经配置好了

          回复 2020-09-10 19:54
          1. lance
            lance 博主

            service iptables save

            这个没执行?

            2020-09-13 20:04
          2. LOkd
            LOkd

            重启就会遇到这个问题,一般第一次手动输入配置基本一次就OK,但是运行几个小时重启就不行了,但是通过iptables -nL -t mangle命令看到规则还在,客户端能正常解析国内域名,但浏览器就是不能访问,问题就在于系统重启后iptables规则转发就出现问题!

            2020-09-12 01:03
          3. lance
            lance 博主

            看你的描述,没看出哪里有问题,最大的可能性问题是出现在iptables转发上,因为你第一次配置是成功了的,再看下到底是哪里的配置跟第一次的不一致

            2020-09-11 18:42
          4. LOkd
            LOkd

            V2ray绝对是配置好的,有一次是启动的v2ray和iptables服务,把网关设置成这个Centos7的IP,baidu和google都能访问,因是测试环境晚上我就关机了,第二天来一开机启动v2ray和iptables服务,baidu和google都不能访问了,Centos 7本机可以通过socks5访问google,只有关掉iptables baidu才能访问,所以问题还是出现iptables转发这块,后来我又重新按照你这教程重搭一遍,结果重启v2ray和iptables服务还是同样的问题访问不了!我这个主机网线是直连出口路由,想着用这主机作为旁路由使用,结果翻车了!

            2020-09-11 00:11
  2. Hyalincry
    Hyalincry

    烦死,一切走网页标题就叫我快回去[DOGE]

    回复 2020-03-02 23:07
    1. lance
      lance 博主

      哈哈

      回复 2020-03-04 01:37
  3. Eurus
    Eurus

    大神发越来越牛逼了

    回复 2019-12-10 02:15
    1. lance
      lance 博主

      承让承让

      回复 2019-12-10 18:19