4.1 实例总图
- web客户端和服务器治安使用HTTP协议通信
- HTTP协议属于应用层协议
- 代理服务器: 主机与web网络的通信都需要经过代理服务器, 由代理服务器代为转达
4.2 部署代理服务器
4.2.1 HTTP代理服务器工作原理
- 分类: 正向代理服务器, 反向代理服务器, 透明代理服务器
- 正向代理服务器: 需要设置代理服务器的地址, 客户端的每次请求, 都会被发到代理服务器上, 代理服务器再转交给真正需要访问的服务器. 场景: 防火墙内的局域网需要访问Internet, 访问墙外的网站.
- 反向代理服务器: 设置在服务器端, 对于客户端没什么区别, 就是直接访问需要访问的目标服务器, 反向代理服务器会代理目标服务器接收这个请求, 然后将请求转交给局域网内部的真实服务器.
- 透明代理服务器: 设置在网关上. 因为用户访问Internet的数据报必然经过网关, 所以在网关上设置的代理服务器, 对用户来讲是透明的, 可以看作正向代理的一种特殊情况.
4.2.2 部署squid代理服务器
首先需要准备两台机器, 或者虚拟机
4.2.2.1 代理服务器端
- 在ubuntu上安装squid代理服务器:
sudo apt-get update
sudo apt-get install squid
- 修改squid配置文件, 位置:
sudo gedit /etc/squid/squid.conf
acl localnet src xxx.xxx.xxx.xxx/24
http_access allow localnet
这两行的意思是允许网络xxx.xxx.xxx.xxx上的所有机器通过该代理服务器来访问web网络
- 添加到acl之后, 大概在900多行
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
acl localnet src xxx.xxx.xxx.xxx/24
http_access allow localnet
- 重启服务
sudo service squid restart
- 用
sudo lsof -i
查看squid监听端口, 默认是3218
...
squid 6729 proxy 6u IPv6 90138 0t0 UDP *:42669
squid 6729 proxy 8u IPv4 90139 0t0 UDP *:38723
squid 6729 proxy 11u IPv6 90142 0t0 TCP *:3128 (LISTEN)
...
4.2.2.2 客户端配置
- 设置代理服务器地址:
export http_proxy="xxx.xxx.xxx.xxx:3128"
4.3 使用tcpdump抓取数据包
- 客户端:
wget --header="Connection: close" http://baidu.com/index.html--2022-06-27 10:43:28-- http://baidu.com/index.html
$ wget --header="Connection: close" http://baidu.com/index.html
--2022-06-27 10:43:28-- http://baidu.com/index.html
正在连接 192.169.158.128:3128... 已连接。 //连接到代理服务器
已发出 Proxy 请求,正在等待回应... 200 OK
长度: 7387 (7.2K) [text/html]
正在保存至: “index.html.5”
index.html.5 100%[===================>] 7.21K --.-KB/s in 0s
2022-06-27 10:43:28 (828 MB/s) - 已保存 “index.html.5” [7387/7387])
4.4 访问DNS服务器
- 代理服务器向DNS服务器询问域名的IP地址, DNS服务器返回域名的别名和两个IP
4.5 本地名称查询
- 通过主机名访问本地局域网上的机器, 可以用本地静态文件来获取机器的IP地址.
- 在/etc/hosts配置文件中
- 当需要查询某一个主机名对应的IP地址时, 程序会先检查这个文件
4.6 HTTP通信
- 时序图
4.6.1 HTTP请求
- 请求方法:
- 对于GET, HEAD, OPTIONS, TRACE, PUT和DELETE方法是等幂的, 也就是连续多次, 重复的请求和只发送一次该请求的效果完全相同
- POST不同, 不是等幂的, 因为每一次POST都可能会影响到服务器上的资源
- HTTP/1.1 代表使用的HTTP方法
- User-Agent代表客户端使用的程序
- Host 表示要访问的主机名
- Connect: 表示连接状态, close表示处理完请求就关闭连接, keep-alive表示保持一段时间等待后续请求.
4.6.2 HTTP应答
- 状态码: 200 OK
- server: 表示web服务器的名称
- content-length 表示目标文件长度
4.6.2.1 cookie的用处
- HTTP是无状态的, 上下文无关, 但目前很多网页是交互式的, 所以需要别的方法来报纸HTTP的状态, 这就是cookie
- cookie式服务器给客户端的特殊信息, 客户端每次发送都需要携带cookie, 这样服务器就能区分不同的用户.
4.7 实例总结
略