bfchengnuo / MyRecord

平时充电做的笔记,一个程序猿的自我修养.
https://bfchengnuo.com/MyRecord/
32 stars 8 forks source link

关于网络相关的 #43

Open bfchengnuo opened 4 years ago

bfchengnuo commented 4 years ago

长期计划,毕竟这一块内容超级多,如果往下挖,我是看不到底的。。。 推荐 《计算机网络:自顶向下的方法》 包括但不限于

bfchengnuo commented 4 years ago

DNS

之前基本都填坑填的差不多了,这里贴一下:

localhost与127.0.0.1的区别

关键点: Linux 下 127.0.0.1 是内核设备 loop,不走网卡,几乎无性能损失,Windows 大概率也是不走网卡的。

127.0.0.1 是一个回环地址。并不表示“本机”。0.0.0.0 才是真正表示“本网络中的本机”。

例外:PHP 文档中解释,Linux 中如果使用 localhost 连接 MySQL,会用一种进程内通信 ( IPC ) 机制, 不走网络协议栈,如果使用 127.0.0.1 则使用 TCP/IP 协议栈来进行数据传输。

域名系统DNS

什么是DNS劫持、污染

bfchengnuo commented 4 years ago

端口转发与端口映射

端口映射是 NAT 的一种,功能是把在公网的地址转翻译成私有地址

端口映射就是将外网主机的 IP 地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该 IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。端口映射有动态和静态之分

当用户访问提供映射端口主机的某个端口时,服务器将请求转移到本地局域网内部提供这种特定服务的主机;利用端口映射功能还可以将一台外网 IP 地址机器的多个端口映射到内网不同机器上的不同端口

端口映射功能还可以完成一些特定代理功能,比如代理 POP,SMTP,TELNET 等协议。理论上可以提供 65535(总端口数)- 1024(保留端口数)= 64511 个端口的映射。


端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法。端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户从外部经过一个被激活的 NAT 路由器到达一个在私有内部 IP 地址(局域网内部)上的一个端口。


端口转发应该是将发送到内网机器指定端口的数据丢给另外一个机器的某个端口,在转发的过程可以对数据包进行修改和检查;

端口映射就跟路由器一样,你要提供 WEB 服务,那么就得先映射 80 端口,外部用户通过 80 端口访问你的 WEB 服务(外部用户访问 80 端口,就会被翻译为内网 ip 的端口),映射过程只能源数据传输。

bfchengnuo commented 4 years ago

IP地址欺骗

在计算机网络里面,IP 地址欺骗或 IP 欺骗是指带有假的源 IP 地址的 IP 协议分组(数据报),目的是冒充另一个计算系统身份。

使发送方可以保持匿名的一种技术是使用代理服务器。

通过互联网网络和许多其他计算机网络发送数据的基本协议是 IP 协议。该协议规定,每个 IP 数据报必须有一个包括数据包发送者 IP 地址的报头。 源 IP 地址通常是数据报发送的地址,但报头中的发送者地址可以被改变,这样对收件人看来,该数据报来自另一个源。

该协议要求接收计算机发回对源地址的响应,因此,欺骗主要用在当发送方期望网络响应或不关心响应的情况

应用

IP 地址欺骗最常用在拒绝服务攻击,其目的是使目标接受压倒性的流量以过载,攻击者不关心接收到攻击数据报的响应。伪造IP地址的数据报过滤更困难,因为每个伪造数据报是来自一个不同的地址,他们隐藏攻击的真正来源。

以及使用IP地址认证的任何服务和 RPC

合法应用

在网站性能测试,成百上千的“用户”(虚拟用户)可能被创建,每个都在执行测试网站的测试脚本,以模拟当系统上线和大量用户立刻登录时会发生什么事。

防御手段

数据报过滤是一种防御IP欺骗攻击的手段。 对网络的网关通常执行入口过滤,用内网的源地址来阻止外网的数据包。这可以防止外部攻击者欺骗内部机器的地址。理想情况下,网关也将对传出的数据包执行出口过滤,用外网的源地址阻止内网数据包。

相关补充

IP 地址可能是假的,这是由于 IP 协议的源路由机制所带来的,这种机制告诉路由器不要为数据包采用正常的路径,而是按照包头内的路径传送数据包,常见于内网直接传递数据包。

于是黑客就可以使用系统的 IP 地址获得返回的数据包。有些高级防火墙可以让用户禁止源路由。通常我们的网络都通过一条路径连接 ISP,然后再进入 Internet。这时禁用源路由就会迫使数据包必须沿着正常的路径返回。

源路由的用户可以指定他所发送的数据包沿途经过的部分或者全部路由器。它区别于由主机或者路由器的互联层(IP)软件自行选择路由后得出的路径。

