因为某些需要(如苹果电视等)我在一台服务器上安装了一个http代理服务,在未设定用户认证的情况下运行了一段时间后,出现了 too many connections 错误,经排查日志发现代理被扫描并滥用了,有人拿这个http代理尝试注册垃圾账号等,还有爬虫用于爬取内容。为了防止服务器被投诉,有必要设定一些安全要求。
目前支持用户名/密码验证的http代理主要有squid,前端可以加https,https层可以做客户端证书认证,但是考虑到很多客户端没有这个功能,还是用标准认证(Basic Auth)为好。
另外,这个代理服务可能还会被用来做一些其他用途,且需要与原来的http代理兼容,而且只要充作转发,而非cache,考虑架构如下:
1,前端可以通过tls连接(这里不展开)
2,支持标准的用户名/密码认证,可用于各类设备
3,连接另一个(已有的)http代理,保证兼容性
4,其他功能
一、squid安装和配置
首先安装squid,这里不展开了,默认端口为3128,根据需要调整。
yum install squid
用户名/密码认证需要安装htpasswd,应是apache的一个组件,此处已经安装好了,没有的话好像需要安装。
yum install httpd-tools
创建密码文件,并创建一个用户:
htpasswd -c /etc/squid/passwords username #创建密码文件passwords,用户名为username
会提示输入密码,按照要求完成用户名和密码的创建。
如需创建多个用户,需要添加到已存在的密码文件后面,不能用-c覆盖原有密码文件
htpasswd /etc/squid/passwords username2 #创建另一个用户username2 htpasswd -d /etc/squid/passwords username2 #修改username2的密码 htpasswd -D /etc/squid/passwords username2 #删除username2
对squid默认配置文件进行修改。假设配置文件在
/etc/squid/squid.conf
修改以下内容(中文注释不需要),加入各种特性,可根据需要增减。
# Recommended minimum configuration: # # Example rule allowing access from your local networks. # Adapt to list your (internal) IP networks from where browsing # should be allowed #acl localnet src 10.0.0.0/8 # RFC1918 possible internal network #acl localnet src 172.16.0.0/12 # RFC1918 possible internal network #acl localnet src 192.168.0.0/16 # RFC1918 possible internal network #acl localnet src fc00::/7 # RFC 4193 local private network range #acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines #仅允许本地网络访问,此处根据需要设定,如需要从外网访问可不设置 acl SSL_ports port 443 acl Safe_ports port 80 # http #acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https #acl Safe_ports port 70 # gopher #acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports #acl Safe_ports port 280 # http-mgmt #acl Safe_ports port 488 # gss-http #acl Safe_ports port 591 # filemaker #acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT #允许访问的目的端口号,如果仅仅是用于网络访问的用途,可以禁用21等,只保留80,443 #另外有些app可能会使用一些高端口,如8080,8081等,需要打开1025-65535的动态端口范围。 #disable cache no_cache deny all #禁用cache,如果只是作为前端访问控制用途 # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports http_access deny !Safe_ports # Deny CONNECT to other than secure SSL ports #http_access deny CONNECT !SSL_ports # Only allow cachemgr access from localhost http_access allow localhost manager http_access deny manager # We strongly recommend the following be uncommented to protect innocent # web applications running on the proxy server who think the only # one who can access services on "localhost" is a local user #http_access deny to_localhost # # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # cache_peer 123.123.123.123 parent 8080 0 no-query default #此处设定连接上级http代理服务器,如无可不需要。连接会直接从squid转发到Internet #123.123.123.123 为IP,8080为端口 prefer_direct off nonhierarchical_direct off never_direct allow all #强制转发到上级代理服务器 via off #此处设定用户名密码验证 auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords #设定密码文件位置 auth_param basic realm proxy acl authenticated proxy_auth REQUIRED #要求必须认证 http_access allow authenticated auth_param basic credentialsttl 2 hours #认证有效时间,即再次跳出认证窗口之间的时间 # Example rule allowing access from your local networks. # Adapt localnet in the ACL section to list your (internal) IP networks # from where browsing should be allowed #http_access allow localnet #http_access allow localhost http_access deny all # Squid normally listens to port 3128 http_port 3128 #默认端口 # Uncomment and adjust the following to add a disk cache directory. #cache_dir ufs /var/spool/squid 100 16 256 # Leave coredumps in the first cache dir coredump_dir /var/spool/squid #access_log none #是否关闭log # # Add any of your own refresh_pattern entries above these. # refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320
这样就成功配置了squid 用户名/密码登录。
二、其他问题
上级http代理服务器不是必须的,如不需要可以不设定。
为squid配置ssl可以用nghttpx或stunnel,具体设定需要参考相应的文档。然后将ssl服务器接到127.0.0.1:3128上即可。
最后在防火墙打开相应的端口(如3128或你的ssl端口)