hanxi / blog

涵曦的博客
https://blog.hanxi.cc
56 stars 5 forks source link

总结最近配置透明代理的问题 #25

Open hanxi opened 5 years ago

hanxi commented 5 years ago

1. 什么是透明代理?

百科上这样说的

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

2. 我想用透明代理实现什么需求?

让家里的设备自动走统一的代理配置,只要在一台机器上配置代理客户端。使用透明代理实现的话,局域网的其他想走自动代理的机器只需要把网关和DNS设置为代理机的ip即可,这一步可以在路由器的DHCP里自动设置。但是我实测失败了,原因可能是我选的方案奇葩,我选的方案是在docker 里面部署代理机,代理客户端选的 v2ray。

用的方案就是这个 https://github.com/lisaac/tproxy-gateway

遇到个 v2ray 的报错没有解决。

其实还有其他方案可以尝试,比如用虚拟机的这套方案 https://github.com/icymind/VRouter

我不想再搞一套虚拟机,因为我的需求只是为了让局域网的机器可以方便的配置自动代理,然后我就换了一种方案。

3. 自动代理 PAC?

局域网的机器如果直接设置代理为 v2ray 客户端的端口 8080,就会全部走代理了。为了不需要在每台机器上都配置 PAC,就需要再加一层代理了,可以用 Privoxy 搭建。

网络结构是这样的:

windows/linux/mac/android/ios 
    -> privoxy(192.168.2.2:8081)
    -> v2ray client(192.168.2.2:8080)
    -> v2ray server(xx.xx.com:443)

这样一来,局域网的机器只需要把代理配置为 192.168.2.2:8081 即可。

v2ray server 安装在自己买的 VPS 上,安装方法网上教材很多很多。

v2ray clientprivoxy 我是安装在 docker 里面。privoxy 的配置用的这个工具 zfl9/gfwlist2privoxy 把 gfwlist 转成 gfwlist.action 配置文件的。写了个脚本转完后重启 privoxy 容器,然后配置 crontab 自动每天做一次。

可以参考我的 docker-compose.yml 配置:

version: '2'

services:

    v2ray:
        image: v2ray/official
        restart: always
        container_name: v2ray
        ports:
            - "1080:1080"
            - "8080:8080"
        volumes:
            - ./data/v2ray:/etc/v2ray
        entrypoint:
            - v2ray
            - -config=/etc/v2ray/config.json

    privoxy:
        image: vimagick/privoxy
        restart: always
        container_name: privoxy
        ports:
            - "8081:8118"
        volumes:
            - ./data/privoxy/user.action:/etc/privoxy/user.action
        cap_add:
            - NET_ADMIN

PS: 如果想要配置带认证的代理,Privoxy 好像还不支持,可以考虑用 Squid 替代 Privoxy.

R1hug0 commented 4 years ago

v2ray client的config.json配置可以贴出来学习下吗,我client配不好

hanxi commented 4 years ago

我放弃 privoxy 的方法了,直接改用 v2ray 自带的国外ip走代理。

{
   "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "error"
  },
  "inbounds": [
    {
      "port": 8080,
      "listen": "0.0.0.0",
      "protocol": "http",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth",
        "udp": false
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "xxx.xxx.com",
            "port": 443,
            "users": [
              {
                "id": "xxxx-xxxxxxxxxxxxxxxxx",
                "level": 1,
                "alterId": 32
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
          "path": "/ws"
        }
      }
    },
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    }
  ],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [
      {
        "type": "field",
        "outboundTag": "direct",
        "domain": ["geosite:cn"]
      },
      {
        "type": "field",
        "outboundTag": "direct",
        "ip": [
          "geoip:cn",
          "geoip:private"
        ]
      }
    ]
  }
}