linux-运维进阶-21 Squid部署代理缓存服务

linux-运维进阶-21 Squid部署代理缓存服务

概念解析

Squid

  Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。

  Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。

squid分类

按照代理类型的不同,可以将Squid代理分为正向代理和反向代理。

  正向代理:根据实现方式的不同,又可以分为普通代理和透明代理。
    1)普通代理:需要客户机在浏览器中指定代理服务器的地址、端口;
    2)透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,代理服务器需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理;

  反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

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

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

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

实验准备工作

实验原理

  我们需要两台虚拟机,一台是win10操作系统作为客户端,另一台我们新安装一个Centos 7的虚拟机Server。配置好虚拟机Server后,将Server作为客户端win10的代理服务器,从而让win10能够上网。为了大家能完全理解虚拟机通信原理,我这里将整体上的网络结构拓扑图画出来,如下图:

​ 在之前的文章中,我们讲解过网络适配器三种模式的工作原理,本次实验设置如下:

设置

1.虚拟机Server

2.虚拟机WIN10

3.VMware Workstation Pro设置

​ 点击图中更改设置即可更改,这里放出的图是改好后的图。

通信原理

  结合下图,我们的Server网卡1和WIN10 的网卡均是仅主机模式的,所以对应的,他们的ip自然是由VMnet1的虚拟DHCP服务器来分配。我们的Server网卡2是桥接模式的,相当于用一个交换机连着我们电脑的真实电脑,所以我们现在用着的物理机的ip和Server网卡2的ip均由我们的家用路由器分配。我们去到别人家里,连上别人家wifi,就会得到一个ip地址,仔细看的话就会发现家用路由器分配给我们的都是192.168.1.X的ip,在这里也是这个道理。

  对了,有一次我将虚拟机网卡设置为桥接模式之后,开机查看ip发现ip竟然不是192.168.1.X了,而是一个奇怪的ip。我当时想了很久也没发现问题,难道是电脑抽风了?后来才想起来,我家断网了,我临时连着的是手机热点,真是很尴尬。

​ 如下图,由于虚拟机WIN10是仅主机模式的,所以它要访问NET外网,其数据就必须从Server那里经过。

查看本机ip(虚拟机win10)

1
C:\Users\zhong>ipconfig

查看Server的ip

1
[root@localhost ~]# ip add

  由上面两张图我们得知了虚拟机WIN10的ip是192.168.23.53

  虚拟机Server的ip分别是192.168.23.52和192.168.1.106

为了实验更加清晰明了,我们把分配好的ip加到拓扑图里,新的拓扑图如下:

保存快照

  实验到这里,基本准备已经准备好,记住一定要给上述虚拟机Server关机保存快照,这个快照的名字就叫做“快照1”,待会我们做透明代理实验的时候恢复成这个快照再做。虚拟机WIN10就可以不用弄快照了,反正是测试用的,配置少得可怜。

配置Squid服务程序

  检查虚拟机WIN10是否可以和Server通信,这里要注意的是,不同网段不能ping通,同一网段可以ping通,如下图:

检查Server是否可以连接外网和ping通虚拟机WIN10(ping需要手动用ctrl+c打断)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# ping baidu.com
PING baidu.com (123.125.115.110) 56(84) bytes of data.
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=1 ttl=51 time=45.7 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=2 ttl=51 time=45.8 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=3 ttl=51 time=101 ms
^C
--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 45.774/64.315/101.284/26.141 ms
[root@localhost ~]# ping 192.169.23.53
PING 192.169.23.53 (192.169.23.53) 56(84) bytes of data.
^C
--- 192.169.23.53 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2001ms

[root@localhost ~]#

可以看到,Server可以ping通外网,但是无法ping 虚拟机WIN10的时候没有响应。然鹅,奇怪的是,虚拟机WIN10可以ping通它而它能不能ping通WIN10,其实这是系统差异导致的,对本实验没有影响,Server无法ping通虚拟机WIN10那就ping不通吧,我们往下继续做实验。实验结束后,我们再解析如何让它可以ping通虚拟机WIN10。

安装squid程序,并查看配置文件

1
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
[root@localhost ~]# yum install squid -y
[root@localhost ~]# ls /etc/squid/
cachemgr.conf errorpage.css mime.conf squid.conf
cachemgr.conf.default errorpage.css.default mime.conf.default squid.conf.default
[root@localhost ~]#
[root@localhost ~]# cat /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

