zoukankan      html  css  js  c++  java
  • squid实现web代理



    一、背景

    当存在一个网站W,电脑A可以访问,但你现在使用的电脑B不可访问时,可以在A上搭建一个web代理,这样B就能访问W了

    为什么选择squid ?

    • 安装相对简单

    • 支持访问控制,身份认证,限制能访问的域名,限制发起请求的IP等等

    如果只是web需求,相比之下,搭建那V个P什N么、v2[emm]ray之类的就太麻烦了

    五大开源 Web 代理服务器横评:Squid、Privoxy、Varnish、Polipo、Tinyproxy



    二、安装

    2.1 yum安装

    • 优点:方便快捷,安装后就是服务,可以用systemctl管理

    • 缺点:不安全,版本较低,centos7是3.5,这是很老的版本了。squid老版本存在缓冲区溢出命令执行、整数溢出等,具体可以去查CVE。开放公网的话还是编译安装最新版吧,这玩意你浏览器直接访问代理IP+端口,就能拿到版本...http头部也有

    yum install squid

    如后续需设置通过用户密码认证来连接代理,那么需要检查是否有 htpasswd

    htpasswd

    没有的话需要安装 yum install httpd-tools



    2.2 编译安装

    • 优点:可以安装最新版本,相对安全

    • 缺点:编译慢,安装使用繁琐

    # 官网下载 http://www.squid-cache.org/Versions/
    wget http://www.squid-cache.org/Versions/v4/squid-4.15.tar.gz
    tar -zxvf squid-4.15.tar.gz
    cd squid-4.15
    ./configure
    make -j4  # 根据CPU线程数而定,提高编译速度
    make install
    



    三、配置

    3.1 基本配置

    编译安装的默认允许所有IP连接,yum安装似乎默认不开放公网,修改配置文件

    vi /etc/squid/squid.conf

    找到http_access deny all,改为 allow all 即可允许所有IP使用代理

    而编译安装的配置文件在 /usr/local/squid/etc/squid.conf

    二者找到 port 可以更改服务监听代理的端口

    3.2 高隐配置

    squid 默认是透明代理,也就是说你通过 squid 访问一个服务器,服务器知道你使用了代理,知道你代理的IP和你真实的IP或局域网出口的IP

    想要完全隐藏你的代理信息和真实信息,可以追加以下配置

    #
    # HTTP head X-Forwarded-For
    # http://www.squid-cache.org/Doc/config/forwarded_for/
    #
    forwarded_for delete
    
    #
    # HTTP head Via
    # http://www.squid-cache.org/Doc/config/via/
    #
    via off
    

    XFF用于代理时记录原始IP和每个代理服务器IP;via用来记录每个代理服务器的信息。关闭这两个请求头,代理信息就能被隐藏了。

    不过报文看起来还是和正常请求有区别的,那就是多了诸如 X-Cache 的缓存相关头,不过无太大影响

    暴力隐藏这些头可以参考 request_header_access 或是 reply_header_access,但是不推荐这样做,会影响功能的正常使用。



    3.3 密码认证

    首先生成密码文件

    yum安装htpasswd -cb /etc/squid/passwd [用户名] [密码] ,一定要放在 /etc/squid/ ,博主最开始放在 /root/ 下,结果后来连接时怎么输用户名都不对,浏览器中反复要我输入账号密码

    编译安装htpasswd -cb /usr/local/squid/etc/passwd [用户名] [密码]

    然后配置 squid ,修改配置文件,还是 http_access 那行,改为

    # yum安装:auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
    auth_param basic program /usr/local/squid/libexec/basic_ncsa_auth /usr/local/squid/etc/passwd
    auth_param basic children 5
    auth_param basic realm Squid Basic Authentication
    auth_param basic credentialsttl 20 minute
    acl auth_users proxy_auth REQUIRED
    http_access allow auth_users
    

    配置前需检查 basic_ncsa_auth 路径是否正确,也有可能在 /usr/lib/squid、lib64/squid3 之类的目录下,否则启动时报错:

    /usr/lib/squid/basic_ncsa_auth: (2) No such file or directory

    官方密码认证配置参考

    官方文档

    官方参数说明 鉴于centos默认安装是3.5



    四、使用

    4.1 服务端启动

    yum安装:

    # start stop restart status -l
    systemctl start squid
    # 开机自启
    systemctl enable squid
    # 日志
    vi /var/log/squid/access.log
    

    start失败就status -l,上面排了两个坑,再说我遇到过的其它情况

    起因是我不小心直接执行了 squid 命令,然后就运行起来了但我不知道,当我再start时最开始是报:Could not send signal 15 to process 6527: (13) Permission denied

    我发现后台有在跑一个 squid,stop没用就直接kill了,然后再start报:FATAL: Ipc::Mem::Segment::create failed to shm_open(/squid-cf__metadata.shm): (17) File exists

    遇事不决就重启,我直接reboot,解决了,听说删除 dev/shm/ 下的文件也能成功

    编译安装:

    首先你需要新建这两个文件才能启动

    touch /usr/local/squid/var/logs/cache.log
    # squid总以nobody用户运行,不更改文件权限无法写入
    chown nobody && chgrp nobody /usr/local/squid/var/logs/cache.log
    touch /usr/local/squid/var/logs/access.log
    chown nobody && chgrp nobody /usr/local/squid/var/logs/access.log
    

    使用方法:

    # 后台启动
    /usr/local/squid/sbin/squid -s
    # 查看是否运行
    ps -ef|grep squid|grep -v grep
    # 关闭
    ps -ef|grep squid|grep -v grep|cut -c 9-15|xargs kill -9
    

    几个没用的命令:

    -k check 听说能检查是否运行,实测无反应

    -k parse 听说能检查配置文件是否正确,实测好像不是这个作用

    -k shutdown 字面意思是停止服务,实测无用

    -k kill 能杀掉进程,但是杀得不干净

    最后给出我写的脚本,可以设置开机自启

    #!/bin/sh
    #chkconfig: 2345 61 31
    #description: squid
    
    DIR="/usr/local/squid"
    
    case "$1" in
    start)
    # 启动脚本内容
    $DIR/sbin/squid -s > $DIR/var/logs/service.log
        ;;
    stop)
    # 停止脚本内容
    ps -ef|grep squid|grep -v grep|grep -v $0|grep -v 'service.*squid'|cut -c 9-15|xargs kill -9
        ;;
    status)
    # 查看状态脚本内容
    PS1=`ps -ef|grep squid|grep -v grep|grep -v $0|grep -v 'service.*squid'`
    if [ -z "$PS1" ]
    then
        echo "squid is stopped!"
    else
        ps -ef|grep squid|grep -v grep|grep -v $0|grep -v 'service.*squid'
    fi
        ;;
    restart|force-reload)
    # 重启脚本内容
    $0 stop
    sleep 0.3
    $0 start
        ;;
    *)
    # 其它参数脚本内容
    echo $"Usage: $0 {start|stop|status|restart|force-reload}"
    
    # 结束case语句
    esac
    
    exit 0
    



    4.2客户端使用

    浏览器直接设置,推荐一个代理管理插件 SwitchyOmega

    curl 验证代理情况可以使用

    curl --proxy x.x.x.x:3128 --proxy-user admin:123456 http://mi.com

    用了一万年的baidu.com测网通没通......现在再也不用了



    五、传输安全

    使用浏览器F12查看网络,我们可以看到使用代理后,我们的账号密码是base64编码后传输的

    base64属于编码,不能称之为加密,解码就能出明文,这很不安全。如果你还访问加密做得不好的网站,那更不安全,容易被嗅探

    一般的搭配是使用 stunnel+squid ,stunnel负责加密传输中的数据,避免网络报文被嗅探,发生信息泄露等问题。缺点是stunnel是端到端传输,两端都需要安装应用,比较繁琐

    曾想用 nginx+squid 转发,nginx不仅可以做https加密,还能自定义页面和http头部,这样别人甚至不知道你开放的是squid服务端口

    不过nginx应用层似乎不能架在浏览器和squid之间,http和https要么做本机文件静态服务,要么做301 location转发

    nginx做ssl,介于应用层和传输层之间,这个和stunnel一样

    本人对nginx不太了解,传输安全这里也没找到合适方案

    不过好在squid受攻击的情况远不如ssh,我们可以这样查看squid被拦截访问的情况

    # 查看squid端口被直接访问的次数
    grep 'GET /' /usr/local/squid/var/logs/access.log -c
    # 查看使用squid代理但用户名或密码错误的次数
    grep TCP_DENIED /usr/local/squid/var/logs/access.log -c
    

    access.log的开头是时间戳,需要解析一下数值才能知道这条日志的时间,而且时间戳是带小数点的,小数点后是毫秒,有时可能需要去掉小数点才能解析,也可以不用小数点后面的数值



  • 相关阅读:
    LeetCode-079-单词搜索
    awk学习笔记
    Python实现排列组合算法
    python模拟登录人人
    Python的SQLite数据库使用方法
    C语言排序算法——插入排序算法
    C语言排序算法——简单选择排序算法
    C语言排序算法——冒泡排序算法
    Python学习——python的函数参数传递
    Python学习——实现secure copy功能
  • 原文地址:https://www.cnblogs.com/yunmuq/p/14858717.html
Copyright © 2011-2022 走看看