五层模型
物理层一般很少讨论
数据链路层(MAC地址):
帧头:mac源地址以及目的地址 帧尾:加冗余码以便校验 信道类型:点到点,PPP协议 (ADSL拨号上网); 一对多的通信方式,(局域网) CSMA/CD 协议
ISP 封锁以及验证的就是数据链路层,控制用户上网。
网络层(IP地址)
网络层尽力转发数据包,可以丢包,也不负责顺序,丢包重传等这些是传输层负责的。
IP数据包
- 区分服务:少用
- 总长度:两个字节,网络层数据包data最大长度65536
- 标识+标致+偏移:网络层的数据包的最大长度65535字节,但是数据链路层的数据帧最大为1500字节,数据链路层可能需要分片。标识表示是否属于一个大包,标致表示是否为最后一个小包(结束),偏移用于最后的拼接。
- 生存时间:指的是TTL,没经过一个路由器,TTL-1。
- 协议:IP、ICMP等,用于标记由哪一层处理
- 首部校验和:仅仅是用于校验首部,而非数据,算法简单。
路由器只关心下一个网段怎么走,而不是某个具体的地址,下一个网段怎么走通过路由表实现的。
ARP协议
将ip地址转成局域网的mac地址,当上层程序发出一个请求的时候,数据包中使用的目的IP,经过链路层的时候,需要填写实际的mac地址,这里使用arp的缓存表,根据ip地址查到相应的mac地址(如果缓存里面没有,就会发起arp广播,操作系统本省也会一般每60s更新,可以arp -a查询),此时将数据帧丢给交换机,转到相应的的mac机器。
如果是外网的ip,直接使用网关的mac地址。
arpspoof -t IP_A IP_B不断发送广播,告诉IP_A,IP_B的mac地址是自己,如果加-r, 会双向广播(告诉IP_B,IP_A的地址是自己),-t可以不断重复添加。
ICMP协议
测试网络是否通,常见命令:ping(packet internet grope)
·
raceroute(linux),tracert(windows)可以检查经过了哪些路由器。
传输层(TCP/UDP)
流量控制:TCP 通过控制滑动窗口的大小来实现流量的控制,由client控制。
三次握手:其中前两次完全可以建立连接了,三次的目的
- sync
- sync + ack
- ack
三次握手的目的:对于每次发送都要有回应,如果只有两次的话,由于网络延迟,B端可能建立很多连接,而实际上A并没有建立连接,会造成B端资源的浪费。
四次挥手:需要分别关闭发送通道以及接受通道
TCP 的数据包有ack的信号,抓包的时候需要注意。
应用层(端口号)
http 协议 = tcp +80 https = tcp + 443 RDP = tcp + 3389 ftp = tcp +21 共享文件夹 = tcp +445 SMTP = tcp + 25 POP3 = tcp + 110 telent = tcp + 23 SQLServer = tcp + 1433 DNS = UDP + 53
DNS
将域名转成ip地址 需要自己安装的场景
- 解析自己内网的域名
- 降低dns的流量
- 域环境等
- 当使用代理插件的时候,DNS会在本地与远程同时触发,即使本地开启安全dns,远程也是普通dns。
dig @8.8.8.8 www.baidu.com可以指定dns server进行查询
DHCP
动态分配ip 地址 可以跨网段分配地址。
ftp
建立两个tcp连接,用于数据以及控制(使用21端口)。
- ftp主动模式:服务端(20端口)主动向客户端发起连接
- ftp被动模式:服务端指定范围内的某个端口被动等待客户端的连接
每个文件都会建立一个会话
telnet
远程控制计算机
可以用这个命令进行端口扫描
RDP
- windows 7 10 都是单用户操作系统,同一时间只允许一个用户使用。
- mstc 可以远程映射本地的磁盘
http
可以使用不同的端口建立多个网站.
网路安全提示:
- 只开放必要的端口
- 只开启必要的服务
端口扫描的目的是为了猜服务
netstat -n 查看建立的会话
netstat -an 查看哪些端口在用
netstat -nb 查看建立会话的进程
telnet 192.168.1.1 80 测试到远程的端口是否可以访问
常见攻击
- 局域网arp欺骗:当需要访问外部网站的时候,client通过arp获得网关的mac地址,这时候攻击计算机就说自己的mac地址为网关地址,所有数据都会经过黑客的计算机。
- DNS劫持,修改域名对应的ip,使得client访问假网站(钓鱼网站),来获取用户的账号与密码。
检查是否有后台监听进程
netstat -n
msconfig 检查除微软以外的服务。
数字证书
数字签名
两个步骤:hash+加密
- 为了证明文件的不可抵赖性(不可篡改性),需要对整个文件进行私钥加密,要是接受端能够正常解密就可以证明发送内容是真的。(因为冒充者没有私钥,发送过来的东西是没有办法解密的)。
- 但由于发送文件很大,如果全文使用私钥加密,那么加密以及解密就需要很长的时间。于是就只对文件的hash值(摘要/指纹)进行加密(哈希值长度固定),这样接受端验证指纹是否正确即可。
- 所谓数字签名就是使用私钥加密hash值(摘要/指纹),来确保发送内容确实是发送方发过来且没有被中途篡改过。
所有有公钥的人都有资格去查看内容,但是没有办法修改内容。 CA机构颁发
数字证书也是同样的道理,每个计算机内置CA公钥,如果收到的证书无法通过这个公钥解密,那么就说明这个证书被篡改过(不是CA颁发的)。
中间人
最原始的非对称加密会有中间人问题,也就是client请求的公钥其实是中间人的公钥,而中间人通过自己的公钥向服务器通信,这个过程中,所有的信息对中间人都是可见的。利用数字签名可以解决上述问题。这里的问题在于客户端收到的公钥并非真实的服务器发过来的,所以解决问题的核心变成如何识别公钥就是服务器发送过来的。服务器将公钥,公司信息等等提交CA机构,CA机构将其签名(求hash,后私钥加密),生成数字证书。
- 数字证书 = 明文(公司公钥, subject,有效期,CA机构名字等信息) + 签名(CA私钥加密明文的hash值)
- 为什么数字证书不只使用签名后的密文,还要明文?其一,CA机构很多,怎么知道用哪个CA的公钥去解析,明文部分除了CA机构的名字(方便客户端查找对应的CA公钥),其二,签名是对文件的hash值进行私钥加密,CA公钥解密后只能得到文件的hash值而非明文。
服务器建立连接之前,将数字证书发送给浏览器,浏览器使用对应CA机构公钥对签名解密(验证)得到hash值,再对明文部分进行hash计算,如果两者一致,则说明这个证书是有效的,当然包括其中的公司公钥就是有效的, 这样就可以保证client发送给server的信息不能被中介人截获。
- 信任的简单原理:客户端信任CA机构,验证发现这个证书就是CA颁发的,那么客户端就信任这个证书的内容。当然这里可能存在信任链(从根证书开始)。
签名操作是发送方用私钥进行签名,接受方用发送方证书来验证签名;加密操作则是用接受方的证书进行加密,接受方用自己的私钥进行解密。
https
web 服务器通信的时候,先把证书发过来,客户端验证后(验证数字证书参考上面),随机产生一个对称加密的key,将这个对称加密的key通过公钥的key加密后发送给服务器,以后与服务器通信就都基于这个随机的key.
在证书验证过程会几点注意:
- 证书过期:当client的时间不在证书的时间内,就提示过期。
- 不信任机构的证书:server 发给client的证书,颁发机构(CA)并不在客户端的信任列表中。
- 证书不符合:例如通过ip访问客户端,但是证书是和域名绑定的,会提示证书不匹配。再者,当钓鱼网站发一个CA认证的证书的,服务器也会提示不匹配。
简单点,提供的证书不是你的证,而是别人的证。
- 即使通过污染DNS的手段,让域名绑定到恶意的IP地址,且复制使用官方的证书,也无法使用,因为钓鱼网站没有对应的私钥。
常见设备
- 集线器(hub):内部很简单,是物理层的设备,n*n的线连接,一个发送,所有都收到,所以同一时间,只能有一个在通信。
- 网桥:网桥能够记录发送的mac地址,能够根据mac地址进行冲突域的隔离,降低带宽占用且比较安全,后期变成了交换机。(网桥可以认为是一个端口数少的交换机)
- 交换机(switch):将多台设备组建成局域网,根据mac地址存储转发,在本网段内转发。
- hub与(网桥/交换机)的主要区别就是后者隔离了冲突域,充分利用了带宽。
- hub已经废弃了,可能有的场合就是抓包监听。
- 多个交换机可以级联,一个端口也可以有多个mac地址
- 交换机通过源mac地址进行学习www.zhihu.com/question/58…
- 这里与子网掩码无关,10.10.10.1/24 和 10.10.10.2/25是可以互相通信的,www.zhihu.com/question/29…
- 路由器(router/gateway):提供跨网段访问的能力,其能够访问算管理的任意网段内的任意ip,根据ip地址存储转发,在不同的网段之间转发
- 路由器本身即连接这几个不同的网段,所以其有多个ip(交换机是二层设备,没有ip的概念).
- 当他收到数据包时,会查路由表(网段与下一条ip的对照表),然后将其mac地址改掉,并进行发送。
- 上层设备是具有下层设备的功能的,例如路由器是有交换机的功能的。
路由表解析
route -n
Destination Gateway Genmask
0.0.0.0 192.168.1.1 0.0.0.0
192.168.1.0 0.0.0.0 255.255.255.0
Destination配合Genmask,获取到destination的网段, Gateway为下一跳IP. 以上表为例,如果destination IP是内网的IP,则直接发送。如果是外网的ip,则发送给路由器。
Destination的0.0.0.0 指的是,默认网关。 Gateway的0.0.0.0指的是,在同一个网络,不需要路由。 blog.csdn.net/kikajack/ar…
TLS
TLS握手
- Client Hello
- TLS version # 支持的TLS版本,不同版本握手规则有所区别
- the cipher suites # 支持的加密套件类型
- client random # 用于后面的key exchange
- Server Hello
- chosen TLS
- chosen cipher suite
- server random # 用于后面的key exchange
- session ID # ?
- Server certifercate (include a public key)
- Key exchange
RSAkey exchange 是client 产生密钥(pre master secret),然后公钥加密发送给server,如果这种方式,就不需要DH key exchange.但是这里有一个问题,就是如果某天server的private key 泄露,那么所有的通信数据都可以恢复,比较安全的方式是对称密钥没有在网络进行传输过。
这里以DHE算法为例(generator,private value, public value, pre-master secret)
- server: 随机p,g,作为生成因子,随机a(server private value) 三个值,并且使用DH算法得到server public value.
- server: 对(p,g,server public value) 进行签名并发送.这里使用RSA等。 //这里server需要进行计算,先执行签名,然后使用privatekey对签名值进行加密。
- client: 随机b(client private value),利用server public value,p,g, 计算出client public value, 以及 pre master secret(PMS)//这里client需要计算
- client: 将client public value 发送给对端
- server: 利用server private value 与 client public value 计算出 pre master secret(PMS),至此,server 与client 拥有相同的pre master sercret.//这里server需要计算。
- both: master secret = PRF(PMS,client random ,server random)
- both: 利用 master secret 生成一堆用于对称加密通信的密钥(key block)。
-
Client finish
-
Server finish
- DH 算法
- ECDH 与DH 区别
- DH与DHE区别 DH 算法会把一个固定的DH parameter 放在CA证书里,每个session 都使用这个,所以不是PFS的,实际中也很少用。
- CBC,GCM: 加密模式,类似打乱对称加密中block的顺序。
- HMAC: 密码学哈希,保证信息不被恶意篡改,相比于传统hash,多加了一个密钥。
- AES128-SHA 是AES-128-CBC-HMAC-SHA的简写,使用AES128, CBC模式,HMAC使用的hash算法是SHA.
- TLS 先认证(hash 保证完整性),再加密,与IPsec正好相反。
两类handshake
ssl/tls 协议层位于应用层与传输层之间(有时候也认为是应用层协议),在tcp handsake之后,再进行tls的handsake,然后再进行http/ftp等传输。
TLS 版本区别
SSL(TLS前身)
TLS1.0/SSL3.1(几乎不用了)
TLS1.2(2008发布,主流)
TLS1.3(2018)
- TLS1.2需要两轮交互,TLS1.3 只需要一轮。
- 支持的套件数量由37变为5
- Perfect Forward Secrecy 必须支持。
- TLS1.3能减少一次RTT,因为其禁止了static(整个过程没有传输对称密钥,即使随机值被窃听,没有本地的随机值也无法推导)的key exchange, client将用于“随机值”在第一次hello中发过去了。Ref: www.a10networks.com/blog/key-di…
- TLS1.2中cipher suite的含义,www.keyfactor.com/blog/cipher… 其中对第二个字段的解释为authentication/signature.对于一般的情况,这个字段用于加sign(有时候也说为server authentication) server产生的随机值,但是对于需要双向验证证书的情况,用这个算法进行(client authentication)。
基于TLS的常见协议
- HTTPS
- FTPS
- SMTPS
HTTP 协议
- HTTP 数据包格式: method + Request URL + HTTP VERSION + header + content
- Get 与 Post 区别: GET没有content,内容都在request url里面,post有content内容,可以容纳更多信息。
- header里面的keep-alive可以避免频繁建立tcp连接
- http是无状态的,可以通过cookie以及token来标识client,相比于cookie,token不需要服务器端存储。
http数据包的流程
- 将域名通过DNS服务器转成ip地址(这是一个udp的协议)
- 生成数据包,包括目标ip,源ip,目标port,源port,UDP/TCP
- 通过arp协议,得到mac地址,生成一个完成的数据包
- 发送出去
- 交换机根据mac地址送到相应的网关。
- 网关根据目标ip的网段查看路由表,并且修改mac地址。
- 重复456
- 目标主机收到数据包。
- arp协议: 为ip地址服务,将ip地址转成local net中的物理地址(一般都有缓存)
- 路由表:一个网段(一堆ip)映射到一个ip,其会修改mac地址,不会修改ip地址
- 这里没写tcp的三次握手,其需要3个TCP包才能建立连接。
http中的origin
如果请求的网页与当前网页不在一个域中,浏览器会自动增加origin,然后相应的server配置策略控制reponse,进而避免server被过度访问。
HTTP 版本区别
HTTP1.1(1997)
一个tcp端口可以处理多个http的请求。
HTTP2(2015)
提升性能
HTTP3/QUIC(2020)
- 使用UDP代替TCP,用CPU换取了性能。但目前暂未统一.
- 内置tls1.3保证安全性
- 加入拥塞控制 zhuanlan.zhihu.com/p/342492148
打印局域网所有的mac地址
nmap -sn 192.168.1.*
arp -a
第一个遍历所有的ip,并且发送ping,如果主机支持icmp,则返回相应的结果。 第二个是打印arp的缓冲表,是因为第一个里面的ping,需要发送arp request,将ip地址转成mac地址,相当于借助ping all更新了arp表
第一个输出的结果仅仅是支持icmp协议的主机,即使不支持icmp协议,相应的mac也已经缓冲。
CBC与GCM的异同
两者都是针对AES而言的,对于RC4不支持。
- CBC不支持并行加速,GCM支持
- GCM支持信息校验码,校验完整性
keyblock内容
client_write_MAC_key #计算hash/sha等需要,比纯粹的hash安全,防止有人恶意篡改 server_write_MAC_key client_write_key # client->server 加密 server_write_key # server->client 加密 client_write_IV # client->server 初始向量,加盐/加入随机性 server_write_IV
Reference:byronhe.com/post/2015/0… mackey: 如果有人知道hash(A)=hash(B),那如果发现发送值的hash为hash(A)的时候,他就改成hash(B),以此来破坏通信 write_key:当时RC4的历史遗留,所以一直使用的不同write key IV value:如果知道某些协议的开始值,就可以反向破解 encrpted_data=encrpt(write_key|data),这里加入随机数之后就无法破解。
http proxy VS https proxy
没有proxy模式下的http通信
- 通过DNS得到web server的IP
- TCP三次握手建立与web server的连接(web server ip:80)
- 发送HTTP数据包
- 得到result
http proxy
- 通过DNS得到proxy server的IP
- TCP三次握手建立与proxy server的连接(主要区别在这里,这里dst ip,port就是proxy server:port)
- 发送HTTP数据包(发送数据包之后proxy负责请求网页)
- 得到result
HTTP proxy 可以通过步骤3的tcp包里面的内容,进行转发。
https
- 通过DNS得到web server的IP
- TCP三次握手建立与proxy server的连接(web server:443)
- TLS handshake
- 收发appdata
- 这里在client hello之后会收到一个数据包,这个是TCP的ack包。
- get http request 是在appdata里面,也就是说http所有的包都是加密的,看不到里面任何请求的数据,整个http协议都不可见。
https proxy
- 通过DNS得到proxy server的IP
- TCP三次握手建立与proxy server的连接(主要区别在这里dst ip,port就是proxy server:port)
- 发送HTTP request(这个是多出来的步骤,这里是connect类型,明文发送)
- TLS handshake()
- 收发appdata
HTTPS proxy 里面可以看到你请求的网页域名的,例如请求www.google.com/maps,可以看到www.google.com,但是看不到get的具体页面。 第三步是必要的,因为如果直接与proxy进行TLS handshake,肯定失败,证书校验不通过。如果直接把client hello转发,都不知道转发给哪个web server,因为dst ip就是proxy server ip.这里通过一次HTTP的请求告诉了server如何转发给哪个IP。
Git(ssh) proxy
在~/ssh/config文件中添加如下
host github.com
ProxyCommand connect -S yourcompany.com:1080 %h %p #windows with sock5
ProxyCommand connect -H yourcompany:913 %h %p #windows with http
ProxyCommand nc -X 5 -x yourcompany.com:1080 %h %p
#linux with sock5
ProxyCommand nc -X connect -x yourcompany:913 %h %p #linux with http
- http代理能够通过connect方法,能够转发tcp协议(非http),但是没法转发udp,需要socks.
ubuntu config DNS
netplan
sudo vim /etc/netplan/01-netcfg.yaml
nameservers:
addresses: [1.1.1.1 8.8.8.8]
#the following is optional, you can disable unwanted dns ip from dhcp.
dhcp4-overrides:
use-dns: false
dhcp6-overrides:
use-dns: false
sudo netplan apply
在ubuntu desktop中 netplan由network manager托管 在ubuntu server 中 netplan就是原始的形式,需要直接修改netplan的文件
resolve
sudo vim /etc/systemd/resolved.conf
DNS=1.1.1.1 8.8.8.8
DNSOverTLS=yes # it is optional
sudo systemctl restart systemd-resolved
/etc/host拥有高优先级,这里面没有,才会发起dns请求- netplan的dns是委托给systemd-resolve的
/etc/resolv.conf不能直接修改,根据文件链接不同,有三种用法。
IPv6
通过8(group)*16(bit)去表示地址,一般是16进制而非IPv4的十进制
- 全0可以省略,或写成1个0
::表示多个0压缩,但是只能压缩一次。- IPv4的地址可以映射到IPv6的最后的32位。
- 使用http或者ftp协议的时候需要
[]例如http://[1234::1233]:80
Bridge VM network in Ubuntu
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: no
bridges:
br0:
dhcp4: yes
interfaces:
- enp3s0
- 新建的br0会让原来的网卡会失效。
- 删除一个已经存在的bridge
sudo ip link delete br0 type bridge- Ref: netplan.readthedocs.io/en/stable/e…
- Ref: www.tecmint.com/create-netw…
证书生成
生成自签名证书(包含san)
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout example.key -out example.crt -addext "subjectAltName=DNS:example.com,DNS:www.example.net,IP:10.0.0.1"
Windows 浏览器信任需要添加到信任证书颁发机构
CA与server证书分别生成
openssl genrsa -out ca.key 2048 # 生成CA私钥
openssl req -new -x509 -key ca.key -out ca.cer -days 36500 # 生成CA机构的证书
openssl genrsa -out server.key 2048 # 生成web server私钥
openssl req -new -key server.key -out server.csr -addext 'subjectAltName=DNS:example.com,DNS:example.net' # 生成签名请求,需要里面增加SAN
openssl x509 -req -days 365 -in server.csr -CA ca.cer -CAkey ca.key -CAcreateserial -out server.cer -copy_extensions=copyall # 生成证书,最后一行是确保san能够成功加入到证书里。
openssl x509 -noout -text -in ca.cer可以通过这个验证证书。openssl req -noout -text -in server.csr可以验证请求csr- 由于CA机构的证书,都是自己给自己签的,所以issue与subject的内容是相同的。
- openssl req 有两个作用,一个是创建自签名的证书,第二个是下面的创建签名请求csr. www.ibm.com/docs/en/ts4…
- 现代浏览器需要SAN subject alternate name,才可以通过验证, 这能让一个证书支持多个网站,openssl 的新版本并没有,需要手动加上去. Ref: security.stackexchange.com/questions/7…
- 如果提供了SAN,CN(common name)就失效了,一般CN是SAN的子项 stackoverflow.com/questions/2… Reference: www.tangyuecan.com/2021/12/17/…
- windows 把CA证书安装到系统到目录,edge浏览器就可以正常识别,Firefox需要浏览器导入
NAT&PAT
- static NAT(1:1 NAT): 某个pub ip改成 private ip(双向的), 再进行路由
- Dynamic NAT: 某些pub ip改成某些private ip(双向的), 再进行路由。
- PAT: 除了改IP,还有修改port。
- NAT都是host级别的独占,与端口无关。pat是与端口有关的
- 经典路由器上,会修改mac地址,配上NAT之后会修改IP,配上PAT之后,会修改port。
- NAT本质上就是一个负载均衡,或者说可以用来做负载均衡。
- 实际生活的我们说的NAT实际上是PAT。
免费证书申请
使用Let's encrypt 加密
sudo apt update
sudo apt install certbot
sudo certbot certonly --standalone -d example.com
此方法仅限Linux格式的证书,windows格式pfx证书需要通过win-acme工具
BGP网络
- AS(autonomous systems): ISP, Universities, Goverment等。
- BGP(Border Gateway Protocol): 能够找到合适的最快的路径达到相应的IP.
DNS中的name
- CNAME: 另外的一个dns名字
- A: IPv4的地址
- AAAA: IPv6的地址
- 一个ip可以配置多个域名,然后每个域名访问的内容也不一样,虽然DNS的结果是同一个ip,但是请求的内容是不一样的,web服务器可以根据header定位不同的内容。help.aliyun.com/noticelist/…
- 一个域名可以返回多个ip,域名级别的负载均衡。
- http返回302的响应的时候,可以重定向域名的。