计算机网络学习笔记

173 阅读20分钟

五层模型

物理层一般很少讨论

数据链路层(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控制。

三次握手:其中前两次完全可以建立连接了,三次的目的

  1. sync
  2. sync + ack
  3. 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+加密

  1. 为了证明文件的不可抵赖性(不可篡改性),需要对整个文件进行私钥加密,要是接受端能够正常解密就可以证明发送内容是真的。(因为冒充者没有私钥,发送过来的东西是没有办法解密的)。
  2. 但由于发送文件很大,如果全文使用私钥加密,那么加密以及解密就需要很长的时间。于是就只对文件的hash值(摘要/指纹)进行加密(哈希值长度固定),这样接受端验证指纹是否正确即可。
  3. 所谓数字签名就是使用私钥加密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握手

TLS1.2

  1. Client Hello
  • TLS version # 支持的TLS版本,不同版本握手规则有所区别
  • the cipher suites # 支持的加密套件类型
  • client random # 用于后面的key exchange
  1. 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)

  1. server: 随机p,g,作为生成因子,随机a(server private value) 三个值,并且使用DH算法得到server public value.
  2. server: 对(p,g,server public value) 进行签名并发送.这里使用RSA等。 //这里server需要进行计算,先执行签名,然后使用privatekey对签名值进行加密。
  3. client: 随机b(client private value),利用server public value,p,g, 计算出client public value, 以及 pre master secret(PMS)//这里client需要计算
  4. client: 将client public value 发送给对端
  5. server: 利用server private value 与 client public value 计算出 pre master secret(PMS),至此,server 与client 拥有相同的pre master sercret.//这里server需要计算。
  6. both: master secret = PRF(PMS,client random ,server random)
  7. both: 利用 master secret 生成一堆用于对称加密通信的密钥(key block)。
  1. Client finish

  2. 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)

  1. TLS1.2需要两轮交互,TLS1.3 只需要一轮。
  2. 支持的套件数量由37变为5
  3. 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的常见协议

  1. HTTPS
  2. FTPS
  3. 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不需要服务器端存储。

Ref: zhuanlan.zhihu.com/p/45173862

http数据包的流程

  1. 将域名通过DNS服务器转成ip地址(这是一个udp的协议)
  2. 生成数据包,包括目标ip,源ip,目标port,源port,UDP/TCP
  3. 通过arp协议,得到mac地址,生成一个完成的数据包
  4. 发送出去
  5. 交换机根据mac地址送到相应的网关。
  6. 网关根据目标ip的网段查看路由表,并且修改mac地址。
  7. 重复456
  8. 目标主机收到数据包。

Ref: segmentfault.com/a/119000002…

  • 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)

  1. 使用UDP代替TCP,用CPU换取了性能。但目前暂未统一.
  2. 内置tls1.3保证安全性
  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不支持。

  1. CBC不支持并行加速,GCM支持
  2. 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通信

  1. 通过DNS得到web server的IP
  2. TCP三次握手建立与web server的连接(web server ip:80)
  3. 发送HTTP数据包
  4. 得到result

http proxy

  1. 通过DNS得到proxy server的IP
  2. TCP三次握手建立与proxy server的连接(主要区别在这里,这里dst ip,port就是proxy server:port)
  3. 发送HTTP数据包(发送数据包之后proxy负责请求网页)
  4. 得到result

HTTP proxy 可以通过步骤3的tcp包里面的内容,进行转发。

https

  1. 通过DNS得到web server的IP
  2. TCP三次握手建立与proxy server的连接(web server:443)
  3. TLS handshake
  4. 收发appdata
  • 这里在client hello之后会收到一个数据包,这个是TCP的ack包。
  • get http request 是在appdata里面,也就是说http所有的包都是加密的,看不到里面任何请求的数据,整个http协议都不可见。

https proxy

  1. 通过DNS得到proxy server的IP
  2. TCP三次握手建立与proxy server的连接(主要区别在这里dst ip,port就是proxy server:port)
  3. 发送HTTP request(这个是多出来的步骤,这里是connect类型,明文发送)
  4. TLS handshake()
  5. 收发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

www.w3cschool.cn/ipv6/ipv6_a…

Bridge VM network in Ubuntu

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: no
  bridges:
    br0:
      dhcp4: yes
      interfaces:
        - enp3s0

证书生成

生成自签名证书(包含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。

Ref: xie.infoq.cn/article/ede…

免费证书申请

使用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.

www.cloudflare.com/learning/ne…

DNS中的name

  • CNAME: 另外的一个dns名字
  • A: IPv4的地址
  • AAAA: IPv6的地址
  • 一个ip可以配置多个域名,然后每个域名访问的内容也不一样,虽然DNS的结果是同一个ip,但是请求的内容是不一样的,web服务器可以根据header定位不同的内容。help.aliyun.com/noticelist/…
  • 一个域名可以返回多个ip,域名级别的负载均衡。
  • http返回302的响应的时候,可以重定向域名的。