Files
knowledge-base/Linux/计算机网路.md
T
2026-08-25 22:44:19 +08:00

476 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 计算机网路
> 来源:原 mongodb 集合 `t_blog` · 整理日期:2026-08-25
> 分类 ID:`2022050410146100000000000003` · 排序:7 · 文章数:5
## 目录
1. [curl 详解](#curl-详解)
2. [Route](#route)
3. [Tptables概念](#tptables概念)
4. [iptables 规则和ACTION](#iptables-规则和action)
5. [协议](#协议)
---
## 1. curl 详解
<sub>bid: `2023031518364800000000000023`</sub>
### Header
使用 -H 来传递参数
curl -H "tenantId=321" -H "authorization=xxxx:XXxx"
### Method
使用 -X 来指定方法
curl -X GET
### URL
对url 进行添加双引号
curl "www.baidu.com"
### example
#### 1. Get
curl -H "authorization:X:XX" -H "tenantid:sssss" -X GET "localhost:8080/violin-api/api/v1/reminder?reminder_id=xxxxxx"
#### 2. Post
curl -H "Content-Type: application/json" -H "authorization:X:XX" -H "tenantid:sssss" -X POST -d '{"title":"xxxxx","info":"xxxxxxxxxxxxx"}' "localhost:8080/violin-api/api/v1/reminder"
### 使用注意
- powershell 中的curl 只是个alise 不适用
- window下的curl 会出现编码问题,尤其"并不会编码 会导致 后台 出现下列错误
{"error":"invalid character '\\'' looking for beginning of value"}
---
## 2. Route
<sub>bid: `2023032623183000000000000024`</sub>
### 路由表
---
`ip route`
ip route 其实是没有体现网关存在。描述的是网卡和目的ip,源ip之间的关系
默认 经过 10.0.8.1 走默认网卡eth0
意思是说,下面路由要是匹配不到的话,就是经过10.0.8.1 网关(网卡设备eth0)
去 10.0.8.0/22 也走 eth0 网卡,但是源ip是10.0.8.13
如果是去172.17.0.0/16 走 docker0网卡,源ip是172.17.0.1
[root@node2 dev]# ip route
default via 10.0.8.1 dev eth0
10.0.8.0/22 dev eth0 proto kernel scope link src 10.0.8.13
169.254.0.0/16 dev eth0 scope link metric 1002
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
`route -n`
route -n 更多的体现着ip地址的设置问题,
直接可以看到默认的网关gateway是10.0.8.1,通过子网掩码,确定网络地址,访问10.0.8.0的网关是0.0.0.0 即,内部网络,不走网关。
[root@node2 dev]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.8.1 0.0.0.0 UG 0 0 0 eth0
10.0.8.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
`ip addr`
inet表示主机地址和所处网络段。
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:39:ea:c4 brd ff:ff:ff:ff:ff:ff
inet 10.0.8.13/22 brd 10.0.11.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe39:eac4/64 scope link
valid_lft forever preferred_lft forever
`Flags 标记`
U(route is up)该路由是启动的
H(target is a host)目标是一台主机(ip)
G(use gateway)需要通过外部的主机传送数据包
R(reinstate route for dynamic routing)使用动态路由时恢复路由标记
D(dynamically installed by daemon or redirect)
已经由服务器或转port功能设置为动态路由!
(reject route)这个路由将不会被接受(用来组织不安全的网段)
注:显示路由信息从上到下是从范围大到小。
`ip neigh`
10.0.8.1 这个ip地址对象的网卡是eth0还有mac,但网卡本省绑定的ip地址10.0.8.3,又和ip addr中 link src 10.0.8.3 一样。
这样就说明了一个问题,同一网段的访问,是不通过网关直接走网卡,不同网段,需要走10.0.8.1
[root@node3 ~]# ip neigh
10.0.8.1 dev eth0 lladdr fe:ee:30:30:20:26 REACHABLE
`gateway:指的是路由通过哪个gateway出去`
`Gateway是0.0.0.0或者*表示目标是本主机所属的网络,不需要路由`
### take in actions
---
---
## 3. Tptables概念
<sub>bid: `2023032623302100000000000025`</sub>
### Tptables概念
---
[新手教学](https://www.zsythink.net/archives/1199)
iptables is a package filter firewall for linux system.
iptables cad do below:
- filter package (封包过滤)
- package redirect (封包重定向)
- network address translation (网络地址转换)
to learn iptables, you should to understand the concepts of below:
#### 1. rules
---
- match :符合指定的条件,比如指定的 IP 地址和端口。
- drop :当一个包到达时,简单地丢弃,不做其它任何处理。
- accept:和丢弃相反,接受这个包,让这个包通过。
- reject:和丢弃相似,但它还会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生
- target:指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
- jump:指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
- rule:一个或多个匹配及其对应的目标。
#### 2. iptables和netfilter的关系
---
iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables
真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。
#### 3. iptables的规则表和链
---
- 表(tables):
iptables内置了4个表,即filter表、nat表、mangle表和raw表。
分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
- 链(chains):
一个有顺序的check list,每一条链中可以有一条或数条规则。
如果满足,系统就会根据该条规则所定义的方法处理该数据包;
否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
- 规则表:
1)filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
2)Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3)Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4)Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw
- 规则链:
1)INPUT——进来的数据包应用此规则链中的策略
2)OUTPUT——外出的数据包应用此规则链中的策略
3)FORWARD——转发数据包时应用此规则链中的策略
4)PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5)POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)
---
### command
[参照](http://t.zoukankan.com/sixloop-p-iptables-save-help.html)
[命令参照](https://zhuanlan.zhihu.com/p/160840906)
iptables --help 也能看到,先列出一些常用的.
-A --append
Append to chain
-m --match match
extended match (may load extension)
-s --source address[/mask][...]
source specification
-d --destination -d address[/mask][...]
destination specification
-j --jump -j target
target for rule (may load target extension)
-p --protocol -p proto
protocol: by number or name, eg. 'tcp'
-N --new -N chain
Create a new user-defined chain
-t --table -t table
table to manipulate (default: `filter')
-i --in-interface -i [!] input name[+]
network interface name ([+] for wildcard)
-o --out-interface -o [!] output name[+]
network interface name ([+] for wildcard)
### 一些memo
---
[新手教学](https://www.zsythink.net/archives/1199)
1. 通常我们只关系nat表和filter表
`raw -> mangle -> nat -> filter`
2. 创建 chain 时候,如果不指定-t table,默认是filter表
3. ! 表示 取非
`-p ! tcp 表示不是tcp的`
4. iptables -h 中的[!]表示支持 非 规则
`[!] --protocol -p proto protocol: by number or name, eg. tcp`
5. -i -o 是匹配网卡
6. iptables -m comment 模块
`iptables -m comment --comment "xxx"`
就是对该chain进行解释。其中comment是扩展模块,常见的模块有addrtype 模块了。
`iptables -m addrtype --dst-type LOCAL -j DOCKER`
`iptables -m addrtype --help 可以看更详细解说`
addrtype表示对报文的地址类型进行匹配,-dst-type 表示destination
LOCAL:表示地址是本地地址,指本地一切地址含:127.0.0.1回环地址
7. -j DNAT 和 -j SNAT
8.
---
## 4. iptables 规则和ACTION
<sub>bid: `2023032623358600000000000026`</sub>
### 规则查询
---
`iptables -t filter -L`
`iptables -nvL INPUT`
[root@node3 ~]# iptables -nvL INPUT
# policy 表示默认规则
Chain INPUT (policy ACCEPT 344K packets, 31M bytes)
pkts bytes target prot opt in out source destination
0 0 in_test tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8000
1741K 187M KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0
### 规则管理
---
`iptables -F INPUT`
# 清空filter表的INPUT链
iptables -F INPUT
# 添加拒绝INPUT规则
# -I 表示链首插入规则,-A 表示链尾添加规则
# 来自49.233.4.79 的 丢弃
iptables -t filter -I INPUT -s 49.233.4.79 -j DROP
# 所以就算添加了下面的ACCEPT规则,也是ping不同的,因为在链首已经被丢弃
iptables -t filter -A INPUT -s 49.233.4.79 -j ACCEPT
# 如果我再把这个规则添加到链首,就可以ping通了。
iptables -t filter -I INPUT -s 49.233.4.79 -j ACCEPT
[root@node3 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 451 packets, 45257 bytes)
pkts bytes target prot opt in out source destination
2 168 ACCEPT all -- * * 49.233.4.79 0.0.0.0/0
5 420 DROP all -- * * 49.233.4.79 0.0.0.0/0
0 0 ACCEPT all -- * * 49.233.4.79 0.0.0.0/0
### 删除规则
---
# 指定编号删除 -D INPUT 3 ,删除INPUT 链中,编号为3的规则
# 先查看规则编号 使用--line
iptables -nvL INPUT --line
iptables -t filter -D INPUT 3
# 根据匹配条件删除
iptables -t filter -D INPUT -s 49.233.4.79 -j ACCEPT
# 整体删除
iptables -t filter -F
### 修改规则
---
# 使用-R 指定链,使用数字 来指定 具有相同数字编号的规则
iptables -t filter -R INPUT 1 -s 49.233.4.79 -j REJECT
# 可以看到 REJECT是拒绝行为
[root@node1 tomcat]# ping 43.138.73.106
PING 43.138.73.106 (43.138.73.106) 56(84) bytes of data.
From 43.138.73.106 icmp_seq=1 Destination Port Unreachable
From 43.138.73.106 icmp_seq=2 Destination Port Unreachable
### 保存规则
---
service iptables save
### 匹配规则
---
1. 如果匹配不到任何规则,那么就匹配默认规则(policy)。
# 小误区,关于! 的用法理解,
iptable -t filter -F
# 不是 49.233.4.79 的都接受,但是并没有说是49.233.4.79的拒绝
# 只是说49.233.4.79的没有匹配到这个规则,因为INPUT 默认都是 ACCEPT
# 所以,49.233.4.79的也会通过
iptables -t filter -A INPUT 1 -s !49.233.4.79 -j ACCEPT
# -s -d 如果不指定,即0.0.0.0/0 即所有ip
# 多个条件是 and 关系,必须都符合
2. 匹配条件:协议类型
# 使用-p选项,指定需要匹配的报文的协议类型
# 比如我们拒绝tcp协议
iptables -t filter -F
iptables -t filter -I INPUT -s 49.233.4.79 -p tcp -j REJECT
# 这样我们ping 是可以ping通的,因为ping是icmp协议
# 而curl 43.138.73.106 是被拒绝的,因为是http(tcp)协议
# centos7中 支持以下协议
# tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
# 不指定协议,即 -p all 任意匹配
3. 匹配条件:网卡接口
# -i -o
# -i 表示来自哪个网卡
# PREROUTING 和 INPUT FORWARD 使用
# -o 表示要去哪个网卡
# POSTROUTING 和 OUTPUT FORWARD 使用
4. -m match 扩展匹配
# 如果想要使用扩展匹配条件,则需要依赖一些扩展模块
# 即扩展匹配,需要使用-m来指定模块
iptables -A INPUT -s 49.233.4.79 -p tcp -m tcp --dport 80 -j REJECT
[root@node3 ~]# iptables -nvL INPUT --line
Chain INPUT (policy ACCEPT 14 packets, 964 bytes)
num pkts bytes target prot opt in out source destination
1 2 120 REJECT tcp -- * * 49.233.4.79 0.0.0.0/0 reject-with icmp-port-unreachable
2 0 0 REJECT tcp -- * * 49.233.4.79 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
# 可以看出 上面是使用-m tcp 使用tcp扩展模块
# 如果-p tcp 和 -m tcp 是一样的时候,-m tcp是可以省略的
# --sport 表示源端口号
# –dport 22:25 表示22,23,24,25 范围
# :22 和 80: 表示 0:22 80:65535
# 多个离散端口使用 multiport 模块
-m multiport –dports 22,36,80
5. -m iprange 扩展模块
使用iprange扩展模块可以指定”一段连续的IP地址范围”,用于匹配报文的源地址或者目标地址
# --src-range --dst-range
-m iprange --src-range 192.168.1.127-192.168.1.146
6. -m conntrack 扩展模块
conntrack 状态跟踪
conntrack共可以为连接标记五种状态:
NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED
### 自定义链
---
自定义链并不能直接使用,而是需要被默认链引用才能够使
# 自定义链IN-WEB
iptables -F INPUT
iptables -N IN-WEB
# 可以看到,自定义链没有被任何默认的链引用,即无效状态。
Chain IN-WEB (0 references)
pkts bytes target prot opt in out source destination
删除 -X 自定义链,但是删除前必须要清空链上的规则
iptables -F IN-WEB
iptables -X IN-WEB
### ACTION
---
我们知道-j target ,target既可以接ACTION,也可以接Chain
我们已知的ACTION有 ACCEPT,DROP,REJECT
`ACCPET`
ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼。
`MARK`
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则
`RETURN`
结束在目前规则炼中的过滤程序,返回主规则炼继续过滤.
如果把自定义规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
`SNAT`
改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后
将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
`DNAT`
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,
将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
`REJECT`
拦阻该封包,并传送封包通知对方
`DROP`
丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序
`REDIRECT`
...
`MASQUERADE`
...
`NAT这个概念:`
NAT是Network Address Translation的缩写,译为”网络地址转换”,NAT说白了就是修改报文的IP地址
-j SNAT --to-source xxx.xxx.xxx.x
-j DNAT --to-destination xxx.xx
### 关于链的顺序
---
- nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
- filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
raw 和 mangle不去考虑的话
表的顺序是 nat -> filter
1. 当一个数据包进入网卡时,它首先进入PREROUTING链
nat -> PREROUTING
2.1 如果数据包就是进入本机的
nat -> INPUT
filter -> INPUT
nat -> OUTPUT
filter -> OUTPUT
2.2 如果数据包是需要转发的
filter -> FORWARD
3. 最后进入POSTROUTING
nat -> POSTROUTING
1
2
---
## 5. 协议
<sub>bid: `2023032623438200000000000027`</sub>
## 协议
传输层TCP -
网路层协议IP - 报文
数据链路层协议MAC - 帧
---
### ARP协议
---
[ARP](https://blog.csdn.net/weixin_39761696/article/details/110578444)
ADDRESS Resolution protocol 是一个通过第三层IP地址,找到第二层MAC的协议。
OSI模型把网络运营分成七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此之间不立即相处。在根据以太网接口推送IP数据时,必须先封装形式第三层(32位IP地址)、再封装第二层(48位MAC地址)的报头,但因为推送时只了解总体目标IP地址,不清楚其MAC地址,又不可以跨第二、三层,因此必须应用地址解析协义。
---