源路由可简单分为严格源路由记录(SSRR)和松散源路由记录(LSRR); 由于安全问题,标记为 LSRR 的数据包经常在 Internet 上被阻止。如果没有被阻止,LSRR 可以允许攻击者欺骗其地址但仍然成功接收响应数据包

IPv6 中已经在开发两种新型的源路由模式。

攻击模式

它的目的是伪造可信主机的数据包,一般的攻击流程为:

  1. 瘫痪真正拥有 IP 的可信主机,也就是使被信任主机失去工作能力,以免对攻击造成影响
  2. 然后连接到目标机的某个端口来猜测 ISN 基值和增加规律;
  3. 接下来把源址址伪装成被信任主机,发送带有 SYN 标志的数据段请求连接;
  4. 然后等待目标机发送 SYN+ACK 包给已经瘫痪的主机;
  5. 最后再次伪装成被信任主机向目标机发送的 ACK,此时发送的数据段带有预测的目标机的 ISN+1;
  6. 连接建立,发送命令请求。

我们知道 TCP 具有一定的防伪造能力,通信主机需要协商“序列号”,所以,要想持续通信,必须要猜测这个序列号,并且连接建立了只能发送命令,收不到回显,因为服务器根据 IP 回显给了真的信任主机

bfchengnuo commented 4 years ago

防火墙与 Socks

这两个已整理成笔记,链接在下面

防火墙

Socks协议

bfchengnuo commented 4 years ago

NAT

NAT 英文全称是 “Network Address Translation”,中文意思是“网络地址转换”,它是一个 IETF(Internet Engineering Task Force, Internet 工程任务组) 标准,允许一个整体机构以一个公用 IP(Internet Protocol)地址出现在 Internet上。 顾名思义,它是一种把内部私有网络地址(IP 地址)翻译成合法网络 IP 地址的技术。 因此我们可以认为,NAT 在一定程度上,能够有效的解决公网地址不足的问题。

NAT 有三种类型:静态 NAT(Static NAT)、动态地址 NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)。

网络地址端口转换NAPT

网络地址端口转换 NAPT(Network Address Port Translation)则是把内部地址映射到外部网络的一个 IP 地址的不同端口上。 它可以将中小型的网络隐藏在一个合法的 IP 地址后面。NAPT 与 动态地址 NAT 不同,它将内部连接映射到外部网络中的一个单独的 IP 地址上,同时在该地址上加上一个由 NAT 设备选定的端口号。

NAPT 是使用最普遍的一种转换方式,在 HomeGW 中也主要使用该方式。它又包含两种转换方式:SNAT 和 DNAT。

应用

NAT 主要可以实现以下几个功能:数据包伪装、平衡负载、端口转发和透明代理。

静态NAT

相比之下,静态 NAT 和动态 NAT 用的不算多。

静态转换 (Static Nat) 是指将内部网络的私有 IP 地址转换为公有 IP 地址,IP 地址对是一对一的,是一成不变的,某个私有 IP 地址只转换为某个公有 IP 地址。 借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。

我个人理解,这种方案仅仅可以使一台主机与外网互通,但是它可以组件一个内网环境,内网之间的主机可以互相通信。

动态NAT

动态转换 (Dynamic Nat) 是指将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址对是不确定的,而是随机的,所有被授权访问 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。

也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换(动态就在这内部维护的“对应表”上)。 动态转换可以使用多个合法外部地址集。当 ISP 提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。

结语

可以看出 NAT 这技术是工作在较为底层的网络协议上,操作的是数据包,当然网络的分层也仅仅是逻辑上的概念,所以 NAT 技术你既可以使用物理硬件来做,例如路由器之类;也可以是应用软件来做,例如各种代理软件,不用死板的认为涉及到数据包的处理就得是硬件干的活。

当然,具体到 NAT,因为它的功用性,一般是在物理层面做的,例如路由器上,毕竟它的主要作用就是让多台电脑使用一个共用 IP 来上网。

如果你使用过虚拟机,大概也能理解你可以给虚拟机设置 NAT 上网方式,这样你的主机就相当于一个 NAT 设备了,这样就不需要其他的物理设备。


无论你几个主机使用一个 IP,只要用路由器,总是绕不开 NAT,因为你的网络肯定要分内网和外网,你连上路由器分配的就是一个内网地址,这样你发的所有数据包源地址都是一个内网地址,所以必须要 NAT,除非你是直接怼了 WAN 口的网线,用宽带拨号上网。

bfchengnuo commented 4 years ago

桥接

家庭无线路由器的 LAN 口,任意选取其中的两个,每个 LAN 口连接一台电脑 A、B,两个 LAN 口就是桥接关系,从 A 发出的以太帧,原封不动地到达 B,反之亦然。

桥设备几乎什么都没有做,除了学习 A、B 的 MAC 地址并动态绑定在 LAN 口,并在转发帧时查询此种绑定关系。

更简单的理解,你用一根网线把两个局域网连起来,这就是桥接,即桥接可以互联 LAN。