#
# 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
#

# 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

# And finally deny all other access to this proxy
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

#
# 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
[root@localhost ~]#

可以看到其监听的端口号为3128,一会我们设置客户端代理的时候要用到!
参数 作用
http_port 3128 监听的端口号
cache_mem 64M 内存缓冲区的大小
cache_dir ufs /var/spool/squid 2000 16 256 硬盘缓冲区的大小
cache_effective_user squid 设置缓存的有效用户
cache_effective_group squid 设置缓存的有效用户组
dns_nameservers [IP地址] 一般不设置,而是用服务器默认的DNS地址
cache_access_log /var/log/squid/access.log 访问日志文件的保存路径
cache_log /var/log/squid/cache.log 缓存日志文件的保存路径
visible_hostname linuxprobe.com 设置Squid服务器的名称

正向代理

开启ip forward(路由转发)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# echo "net.ipv4.ip_forward = 1" >>/usr/lib/sysctl.d/50-default.conf
[root@localhost ~]# grep ip_forward /usr/lib/sysctl.d/50-default.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -a | grep -w ip_forward
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
net.ipv4.ip_forward = 0 #0表示未开启
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens37.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 #我们将之开启
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -a | grep -w ip_forward
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens37.stable_secret"
net.ipv4.ip_forward = 1 #1表示已开启
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@localhost ~]#

放行所有http访问

1
2
3
4
5
6
7
8
[root@localhost ~]# vim /etc/squid/squid.conf
将第56行改为:
http_access allow all

保存退出,查看结果
[root@localhost ~]# grep -n http /etc/squid/squid.conf |grep -w all
56:http_access allow all
[root@localhost ~]#

安装openssl

1
[root@localhost ~]# yum -y install openssl

关闭防火墙

1
[root@localhost ~]# systemctl stop firewalld.service

squid加上DNS,重启squid服务

1
2
3
4
5
6
[root@localhost ~]#  echo "dns_nameservers 114.114.114.114 114.114.115.115" >> /etc/squid/squid.conf
[root@localhost ~]# grep nameserver /etc/squid/squid.conf
dns_nameservers 114.114.114.114 114.114.115.115
[root@localhost ~]# systemctl restart squid
[root@localhost ~]# systemctl enable squid
[root@localhost ~]#

一开始,我们的虚拟机WIN10客户端是无法上网的,所以要设置代理。

虚拟机WIN10设置客户端代理,如下图:

如上图,原本处在仅主机模式的虚拟机WIN10是无法上网的,现在设置了代理就可以访问外网了。

ACL访问控制

只允许某个客户端进行代理

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# vim /etc/squid/squid.conf
将之前改过的56行改回:
http_access deny all

将下面这行备注掉(大概第10行):
#acl localnet src 192.168.0.0/16
它的作用是让192.168.0.1-192.168.255.254之间所有ip都可以被放行,把它备注掉,方便我们接下来实验的观察。

如下图
在合适的地方加入:
acl client src 192.168.23.53

在合适的地方加入:
http_access allow client

保存退出,重启squid服务
[root@localhost ~]# systemctl restart squid.service

​ 可以看到咱们的虚拟机WIN10仍然可以上外网,这是由于acl client src 192.168.23.53放行了它的ip所致:

  为了对比效果,我又装了一台虚拟机WIN10Test用来测试,给它与之前那台虚拟机WIN10同等的待遇,给它的ie浏览器也配置了一样的代理,现在看看它能否上外网:

看看它的ip:

将他的ip也加入放行队列:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# vim /etc/squid/squid.conf

如下图
在合适的地方加入:
acl client2 src 192.168.23.55

在合适的地方加入:
http_access allow client2

保存退出,重启squid服务
[root@localhost ~]# systemctl restart squid.service

可以看到,这台新加的虚拟机也可以访问外网了

  现在开了三台虚拟机,电脑非常卡,可以把这台新的虚拟机关掉了,接下来我们继续回到正题,继续做代理实验。

特别注意:

  本次实验特别坑的地方是,不把Server上的防火墙关掉,客户端就无法访问外网!而且,如果实验中途把Server关机了,重新启动后又得再次关闭防火墙!网上大多数的教程都没有说这一步,导致非常多初次做实验的同学们都被坑死在这里。

