476 lines
18 KiB
Markdown
476 lines
18 KiB
Markdown
# 计算机网路
|
||
|
||
> 来源:原 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地址,又不可以跨第二、三层,因此必须应用地址解析协义。
|
||
|
||
---
|