更多>>关于我们
西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效获取互联网任何公开可见信息。
您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。
数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。
更多>>技术文章
近日我在查询Squid相关问题时无意在谷歌搜索结果中看到external_acl_type,然后详细了解了一下,发现它功能是在太强大了。
利用external_acl_type可以自定义一种Squid的ACL类型,并且可以指定一个自定义的后端程序(Helper Program)。我们可以向这个后端程序动态传递很多有用的参数,例如客户端IP (%SRC,) 服务端IP( %MYADDR),客户端访问的URL( %PATH),访问者的用户名( %LOGIN)等变量,然后在认证程序中我们可以根据这些变量实现复杂的逻辑认证。PS:我在网上找了很久都没找到介绍这些变量参数含义的,最后抱着试一试的想法在squid.conf的注释中找到的详细的说明(如下FORMAT specifications部分)。
# TAG: external_acl_type
# This option defines external acl classes using a helper program
# to look up the status
#
# external_acl_type name [options] FORMAT.. /path/to/helper [helper arguments..]
#
# Options:
#
# ttl=n TTL in seconds for cached results (defaults to 3600
# for 1 hour)
# negative_ttl=n
# TTL for cached negative lookups (default same
# as ttl)
# children-max=n
# Maximum number of acl helper processes spawned to service
# external acl lookups of this type. (default 20)
# children-startup=n
# Minimum number of acl helper processes to spawn during
# startup and reconfigure to service external acl lookups
# of this type. (default 0)
# children-idle=n
# Number of acl helper processes to keep ahead of traffic
# loads. Squid will spawn this many at once whenever load
# rises above the capabilities of existing processes.
# Up to the value of children-max. (default 1)
# concurrency=n concurrency level per process. Only used with helpers
# capable of processing more than one query at a time.
# cache=n limit the result cache size, default is unbounded.
# grace=n Percentage remaining of TTL where a refresh of a
# cached entry should be initiated without needing to
# wait for a new reply. (default is for no grace period)
# protocol=2.5 Compatibility mode for Squid-2.5 external acl helpers
# ipv4 / ipv6 IP protocol used to communicate with this helper.
# The default is to auto-detect IPv6 and use it when available.
#
# FORMAT specifications
#
# %LOGIN Authenticated user login name
# %EXT_USER Username from previous external acl
# %EXT_LOG Log details from previous external acl
# %EXT_TAG Tag from previous external acl
# %IDENT Ident user name
# %SRC Client IP
# %SRCPORT Client source port
# %URI Requested URI
# %DST Requested host
# %PROTO Requested protocol
# %PORT Requested port
# %PATH Requested URL path
# %METHOD Request method
# %MYADDR Squid interface address
# %MYPORT Squid http_port number
# %PATH Requested URL-path (including query-string if any)
# %USER_CERT SSL User certificate in PEM format
# %USER_CERTCHAIN SSL User certificate chain in PEM format
# %USER_CERT_xx SSL User certificate subject attribute xx
# %USER_CA_xx SSL User certificate issuer attribute xx
#
# %>{Header} HTTP request header "Header"
# %>{Hdr:member}
# HTTP request header "Hdr" list member "member"
# %>{Hdr:;member}
# HTTP request header list member using ; as
# list separator. ; can be any non-alphanumeric
# character.
#
# %<{Header} HTTP reply header "Header"
# %<{Hdr:member}
# HTTP reply header "Hdr" list member "member"
# %<{Hdr:;member}
# HTTP reply header list member using ; as
# list separator. ; can be any non-alphanumeric
# character.
#
# %ACL The name of the ACL being tested.
# %DATA The ACL arguments. If not used then any arguments
# is automatically added at the end of the line
# sent to the helper.
# NOTE: this will encode the arguments as one token,
# whereas the default will pass each separately.
#
# %% The percent sign. Useful for helpers which need
# an unchanging input format.
#
# In addition to the above, any string specified in the referencing
# acl will also be included in the helper request line, after the
# specified formats (see the "acl external" directive)
#
# The helper receives lines per the above format specification,
# and returns lines starting with OK or ERR indicating the validity
# of the request and optionally followed by additional keywords with
# more details.
#
# General result syntax:
#
# OK/ERR keyword=value ...
#
# Defined keywords:
#
# user= The users name (login)
# password= The users password (for login= cache_peer option)
# message= Message describing the reason. Available as %o
# in error pages
# tag= Apply a tag to a request (for both ERR and OK results)
# Only sets a tag, does not alter existing tags.
# log= String to be logged in access.log. Available as
# %ea in logformat specifications
#
# If protocol=3.0 (the default) then URL escaping is used to protect
# each value in both requests and responses.
#
# If using protocol=2.5 then all values need to be enclosed in quotes
# if they may contain whitespace, or the whitespace escaped using \.
# And quotes or \ characters within the keyword value must be \ escaped.
#
# When using the concurrency= option the protocol is changed by
# introducing a query channel tag infront of the request/response.
# The query channel tag is a number between 0 and concurrency-1.
#Default:
# none
配置示例:
下面这个配置结合了“用户名密码认证(HTTP Basic Auth)”和“自定义的认证”。只有同时通过这两个认证的请求才会被Squid放行(否则会返回403)。
external_acl_type自定义认证部分后端程序使用自己编写的Python脚本(后面有源码),并将%LOGIN(客户用户名),%SRC(客户端IP) ,%MYADDR(服务端IP)作为命令行参数传递给后端认证程序。
#用户名密码认证: auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/users.pwd auth_param basic children 5 auth_param basic realm IPRENT.CN Proxy Auth Required auth_param basic credentialsttl 2 hours #使用external_acl_type实现的自定义认证,后台程序 /etc/squid/squid_external_acl_helper.py #支持多种宏格式,上面帮助文档里面有列举。 #ipv4标记如果不加,可能会看到“external ACL 'ip_user_check' queue overload”异常(cache.log), >>> https://ubuntuforums.org/showthread.php?t=2187256 external_acl_type ip_user_check children-startup=5 ipv4 %LOGIN %SRC %MYADDR /usr/bin/python /etc/squid/squid_external_acl_helper.py acl ipuseracl external ip_user_check acl auth_users proxy_auth REQUIRED http_access allow auth_users ipuseracl
后台程序(Helper program)示例脚本(Python):
这里只写了一个框架(直接返回验证通过),没有加入实际性的逻辑判断,你可以根据传递进来的参数实现复杂的逻辑判断。
# coding: utf-8
# squid_external_acl_helper.py
# Author: redice(qi@site-digger.com)
# Created at: 2016-10-14
# Python版本的Squid external_acl_type扩展ACL后台脚本
# 在squid.conf中的"htcp_access deny all"之前加入如下配置:
#external_acl_type ip_user_check children-startup=5 ipv4 %LOGIN %SRC %MYADDR /usr/bin/python /etc/squid/squid_external_acl_helper.py
#acl ipuseracl external ip_user_check
#http_access allow ipuseracl
import sys
import logging
# 记录日志
# sudo chmod 755 /var/log/squid/squid_auth_helper.log
# sudo chown proxy:proxy /var/log/squid/squid_auth_helper.log
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
filename='/var/log/squid/squid_auth_helper.log', filemode='a')
if __name__ == '__main__':
while True:
# 从stdin读取一行
line = sys.stdin.readline()
username, client_ip, local_ip = line.split()
logging.info('New auth request: username = {}, client_ip = {}, local_ip = {}'.format(username, client_ip, local_ip))
# 这里直接输出'OK'(通过认证,反之输出'ERR\n')。你可以根据上述参数实现复杂的认证逻辑。
sys.stdout.write('OK\n')
sys.stdout.flush()
日志输出示例:
2016-10-14 12:29:11,968 INFO New auth request: username = test, client_ip = 103.27.125.250, local_ip = 58.96.184.54