过滤敏感字

修改配置文件(还原上次实验的更改后再做,还原的相关命令也在下面)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# vi /etc/squid/squid.conf
去掉第10行的注释
acl localnet src 192.168.0.0/16

第58行左右,讲我们之前改过的deny改回allow
http_access allow all


如下图,在合适的地方加入如下两行:

大概27行:acl deny_keyword url_regex -i nba

大概33行:http_access deny deny_keyword

保存退出,重启squid服务,关闭防火墙
[root@localhost ~]# systemctl restart squid.service
[root@localhost ~]# systemctl stop firewalld.service


这里之所以我又关了一次防火墙,是因为实验中途我把Server关机了,重新开机后虚拟机WIN10怎么也访问不了外网,IE浏览器上只提示“代理服务器无响应”,又是被防火墙坑了。这里防火墙一关,那里ie浏览器又就可以正常访问外网了。

效果如下:

​ 如下图,可以正常访问外网,但是无法访问带有敏感字的网站。

禁止访问特定网站

修改配置文件(可以接着上述实验的更改继续再做,相当于叠加过滤)

  注意,我们平时访问qq官网,是https的网址:https://www.qq.com,但是由于咱们的Server现在针对的是http协议进行过滤的,就连配置文件里也全都是“http_access”的字段,所以我们测试用的是http://www.qq.com。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# vi /etc/squid/squid.conf

如下图,在合适的地方加入如下两行:
大概28行:acl deny_url url_regex http://www.qq.com

大概31行:http_access deny deny_url

保存退出,重启squid服务
[root@localhost ~]# systemctl restart squid.service

效果如下:

​ 可以正常访问外网,但是无法访问http://www.qq.com

效果对比:

1
2
3
4
5
6
7
8
9
[root@localhost ~]# vi /etc/squid/squid.conf

我们把之前加的两行备注掉:
大概28行:#acl deny_url url_regex http://www.qq.com

大概31行:#http_access deny deny_url

保存退出,重启squid服务
[root@localhost ~]# systemctl restart squid.service

  现在回到刚刚的测试页面,刷新一下,可以看到它自动的从http://www.qq.com跳转到了https://www.qq.com,成功访问了qq官网。

禁止下载特定格式文件

修改配置文件((可以接着上述实验的更改继续再做,相当于叠加过滤)

1
2
3
4
5
6
7
8
9
[root@localhost ~]# vi /etc/squid/squid.conf

如下图,在合适的地方加入如下两行:
大概29行:acl badfile urlpath_regex -i \.exe$ \.msi$

大概32行:http_access deny badfile

保存退出,重启squid服务
[root@localhost ~]# systemctl restart squid.service

  如下图,我们这里用下载nodejs软件历史版本的网站https://nodejs.org/dist/v0.6.2/来测试,分别点开三个文件对比测试:

node-v0.6.2.msi

node.exe

node-v0.6.2.tar.gz

​ 理论上,我们禁止下载了msi和exe后缀格式的文件,那么tar.gz是没有禁止的,实际测试效果如下:

​ 可以看到,实际测试效果和理论上是一样的。

透明正向代理

  正向代理服务一般是针对企业内部的所有员工设置的,鉴于每位员工所掌握的计算机知识不尽相同,如果您所在的公司不是IT行业的公司,想教会大家如何使用代理服务也不是一件容易的事情。再者,无论是什么行业的公司,公司领导都希望能采取某些措施限制员工在公司内的上网行为,这时就需要用到透明的正向代理模式了。

  “透明”二字指的是让用户在没有感知的情况下使用代理服务,这样的好处是一方面不需要用户手动配置代理服务器的信息,进而降低了代理服务的使用门槛;另一方面也可以更隐秘地监督员工的上网行为。

  在透明代理模式中,用户无须在浏览器或其他软件中配置代理服务器地址、端口号等信息,而是由DHCP服务器将网络配置信息分配给客户端主机。这样只要用户打开浏览器便会自动使用代理服务了。

准备工作:

  删除之前实验配置的客户端浏览器代理配置,如下图:

现在又无法访问外网了,如下图:

接下来我们要用透明正向代理让它恢复访问网络的能力。

使用firewalld配置透明正向代理

  这里有很多坑,网上的大多教程不是缺东就是少西,另外在配置的时候要用的明明是ens37和ens33而网上的教程却都是误人子弟的eth0和eth1,为了试验更加清晰明了,这里也不特意还原之前实验的状态了,我们从头开始,把接下来的实验单独拿出来作为另外一个实验!

恢复快照

  之前我们保存了快照叫做“快照1”的那个,现在咱们把Server恢复快照到那个地方,则相当于准备工作已经安排妥当,接下来实验从头开始,只不过这次咱们做的是透明代理。

安装squid程序

1
[root@localhost ~]# yum install squid -y

禁用selinux

1
[root@localhost ~]setenforce 0					#临时关闭selinux

开启ip forward(路由转发)

1
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
[root@localhost ~]# echo "net.ipv4.ip_forward = 1" >>/usr/lib/sysctl.d/50-default.conf
[root@localhost ~]# grep ip_forward /usr/lib/sysctl.d/50-default.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -a | grep -w ip_forward
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
net.ipv4.ip_forward = 0 #0表示未开启
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens37.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 #我们将之开启
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -a | grep -w ip_forward
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens37.stable_secret"
net.ipv4.ip_forward = 1 #1表示已开启
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@localhost ~]#

