Posted in Technology 进行吐槽

因为某些需要(如苹果电视等)我在一台服务器上安装了一个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端口)

 

 

 

 

 

 

 

 

 

打赏
2018年03月22日