智能DNS+squid反向代理
# 概述
Squid 一款开源的代理服务软件,用于实现HTTP和FTP以及DNS查询,SSL等应用的应用层代理,官方站点:http://www.squid-cache.org
squid 作为应用层代理服务软件,主要提供缓存加速,应用层过滤控制的功能(访问的目标,客户机地址,访问的时间)
squid可构建的代理服务:传统代理、透明代理、反向代理
DNS view(视图) + SQUID 反向代理 = CDN(内容分发网络)
代理的工作原理:
客户端通过代理来请求web页面时,指定的代理服务器首先检查自己的高速缓存,是否有客户端请求的页面,有则直接从缓存中读取页面反馈给客户端,没有则缓存服务器向Internet发送访问请求,将结果缓存到本地并返回给客户端,缓存对象主要是文字,图像等静态的元素。当客户机在不同的时候访问同一WEB元素,不同的客户机访问相同的WEB元素时,可以直接从代理服务器的缓存中获得结果
优点:
- 减少向Internet提交重复访问过程
- 隐藏客户端的IP地址
- 加快客户端访问速度
- 在代理访问过程中过滤和控制机制(访问目标,客户机地址,时间段)
代理的基本类型:根据实现方式,服务对象的不同,代理服务器可分为传统代理,透明代理和反向代理
传统代理:
普通的代理服务,以提供 HTTP、FTP 代理为主,客户端需要在浏览器或QQ聊天工具,下载软件中手动指定代理服务器的地址和端口号(默认为3128),对于网页浏览器,域名解析也会发给指定的代理服务器。对于企业局域网来说同样可通过代理接入Internet,但只能访问 HTTP、FTP 代理的缓存机制可为用户访问web站点提高访问速度 。
应用场景:QQ程序使用代理可以隐藏本机真实IP地址、下载工具使用多个代理规避服务器的并发连接限制
透明代理(Transparent Proxy):
提供与传统代理相同功能,对于客户端来说代理服务器是透明的,客户端不需要指定IP地址与端口号,而是通过默认路由,防火墙策略将web访问重定向,实际上还是交给代理服务器处理,域名解析优先发给DNS服务器。透明:客户端不需要在浏览器中指定代理服务器的地址和端口号
应用场景:Squid+Iptables 将访问请求通过Iptables(Redirect 重新定向)给本机的代理服务程序
反向代理:
反向代理(Reverse.Proxy)也同样提供缓存加速,只不过服务的对象反过来了。传统代理也好,透明代理也好,大多是为局域网用户访问Internet中的Web站点提供缓存代理;而反向代理恰恰相反,主要为Internet中的用户访问企业局域网内的 Web 站点提供缓存加速,是一个反向的代理过程,因此称为反向代理。
对于一些访问量较大的Web站点(如新浪,搜狐等),提供反向代理可以起到加速作用,同时缓解Web服务器的压力。例如,使用nslookup工具解析出www.sina.com.cn站点对应的IP地址(通常有多个,这是基于DNS解析的负载分担),任选其中一个在浏览器中直接访问,就会发现Squid反向代理服务反向的错误信息。而使用www.sina.com.cn域名访问新浪站点使,用户基本上感觉不出squid服务的存在。
Internet应用:
- 传统代理
- 反向代理
局域网应用:
- 透明代理
# 部署准备
环境描述
dns 192.168.1.11 bind
squid1 192.168.1.12 squid-3.0
squid2 192.168.1.13 squid-3.0
squid3 192.168.1.14 squid-3.0
web 192.168.1.15 jdk-7、tomcat-7
在每台服务器上做以下操作
关闭防火墙和selinux
service iptables stop
setenforce 0
2
修改主机名
hostname 主机名
bash
2
首选DNS
指向192.168.1.11并修改/etc/hosts文件
vim /etc/resolv.conf
nameserver 192.168.1.11
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.11 dns.amber.com dns
192.168.1.12 squid1.amber.com squid1
192.168.1.13 squid2.amber.com squid2
192.168.1.14 squid3.amber.com squid3
192.168.1.15 web.amber.com web
2
3
4
5
6
7
8
9
10
11
12
vim scp.sh //编写脚本实现批量发送配置文件到其他主机
#!/bin/bash
i=(2 3 4 5)
for i in ${i[\*]}
do
scp /etc/resolv.conf 192.168.1.1$i:/etc/resolv.conf
scp /etc/hosts 192.168.1.1$i:/etc/hosts
done
// 执行
sh scp.sh
2
3
4
5
6
7
8
9
10
11
# 部署dns服务
yum -y install bind bind-chroot bind-utils bind-libs
cp /etc/named.conf /etc/named.conf.bak
vim /etc/named.conf
options {
listen-on port 53 { 192.168.1.11; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/\* Path to ISC DLV key \*/
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
view squid1 {
match-clients { 192.168.1.20; };
zone "amber.com" IN {
type master;
file "squid1.amber.zone";
};
};
view squid2 {
match-clients { 192.168.1.30; };
zone "amber.com" IN {
type master;
file "squid2.amber.zone";
};
};
view squid3 {
match-clients { 192.168.1.40; };
zone "amber.com" IN {
type master;
file "squid3.amber.zone";
};
};
vim /var/named/squid1.amber.zone
$TTL 86400
@ SOA amber.com. admin.amber.com. (
20150813
3H
15M
1W
1D
)
IN NS dns.amber.com.
dns IN A 192.168.1.11
www IN A 192.168.1.12
cp squid{1,2}.amber.zone
vim /var/named/squid2.amber.zone //修改第11行
11 www IN A 192.168.1.13
cp squid{1,3}.amber.zone
vim /var/named/squid3.amber.zone //修改第11行
11 www IN A 192.168.1.14
named-checkzone amber.com squid1.amber.zone //检查区域配置文件
zone amber.com/IN: loaded serial 20150813
OK
named-checkzone amber.com squid2.amber.zone
zone amber.com/IN: loaded serial 20150813
OK
named-checkzone amber.com squid3.amber.zone
zone amber.com/IN: loaded serial 20150813
OK
/etc/init.d/named start
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# 部署squid
安装squid
软件下载位置:http://www.squid-cache.org/Versions/v3/3.0/
三台squid安装过程相同:
useradd -M -s /sbin/nologin squid
tar xf squid-3.0.STABLE24.tar.gz -C /usr/src/
cd /usr/src/squid-3.0.STABLE24/
./configure --prefix=/usr/local/squid && make && make install
2
3
4
配置squid1
cd /usr/local/squid/ etc/
egrep -v "^$|^#" squid.conf > squid1.conf
mv squid1.conf squid.conf
vim squid.conf
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 192.168.1.12 192.168.1.13 192.168.1.14
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
http_access allow all
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
#htcp_access allow localnet
#htcp_access deny all
#http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /usr/local/squid/var/logs/access.log squid
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
icp_port 3130
coredump_dir /usr/local/squid/var/cache
cache_effective_user squid
cache_effective_group squid
visible_hostname squid1.amber.com
http_port 80 accel vhost vport
cache_peer squid2.amber.com sibling 80 3130
cache_peer squid3.amber.com sibling 80 3130
cache_peer 192.168.1.15 parent 8080 0 no-query originserver round-robin name=web
maximum_object_size 10240 KB
maximum_object_size_in_memory 512 KB
cache_mem 32 MB
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
复制配置文件到squid2、squid3
scp squid.conf squid2:/usr/local/squid/etc/squid.conf
scp squid.conf squid3:/usr/local/squid/etc/squid.conf
2
在squid2、squid3上分别修改以下参数
配置squid2
vim /usr/local/squid/etc/squid.conf
39 visible_hostname squid2.amber.com
41 cache_peer squid1.amber.com sibling 80 3130
42 cache_peer squid3.amber.com sibling 80 3130
2
3
4
配置squid3
vim /usr/local/squid/etc/squid.conf
39 visible_hostname squid3.amber.com
41 cache_peer squid1.amber.com sibling 80 3130
42 cache_peer squid2.amber.com sibling 80 3130
2
3
4
启动squid
在三台squid上在相同操作
chown -R squid.squid /usr/local/squid/
/usr/local/squid/sbin/squid - k parse/reconfigure
/usr/local/squid/sbin/squid -z //生成缓存目录
/usr/local/squid/sbin/squid -D //启动squid服务
netstat -anptu |grep squid
tcp 0 0 0.0.0.0:80 0.0.0.0:\* LISTEN 20205/(squid)
udp 0 0 0.0.0.0:51382 0.0.0.0:\* 20205/(squid)
udp 0 0 0.0.0.0:3130 0.0.0.0:\* 20205/(squid)
2
3
4
5
6
7
8
9
10
11
若停止服务可以如下操作:
pkill squid
# 安装tomcat
在web服务器上安装tomcat
tar xf jdk-7u65-linux-x64.tar.gz
mv jdk1.7.0_65/ /usr/local/java
vim /etc/profile
在最后添加以下两行内容
JAVA_HOME=/usr/local/java
PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
tar xf apache-tomcat-7.0.54.tar.gz
mv apache-tomcat-7.0.54 /usr/local/tomcat7
/usr/local/tomcat7/bin/startup.sh
netstat -anpt |grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:\* LISTEN 2412/java
2
3
4
5
6
7
8
9
10
11
12
13
14
# 测试
启动linux客户端使用不同IP访问web服务器
1.配置客户端IP为192.168.1.20
访问web服务器
查看squid1和web的访问日志
tail -f /usr/local/squid/var/logs/access.log
tail -f /usr/local/tomcat7/logs/localhost_access_log.2016-12-24.txt
2.配置客户端IP为192.168.1.30
访问web服务器
tail -f /usr/local/squid/var/logs/access.log
tail -f /usr/local/tomcat7/logs/localhost_access_log.2016-12-24.txt
3.配置客户端IP为192.168.1.40
tail -f /usr/local/squid/var/logs/access.log
tail -f /usr/local/tomcat7/logs/localhost_access_log.2016-12-24.txt
显示以上页面为成功,智能DNS服务器能根据客户端IP把访问地址解析到对应的squid服务器上,由squid服务器处理请求,如有缓存就直接返回给客户端,否则就到源web服务器上请求数据。