[root@localhost ~]# vim /etc/sysctl.conf
在文末追加一行:
net.ipv4.ip_forward=1

保存退出

配置squid配置文件,放行所有http访问,transparent是透明的意思

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# vim /etc/squid/squid.conf
将第56行改为:
http_access allow all

如下图,在合适的地方修改这两行:
大概59行(追加一个transparent即可):http_port 3128 transparent

大概62行(去掉备注即可):cache_dir ufs /var/spool/squid 100 16 256

保存退出

检查配置文件是否有误
[root@localhost ~]# squid -k parse

初始化透明代理
[root@localhost ~]# squid -z

初始化完成后敲回车即可。

重启squid服务
[root@localhost ~]# systemctl restart squid

使用firewalld配置SNAT,然后添加squid服务

1
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
 //外网网卡添加到外网zone
//内网网卡添加到内网zone
//将masquerade配置成yes
//添加squid服务
//添加squid服务
//列出外网区域信息
//配置端口转发
//重新加载防火墙
//重启firewalld服务
[root@localhost ~]# firewall-cmd --zone=external --add-interface=ens37 --permanent
The interface is under control of NetworkManager, setting zone to 'external'.
success
[root@localhost ~]# firewall-cmd --zone=internal --add-interface=ens33 --permanent
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[root@localhost ~]# firewall-cmd --zone=external --add-masquerade --permanent
Warning: ALREADY_ENABLED: masquerade
success
[root@localhost ~]# firewall-cmd --zone=external --add-service=squid --permanent
success
[root@localhost ~]# firewall-cmd --zone=internal --add-service=squid --permanent
success
[root@localhost ~]# firewall-cmd --zone=external --list-all
external (active)
target: default
icmp-block-inversion: no
interfaces: ens37
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.23.0/24" forward-port port="80" protocol="tcp" to-port="3128" to-addr="192.168.23.52"" --zone=internal
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# systemctl restart firewalld
[root@localhost ~]#

这里注意,如下,有时候手误会少敲一个d,结果命令就可能没敲进去。

1
2
3
[root@localhost ~]# systemctl restart firewall
Failed to restart firewall.service: Unit not found.
[root@localhost ~]#

检查客户端可以正常上网

使用iptables配置透明正向代理

注意:iptables和firewalld是冲突的,同时只能使用一个防火墙,所以要还原上次实验的更改后再做

放行DNS查询端口,配置IPv4地址转发

使用iptables防火墙管理命令把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# systemctl mask firewalld.service
Created symlink from /etc/systemd/system/firewalld.service to /dev/null.

# 安装iptables 服务
[root@localhost ~]# yum install iptables-services -y

# 开启iptables服务
[root@localhost ~]# systemctl start iptables
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o ens37 -j MASQUERADE
[root@localhost ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.ip_forward = 1
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-port 3128
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens37 -j SNAT --to 192.168.1.105
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]
[root@localhost ~]#

注意:不要写错网卡和ip,上述ens37为外网网卡,192.168.1.105为外网ip,192.168.23.0/24是内网ip。

现在检查:

