文章目录
1、 抓包工具
如何知道用户访问过来?
(1)日志
(2)netstat
(3)抓包工具tcpdump
ip地址
src host --》 source host 源地址
dst host --》destination host 目的地址
host --》不区分源或者目的ip
端口:
src port、 dst port、 port(不区分源和目的地)
协议
arp/icmp(网路层)、 tcp/udp(传输层)
tcpdump
tcpdump 是一个linux里的抓包工具。
执行tcpdump指令可列出经过指定网络界面的数据包文件头,在Linux操作系统中,你必须是系统管理员。
常用选项
-n 以数字的形式显示,不把主机的网络地址转换成名字
-nn指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-w 把数据包数据写入指定文件文件
-i 监视指定网络接口的数据包
-p 将网卡设置为非混杂模式,不能与host或broadcast一起使用
[root@slave-mysql ~]# tcpdump -i ens33 -p tcp and src host 192.168.0.237 and dst port 80 -nn 以数字的形式显示
[root@slave-mysql ~]# tcpdump -i ens33 -p tcp and src host 192.168.0.237 and dst port 80 -nn -w web.data
[root@slave-mysql ~]# tcpdump -i ens33 -p arp
2、HTTP
http VS https
http是明文传输、https是密文传输;
http协议基于TCP协议进行传输的、默认端口80;
https协议基于TSL/SSL协议加密进行TCP传输的;
(https 相比http 多了一层SSL/TLS)
SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。
TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2
所以 HTTP 传输面临的风险有:
(1) 窃听风险:黑客可以获知通信内容。
(2) 篡改风险:黑客可以修改通信内容。
(3) 冒充风险:黑客可以冒充他人身份参与通信。
http 协议
http是什么?做什么用的?
超文本传输协议(Hyper Text Transfer Protocol)
作用: 在网络上传输web页面
http协议是在浏览器和web服务器之间使用,用来传输网页。
所有的浏览器都能懂http协议。
爬虫模块:python,java里的,都能读懂http协议
所有的web服务器: nginx,tomcat,IIS,python web,go web框架,java web框架都能读懂http协议
浏览器可以读懂html语言,将拿到的Index.html文件在浏览器里渲染(呈现,展示,显示)
site 站点: 一个网站
报文 segment Message datagram : 封装了数据的数据 --》容器
段: 传输层的数据格式
请求包 request
user-agent: 用户代理: 就是帮助用户去访问网页的代理工具–》其实就是我们的浏览器
响应包 response
http特点
1、简单快速
2、灵活
3、无状态
每次请求都是独立的,
上一次请求和下一次请求互不相干。
比如,你登录了某个网站,下一次请求理论上来说就不需要再登录了。
http是无状态的,它不能知道你上一次请求已经登录过了。所以需要借助其他东西来完成这个登录认证(session、cookie)。
无状态: 是web服务器端的nginx不知道你的请求时第1次来请求,还是第2次,第3次 新的请求还是旧的请求
有状态: 服务器收集了客户端的数据,记录了它的信息,通过这些信息可以判断你是老用户还是新用户
http版本
1、0.9版本 GET方法
2、1.0 POST HEAD 方法
3、1.1 PUT、OPTIONS、DELETE等方法,引用了持久连接
4、2.0 效率快,吞吐快
二进制分帧(Binary Format)- http2.0的基石
多路复用 – 一个连接内可以处理多个请求,同时进行请求和响应
头部压缩 –
优先级 –
服务器端推流 (html,js,css) - index.html
#在1.1之前 ,每次请求都会新建一个tcp连接
0.9–》不支持长连接
1.1 --》支持长连接,传输的数据是文本格式
2.0 --》比较新的,速度更加快,数据格式二进制,多路复用(提升效率)
http 工作原理
http工作流程和原理
注意:
连接:
长连接: 长时间连接–》保持一段时间,然后再四次断开 --》nginx —》 keepalive_timeout 65;
短连接: 短时间连接–》事情完成就进行四次断开
session和cookie
会话保持。
session和cookie技术: 可以保留用户的信息(比如用户名、密码等)
会员卡(cookie): web服务器让浏览器保存用户的信息–》信息保存到客户端–》放到浏览器的cookie(存放数据的地方)
人脸识别系统(session ):用户的信息保存在服务器端–》数据库–》内存里的一个数据结构。
需要消耗更多的资源维护session, 容易遭受csrf攻击
token验证 – 它会将token放在url的参数后面
cookie在请求报文和响应报文里面都有;
响应报文里:服务器让客户机保存什么东西;
请求报文里:客户机携带什么数据给服务器;
http请求报文
get/post方法
都是客户机想获取服务器的资源—》用来告诉服务器的方法
GET: 在URL里可以看到,同时携带的信息有限不能很多
POST:不在URL里显示,是通过表单传输,可以携带更加多的信息
GET和POST方法的区别?
Connection: keep-alive --》长连接有效
closed 连接已经断开
Host: 192.168.0.127 --》服务器的ip或者域名
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile
Safari/537.36 --》浏览器
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate——》是否支持压缩和解压缩
Accept-Language: zh-CN,zh;q=0.9
首部字段
就是请求报文的头部封装里需要封装的内容,是可以自己调整的,可增加也是可以减少–》变化的
cookie : 可选的首部字段–》携带的信息
host:
user-agent:
method
http1.1
URL
ACCEPT:
http响应报文
root@iZwz9hqlrezjnsz3968bz2Z:/#yum install go -y #安装go语言环境
root@iZwz9hqlrezjnsz3968bz2Z:/# go version #查看go语言环境的版本
go version go1.17.6 linux/amd64
[root@slave-mysql html]# mkdir /sanchuang
[root@slave-mysql html]# cd /sanchuang/
[root@slave-mysql sanchuang]# vim server.go # 编写脚本
package main
import (
"fmt"
"net/http"
)
// 定义一个处理函数
func handler(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintf(writer, "Hello,world, %s !", request.URL.Path[1:])
}
// http://119.13.90.106:8080/fengdeyong
// 定义main函数
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
root@hk-tea-lian:/feng-go/first_webapp# go build server.go 将server.go 编译成二进制文件 server
root@hk-tea-lian:/feng-go/first_webapp# ls
server server.go
[root@slave-mysql sanchuang]# ./server & #执行server程序
[1] 22980
root@hk-tea-lian:/feng-go/first_webapp# netstat -anplut|grep server
Active Internet connections (servers and established)
tcp6 0 0 :::8080 :::* LISTEN 306836/./server
root@hk-tea-lian:/feng-go/first_webapp#
[root@slave-mysql sanchuang]# ps aux|grep server
root 20601 0.0 0.2 38624 5292 ? Ss 11:12 0:00 /usr/libexec/openssh/sftp-server
root 20671 0.0 0.2 40476 4944 ? Ss 11:19 0:00 /usr/libexec/openssh/sftp-server
root 22980 0.4 0.5 1016688 9256 pts/2 Sl 17:49 0:00 ./server
root 22986 0.0 0.0 12348 1152 pts/2 S+ 17:49 0:00 grep --color=auto server
[root@slave-mysql sanchuang]# netstat -anplut|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 22980/./server
[root@firewall ~]# cat snat_dnat.sh
#!/bin/bash
iptables -F
iptables -t nat -F
#stop firewalld service
service firewalld stop
#open routing function
echo 1 > /proc/sys/net/ipv4/ip_forward
#setting snat policy
iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -o ens33 -j SNAT --to-source 192.168.0.127
#setting dnat policy distribute web
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.88.27
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 8080 -i ens33 -j DNAT --to-destination 192.168.88.27:8080
#setting dnat policy distribute ssh
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 2233 -i ens33 -j DNAT --to-destination 192.168.88.22:22
https建立连接
1、发送client hello,建立连接请求;
客户端自己支持的协议、版本号、加密算法等
2、服务器回复 server hello;
确定协议、版本号、加密算法、证书(包含了公钥)
3、客户端收到证书之后,验证合法性,验证不通过就是发出警告;
4、客户端生成随机密码,然后用公钥加密,发送给服务器;
5、服务器收到加密后的密文,用私钥解密。获取随机密码;
6、之后再使用随机密码生成秘钥进行对称加密通信;
搭建https(野鸡证书)
1、安装nginx
yum install nginx -y
2、生成证书
#创建一个目录专门存放证书相关文件
cd /etc/nginx/sslcert
#生成证书密钥对
#实际上 server.key 中同时包含了公钥和私钥的信息
openssl genrsa -out server.key 2048
#使用下面命令可以导出公钥(可不操作,视情况而定)
openssl rsa -in server.key -pubout -out server-public.key
#生成证书请求server.csr
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=HN/L=HN/O=cetc/OU=cetc/CN=www.baidu.com"
#生成证书server.crt
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
3、编辑nginx配置文件
[root@localhost conf.d]# cat sc.conf
server {
listen 443 ssl;
server_name www.sc.com;
# ssl on; 上一个nginx版本这样写,现在直接加载监听端口443后面
ssl_certificate /etc/nginx/sslcert/server.crt; #指定数字证书,路径要指定正确
ssl_certificate_key /etc/nginx/sslcert/server.key; #指定数字证书私钥文件,路径要指定正确
location / { # 提供某个路由的配置
root /usr/local/sclilin99/html; # 指定访问这个路由的根目录
index hehe.html; # 指定首页
}
}
#生效配置
3、DNS服务
DNS (domain name system) 域名解析
安装dns服务软件包bind
[sanchuang@b ~]$ sudo yum install bind
前提
我们网络中都是使用ip地址通信,无论是访问服务,还是不同主机间进行数据交换。
ip地址非常多,如果每个服务都通过ip地址来登陆的话,用户就需要记住这些很复杂的ip地址,不方便用户使用。
就像保存在手机里的电话号码一样,会有一个备注,通过这个备注就可以找到正确的相应联系人的电话。
域名解析跟这个实现差不多,在普通用户中我们用域名来访问服务,域名就通过域名解析来获取到ip地址。
dns服务就像电话簿,提供了可以查询的域名到ip地址的映射关系。
FQDN(Full Qualified Domain Name),完全限定域名,即每个域在全球网络都是唯一的;
另外值得提到的一点是域并不是指诸如www.google.com这样的域名,而google.com才是域;
域的分类
一、根域(.)
13组根域名服务器以英文字母A到M依序命名,域名格式为“字母.root-servers.net”
在/var/named/namd.ca文件中可以查看
二:顶级域
顶级域:顶级域(Top Level Domain,简称TLD)分为三类
-
通用顶级域:诸如 .com(商业机构) .org(非营利性组织) .net(网络服务机构)等
-
国家顶级域:诸如 .cn(中国) .uk(英国) .us(美国) .jp(日本) .hk
-
反向域(基础建设顶级域):.arpa,即从IP到FQDN的反向解析
三:二三级域
二级域
三级域
www.sc.163.com -->顶级域.com -->163.com --> sc.163.com
DNS解析
正向解析:DNS——》IP
反向解析:IP——》DNS
常见域名解析命令
安装bind-utils软件包
[root@b named]# yum install bind-utils
1、ping
[root@b named]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=55 time=15.0 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=55 time=14.3 ms
2、host
[root@b named]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 14.215.177.39
www.a.shifen.com has address 14.215.177.38
3、dig
[root@b named]# dig www.baidu.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.2 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62633
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 40 IN CNAME www.a.shifen.com.
www.a.shifen.com. 231 IN A 14.215.177.39
www.a.shifen.com. 231 IN A 14.215.177.38
4、nslookup
[root@b named]# nslookup www.baidu.com
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 14.215.177.39
Name: www.a.shifen.com
Address: 14.215.177.38
解析过程
1、先查找本地hosts文件(linux: /etc/hosts),可以解析就直接返回地址。
2、hosts文件不能解析,去找本地dns缓存,如果有则返回结果,没有就进行下一步查找。
linux下域名缓存:nscd服务
缓存会有缓存时间,缓存多久可以指定的
[root@b html]# yum install nscd
[root@b html]# service nscd restart #清除缓存
3、本地缓存没有找到,就会去请求本地的域名服务器,本地域名服务器有就返回结果。
linux下指定域名解析服务器文件: /etc/resolv.conf
[root@b html]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114 # 第一个指定的nameserver 就是首选dns服务器
#nameserver 8.8.8.8 # 剩下的都是备选dns服务器
#nameserver 192.168.0.1
4、本地域名服务器没有找到相应记录,如果设置转发查找,就会去转发的服务器上去查询。
如果没有设置转发,或者都没有找到,就会去根域查找。
本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。
本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。
当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机
本地域名服务器——>转发服务器——>根域名服务器——>.com域服务器——>xx.com域服务器···——>www.xx.com
4、常见状态码
状态码 | 含义 | 解释 |
---|---|---|
301 | 永久重定向 | |
302 | rewrite | 临时重定向 302Moved Temporarily |
304 | not modified | 浏览器缓存里的内容和nginx服务器里的内容是一样的,直接从缓存里面取的数据 |
307 | 临时重定向 | |
400 | 客户端语法错误 | |
401 | 用户登录验证失败 | |
403 | Forbidden | 权限问题,服务器没有权限访问网页(用户禁止访问) |
404 | not found | 网页不存在 |
405 | 网页未授权不能访问(没有输入用户名密码等)、方法不被允许 | |
499 | client has closed connection | 客户端关闭连接,nginx定义的状态码,可能是客户端处理不过来 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway(网关故障) | 就是负载均衡器是好的,但是后端的real server挂了 |
503 | Service Temporarily Unavailable | 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | http版本不被支持 |
5、 跳板机
堡垒机 = 跳板机 = 中控机
# 发布跳板机
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 2233 -i ens33 -j DNAT --to-destination 192.168.88.27:22
#注:跳板机给办公人员用的 跳板机/堡垒机 为了保护系统的安全
#注:使用ssh-agent 访问跳板机和想要访问的主机
#注:使用场景 阿里的业务 本来有10万台主机(在局域网里面,没有外网,外部不能访问),我在家里,十万台机器捞出一台,这1台主机可以访问外网(跳板机/堡垒机),这1台跳板机的配置尤其重要
开启ssh-agent,把自己主机的公钥添加到目标主机和堡垒机下 (目标主机的权限和堡垒机的权限)
#注:连到A上,从A跳到B上,B不一定有当前主机的公私钥
#跳板机 安全加固:
不能使用root直接登录,使用sudo赋予相应权限
不能使用默认端口登录
不能使用密码登录,都使用公钥登录
添加防火墙配置
总结:
#跳板机
#安全加固
1、不能使用密码登录
2、不能使用root登录
3、修改默认端口
4、添加防火墙配置
5、使用跳板机登录