本题是实现一个简化版的 iptables,用于管理 Linux 系统的网络访问控制。通过一系列操作命令,管理员可以定义规则链,并根据这些规则链对IP或CIDR地址进行访问控制。题目要求处理插入、追加、删除规则的操作,并对IP查询进行匹配,输出查询结果。
给定输入包括规则操作和查询命令,要求我们从一个默认规则链 c0 开始匹配 IP 地址,返回匹配的规则结果(Accept 或 Reject),或输出 Unknown 表示没有匹配的规则。
题目核心是处理网络访问规则链,模拟 iptables 的规则匹配机制。主要涉及三种操作:插入、追加和删除规则,以及查询某个IP是否被允许访问。使用链表存储规则链,并且每次根据输入动态更新。
iptables是Linux系统的网络访问控制模块,管理员可通过iptables配置允许从哪些来源IP或IP段访问6个tinux主机。
iptables支持设置多个规则链,每个规则链中可以包含若干条访问控制规则。当系统收到一个网络报文时,会基于系统配置的访问控制规则来决定是接受还是拒绝这个报文。
请开发一个简化版iptables,现给定一系列规则操作命令和查询命令,
请依次输出其中查询命令的IP匹配结果。
规则操作命令有两种格式:
I表示Insert,在对应的规则链开始处插入一条规则,
A表示Append,在对应的规则链结尾处追加一条规则,
D表示从chain_name对应的链中删除一条规则;
action字段A表示Accept,R表示Reject
其中ip_or_cidr字段可以是单个IPV4地址,也可以是CIDR格式的IPV4地址段。
CIDR示例:10.1.0.0/24 表示10.1.0.0到10.1.0.25s这个IP段。
对于一个CDRa.b.c.d/a,如果一个IP地址的前n个bit与a.b.c.d的前n个bit相同,那么这个P属于a.b.c.d/这个IP段。
查询命令的格式: M ip 查询此IP是否被允许访问,M表示Match。输入用例保证一定有一条c0规则链,每一个M操作都从c0链开始依次对每一条规则进行匹配,
输出匹配到的第一条规则的action(A或R)。如果没有匹配到任何规则,输出U(表示Unknown)。只支持通过IP查询,不支持CIDR格式。
第一行:一个整数N(2<=N<=100000),表示总的规则操作命令和查询命令的总数。
接下来N行为规则操作命令或查询命令。
对于每一个M操作,输出规则匹配后的action字段 (A、R或U)
输入
11
A c0 192.168.1.0/24 R
I c0 192.168.1.1 A
A c0 10.1.0.0/24 G c2
A c1 0.0.0.0/0 R
A c2 10.1.0.3 R
A c2 10.1.0.0/24 A
M 192.168.1.1
M 192.168.1.10
D c0 192.168.1.0/24 R
M 192.168.1.10
M 10.1.0.3
输出
ARUR
说明
一共11条配置或查询操作。 规则链c0中包含3条规则,c1中包含1条规则,c2中包含2条规则。 然后查询192.168.1.1,匹配到了cO链中的I c0192.168.1.1 A,输出A;
查询192.168.1.10,匹配到了c0中的A c0 192.168.1.0/24 R,输出R;
接下来删除了c0中的192.168.1.0/24 R规则,再查询192.168.1.10时已没有任何规则可匹配,输出U;
又查询10.1.0.3,先匹配到了c0中的第3条规则,发现要goto c2,于是匹配到了c2中的10.1.0.3 R规则,输出R。
输入
2
A c0 192.168.1.0/24 R
M 192.168.1.20
输出
R
说明
一共2条配置或查询操作。
规则链c0中包含1条规则,拒绝来自192.168.1.0/24的IP。
192.168.1.20属于192.168.1.0/24 这个IP段,因此输出R。