反向代理

  网站页面是由静态资源和动态资源一起组成的,其中静态资源包括网站架构CSS文件、大量的图片、视频等数据,这些数据相对于动态资源来说更加稳定,一般不会经常发生改变。但是,随着建站技术的更新换代,外加人们不断提升的审美能力,这些静态资源占据的网站空间越来越多。如果能够把这些静态资源从网站页面中抽离出去,然后在全国各地部署静态资源的缓存节点,这样不仅可以提升用户访问网站的速度,而且网站源服务器也会因为这些缓存节点的存在而降低负载。

  反向代理是Squid服务程序的一种重要模式,其原理是把一部分原本向网站源服务器发起的用户请求交给Squid服务器缓存节点来处理。但是这种技术的弊端也很明显,如果有心怀不轨之徒将自己的域名和服务器反向代理到某个知名的网站上面,从理论上来讲,当用户访问到这个域名时,也会看到与那个知名网站一样的内容(有些诈骗网站就是这样骗取用户信任的)。因此,当前许多网站都默认禁止了反向代理功能。开启了CDN(内容分发网络)服务的网站也可以避免这种窃取行为。

修改配置文件

​ 注意,我的虚拟机Server重启后,作为桥接模式的外网网卡ip有所变化是很正常的,因为它的ip本就是由我家的家用路由器分配的,现在它变成了192.168.1.107,我们就用这个ip来配置。

  58.250.26.38是一个网站的ip,这个随意,拿来测试的而已,找个能用的就行。

1
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
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:98:66:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.23.52/24 brd 192.168.23.255 scope global noprefixroute dynamic ens33
valid_lft 952sec preferred_lft 952sec
inet6 fe80::5a82:cc9d:de3:b9f0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:98:66:58 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.107/24 brd 192.168.1.255 scope global noprefixroute dynamic ens37
valid_lft 7081sec preferred_lft 7081sec
inet6 fe80::ccc:8d0d:490e:7f9f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]#

[root@localhost ~]# vim /etc/squid/squid.conf

大概第59行,改为:
http_port 192.168.1.107:80 vhost
在上面那行下面追加下面这一行:
cache_peer 58.250.26.38 parent 80 0 originserver

[root@localhost ~]# systemctl restart squid.service

客户端访问

我们输入Server外网网卡的ip:192.168.1.107,如下图,可以看到它自动跳转到了目标网站。

实验到此结束

课外拓展

仅主机模式下,linux无法ping通windows的解决办法

  我们重新弄两台虚拟机,实验准备和上面那个实验一样。Server网卡一为仅主机模式,网卡二为桥接模式。虚拟机WIN10的网卡为仅主机模式。

1.虚拟机Server

2.虚拟机WIN10

3.VMware Workstation Pro设置

​ 点击图中更改设置即可更改,这里放出的图是改好后的图。

​ 拓扑图就是和原来一样的拓扑图。

开机,查看各个设备的ip:

1.Server

ens33:192.168.23.52

ens37:192.168.1.107

2.虚拟机WIN10

ens33:192.168.23.53

3.物理机WIN10(就是宿主机,我们现在用着的真实电脑)

VMnet1:192.168.23.1

VMnet8:192.168.141.1

物理网卡:192.169.1.108

  桥接模式与物理网卡相互桥接,故网段均为192.168.1.0/24

  仅主机模式对应VMnet1,故网段均为192.168.23.0/24

  我们这里没用到VMnet8,也没有NAT模式的虚拟机网卡,就先不管它了。

现象:

  按照原理上讲,同一网段的ip是可以互相ping同的。然而在这里,我们可以发现,windows可以ping通linux,但是linux却是无法ping通windows的,如下图:

1.物理机windows去ping虚拟机Server可以ping通

2.虚拟机Server却无法ping通物理机windows(ping无响应,只能手动ctrl+c打断)

3.虚拟机WIN10可以ping通Server:

4.Server却不能ping通虚拟机WIN10:

解决办法:

先在虚拟机WIN10上做如下设置:

然后Server就可以ping通虚拟机WIN10了:

现在在物理机windows上做如下设置:

现在虚拟机Server也可以ping通物理机windows了:

实验完毕

实验做完了记得要把自己物理机的启用网络发现关闭掉。

欢迎打赏,谢谢
------ 本文结束------
0%