PS:说到虚拟机,如果使用桥接方式,那么就是相当于使用你真实的网卡(区别与你本机与虚拟机接在一个交换机上),你拔了网线,虚拟机与你本机都提示网络电缆被拔出,就酱。

同时,如果把一个设备放在网关后面,做桥接,这不就是防火墙吗?

进一步了解

桥接还可以将一个拥挤的以太网段分割成两部分,原来网段上的流量被分割成两个较小的流量,因此减少了发生冲撞的机会。

协议层面,桥接作用于数据链路层,使用 MAC 地址作出转发决定。桥接的网络位于一个单独的逻辑网络地址空间之内。因此,桥接有助于节省网络层地址。因为只有一个逻辑网络存在,网桥必须将本地广播转发到除源网段外的所有连接的网段

路由器使用网络地址(IP)来进行工作

想要完全理解,必须得了解它的 MAC 学习模式(有一个桥接表),因为不需要使用路由,采用广播的方式,数据包会广播给每一台主机,相当于村里所有的门都叫了一遍,地址对了你就进去了,我瞎猜的。

继续下去,你还会了解到一个叫 ARP 的东西。

参考:http://wenda.tianya.cn/question/013075c4a3fbc49b

bfchengnuo commented 4 years ago

SSH 隧道

隧道的概念是将一种网络协议封装在了另外一个协议里面。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。

像 socket、https、ssh 都是基于流的隧道协议,这里就只简单说说 SSH 隧道。

SSH 隧道可以通过加密频道将明文流量导入隧道中。为了创建 SSH 隧道, SSH 客户端要设置并转交一个特定本地端口号到远程机器上。一旦 SSH 隧道创建,用户可以连到指定的本地端口号以访问网络服务。本地端口号不用与远地端口号一样。

SSH 隧道的分类:

  1. 动态 SSH 隧道
  2. 本地 SSH 隧道
  3. 远程 SSH 隧道

以端口转发为例,

动态转发:

ssh -D 1080 JumpHost  # D is for Dynamic

动态端口转发实际上是建立一个 ssh 加密的 SOCKS4/5 代理通道,任何支持 SOCKS4/5 协议的程序都可以使用这个加密的通道来进行代理访问。 这条命令相当于监听本地 1080 端口作为 SOCKS5 代理服务器,所有到该端口的请求都会被代理(转发)到 JumpHost,就好像请求是从 JumpHost 发出一样。 由于是标准代理协议,只要是支持 SOCKS 代理的程序,都能从中受益,访问原先本机无法访问而 JumpHost 可以访问的网络资源,不限协议(HTTP/SSH/FTP, TCP/UDP),不限端口。

本地转发

ssh -L 2222:localhost:22 JumpHost  # L is for Local
# host1 run
ssh -L 2222:host2:22 host3

# -N 不执行命令或者脚本,否则会等待用户输入命令
# -f  不登录到主机,一般 -Nf 搭配使用即后台运行且不登录(只用来传数据,不执行操作)
SSH -L 6666:10.0.0.57:23 -Nf 10.0.0.56

# -g 共享 5566 端口;即别人访问我的端口也可以直接使用隧道。否则的话只能本机使用。
SSH  -g  -L 5566:10.0.0.57:23 -Nf 10.0.0.56

这条命令的作用是,绑定本机 2222 端口,当有到 2222 端口的连接时,该连接会经由安全通道 (secure channel) 转发到 JumpHost,由 JumpHost 建立一个到 localhost 22 端口的连接。

命令中的 L 参数一共接受三个值,分别是"本地端口:目标主机:目标主机端口",它们之间用冒号分隔。 第二条命令中,假设 host1 和 host2 无法直接通信,但是 host3 可以与两者通信,使用这条命令,host1 可以通过 2222 端口经过 host3 的转发与 host2 的 22 端口通信; 需要注意的是,目标主机是对于 host3 来说的,即使你在 host1 上运行,所以,当输入 localhost 时,它指的是 host3

远程转发

ssh -R 8080:localhost:80 JumpHost  # R is for Remote

# host3 run
ssh -R 2121:host2:21 host1

远程转发就是在 ssh 连接成功后,绑定目标主机的指定端口,并转发到本地网络的某主机和端口;和本地转发相比,转发的方向正好反过来,参数为 "远程主机端口:目标主机:目标主机端口"。 假如在本机 80 端口有一个 HTTP 服务器,上述命令执行成功后,JumpHost 的用户就可以通过请求 http://localhost:8080 来访问本机的 HTTP 服务了。

与本地转发的区别正好是反过来的,例如 host1 是内网可以连外网的 host3,但是反过来不行,因为是运行在 host3 对于它来说绑定的是 host1 的 2121 端口,自然是远程转发了; 这样,host1 就可以通过 2121 端口经过 hsot3 的转发与 host2 进行通信了。

参考

https://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html