centos 6或7 squid 代理服务器搭建

一、简介

代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。

Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid 发出一个申请,要Squid 代替其进行下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid 把保存的备份立即传给用户,使用户觉得速度相当快。Squid 可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且Squid 可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。

  1.1 工作流程

  当代理服务器中客户端需要的数据时:

    a. 客户端向代理服务器发送数据请求;

    b. 代理服务器检查自己的数据缓存;

    c. 代理服务器在缓存中找到了用户想要的数据,取出数据;

    d. 代理服务器将从缓存中取得的数据返回给客户端。

  当代理服务器中没有客户端需要的数据时:

    1. 客户端向代理服务器发送数据请求;

    2. 代理服务器检查自己的数据缓存;

    3. 代理服务器在缓存中没有找到用户想要的数据;

    4. 代理服务器向Internet 上的远端服务器发送数据请求;

    5. 远端服务器响应,返回相应的数据;

    6. 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。

  Squid代理服务器工作在TCP/IP的应用层。

Squid

  1.2 Squid 分类

  按照代理类型的不同,可以将Squid 代理分为正向代理和反向代理,正向代理中,根据实现方式的不同,又可以分为普通代理和透明代理。

    • 普通代理:需要客户机在浏览器中指定代理服务器的地址、端口;
    • 透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,代理服务器需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理;
    • 反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

 

二、普通代理搭建

  1、操作系统: centos 6.10

  2、squid 服务器公网IP:123.123.123.5            

  3、客户端IP:110.11.3.0/24

  4、实验拓扑图如下:

  

 

 

5、安装

  a、关闭防火前 和 selinux、httpd

  b、开启内核路由转发功能

    #vim /etc/sysctl.conf  

      修改为: net.ipv4.ip_forward = 1

    # sysctl -p

  c、安装squid 包

    # yum install squid -y

  d、生成密码文件,用于squid代理的web认证 (如果不需要认证,此步骤无需操作

    # yum install httpd-tools -y

    # sudo htpasswd -bc /etc/squid/passwords 用户名 密码

    # sudo chmod o+r /etc/squid/passwords

  e、编辑配置文件

    # vim /etc/squid/squid.conf 

#设置允许被代理的网段的ACL
acl test src 110.11.3.0/24 ( test:客户端IP组名称,参数:all  允许全部:acl test src all)

# 以下三行用于认证
centos6:auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwords 
centos7:auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords     
auth_param basic realm proxy  
acl authenticated proxy_auth REQUIRED

#用于配置高匿()      
request_header_access Via deny all
request_header_access X-Forwarded-For deny all

#开启https代理
http_access allow CONNECT !SSL_ports   #将deny 改为allow

#开启ACL代理,或密码认证代理
http_access allow  test
http_access allow authenticated

#设置服务端口(默认端口3128)
http_port 3128   

#配置多IP模式
acl random11 random 1/11
acl random10 random 1/10
acl random9 random 1/9
acl random8 random 1/8
acl random7 random 1/7
acl random6 random 1/6
acl random5 random 1/5
acl random4 random 1/4
acl random3 random 1/3
acl random2 random 1/2
acl random1 random 1/1
tcp_outgoing_address 服务器IP_11 random11
tcp_outgoing_address 服务器IP_10 random10
tcp_outgoing_address 服务器IP_9 random9
tcp_outgoing_address 服务器IP_8 random8
tcp_outgoing_address 服务器IP_7 random7
tcp_outgoing_address 服务器IP_6 random6
tcp_outgoing_address 服务器IP_5 random5
tcp_outgoing_address 服务器IP_4 random4
tcp_outgoing_address 服务器IP_3 random3
tcp_outgoing_address 服务器IP_2 random2
tcp_outgoing_address 服务器IP_1 random1

#设置日志输出格式(日志默认路径:/var/log/squid/)
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %<A

#可以删除和注销一些无用配置
1、默认自带的ACL
2、注销一下行
    #http_access allow localhost manager
    #http_access deny manager
    #http_access deny to_localhost

  f、监测配置及初始化服务   (Centos7 不需要执行此步骤

       # squid -k check

       # squid -z

 

    g、启动服务并开机自启动

      # service squid restart    (Centos 6)     # systemctl restart squid  (Centos 7)  

      #  chkconfig squid on     (Centos 6)          # systemctl enable squid  (Centos 7) 

 

三、客户端测试     

1、浏览器测试

  打开浏览器(以IE为例,其他类似),菜单栏 -> 工具 -> Internet 选项 -> 连接 -> 局域网设置 -> 代理服务器,按照以下格式设置。

      

 

     浏览器访问:http://httpbin.org/get

 

 

 

2、代码测试多IP代理是否成功:

import requests     #pip install requests
import time

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
        }

proxies={
        'http':'x.x.x.x:3128',
        'https':'x.x.x.x:3128',
}

for i in range(10):
        print(i)
        try:
                response = requests.get('http://httpbin.org/get',proxies=proxies,headers=headers)
                print(response.text)
        except requests.exceptions.ConnectionError as e:
                print('Error',e.args)
        time.sleep(10)

 

posted @ 2020-01-16 17:31  语~默  阅读(103)  评论(0编辑  收藏  举报