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

18 KiB
Raw Permalink Blame History

计算机网路

来源:原 mongodb 集合 t_blog · 整理日期:2026-08-25 分类 ID:2022050410146100000000000003 · 排序:7 · 文章数:5

目录

  1. curl 详解
  2. Route
  3. Tptables概念
  4. iptables 规则和ACTION
  5. 协议

1. curl 详解

bid: 2023031518364800000000000023

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

bid: 2023032623183000000000000024

路由表


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概念

bid: 2023032623302100000000000025

Tptables概念


新手教学 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

参照 命令参照

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


新手教学

  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


4. iptables 规则和ACTION

bid: 2023032623358600000000000026

规则查询


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. 协议

bid: 2023032623438200000000000027

协议

传输层TCP - 网路层协议IP - 报文 数据链路层协议MAC - 帧

ARP协议


ARP ADDRESS Resolution protocol 是一个通过第三层IP地址,找到第二层MAC的协议。 OSI模型把网络运营分成七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此之间不立即相处。在根据以太网接口推送IP数据时,必须先封装形式第三层(32位IP地址)、再封装第二层(48位MAC地址)的报头,但因为推送时只了解总体目标IP地址,不清楚其MAC地址,又不可以跨第二、三层,因此必须应用地址解析协义。