# 计算机网路 > 来源:原 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 详解 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: 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概念 --- [新手教学](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 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](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地址,又不可以跨第二、三层,因此必须应用地址解析协义。 ---