\
机器访问外部 HTTP 服务的连接(目的端口 80)
外部访问机器内 FTP 服务的连接(目的端口 21)
机器访问外部 DNS 服务的连接(目的端口 53) 连接跟踪所做的事情就是发现并跟踪这些连接的状态,具体包括:
从数据包中提取元组(tuple)信息,辨别数据流(flow)和对应的连接(connection)。
为所有连接维护一个状态数据库(conntrack table),例如连接的创建时间、发送 包数、发送字节数等等。
回收过期的连接(GC)。
为更上层的功能(例如 NAT)提供服务。 需要注意的是,连接跟踪中所说的“连接”,概念和 TCP/IP 协议中“面向连接”(connection oriented)的“连接”并不完全相同,简单来说:
TCP/IP 协议中,连接是一个四层(Layer 4)的概念。TCP 是有连接的,或称面向连接的(connection oriented),发送出去的包都要求对端应答(ACK),并且有重传机制。UDP 是无连接的,发送的包无需对端应答,也没有重传机制。
conntrack(CT) 中,一个元组(tuple)定义的一条数据流(flow )就表示一条连接(connection)。后面会看到 UDP 甚至是 ICMP 这种三层协议在 CT 中也都是有连接记录的,但不是所有协议都会被连接跟踪。
基于 BPF hook 实现数据包的拦截功能(等价于 netfilter 里面的 hook 机制)
在 BPF hook 的基础上,实现一套全新的 conntrack 和 NAT 因此,即便卸载掉 Netfilter ,也不会影响 Cilium 对 Kubernetes ClusterIP、NodePort、ExternalIPs 和 LoadBalancer 等功能的支持。由于这套连接跟踪机制是独立于 Netfilter 的,因此它的 conntrack 和 NAT 信息也没有 存储在内核的(也就是 Netfilter 的)conntrack table 和 NAT table。所以常规的 conntrack/netstats/ss/lsof 等工具是看不到的,要使用 Cilium 的命令,例如:
$ cilium bpf nat list$ cilium bpf ct list global登录后复制
iptables 包含 4个表,5个链。其中表是按照对数据包的操作区分(过滤, NAT等)的,链是按照不同的 Hook 点来区分的,表和链实际上是netfilter的两个维度。
iptables 的四个表分别是 filter,mangle,nat,raw,默认表是filter。
filter 表:用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包。
nat 表:主要用来修改数据包的 IP 地址、端口号信息。
mangle 表:主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等。
raw 表:主要用来决定是否对数据包进行状态跟踪。 iptables 的五个链分别是 PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
input 链:当收到访问本机地址的数据包时,将应用此链中的规则。
output 链:当本机向外发送数据包时,将应用此链中的规则。
forward 链:当收到需要转发给其他地址的数据包时,将应用此链中的规则,注意如果需要实现forward转发需要开启Linux内核中的ip_forward功能。
prerouting 链:在对数据包做路由选择之前,将应用此链中的规则。
postrouting 链:在对数据包做路由选择之后,将应用此链中的规则。 表和链的对应关系如下图所示: 我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT。
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING。
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING。 我们可以将数据包通过防火墙的流程总结为下图:
-t:表名
-n:不解析IP地址
-v:会显示出计数器的信息,数据包的数量和大小
-x:选项表示显示计数器的**值
--line-numbers:显示规则的序号(简写为--line)
另外,搜索公众号Linux就该这样学后台回复“猴子”,获取一份惊喜礼包。
-L:链名
#iptables -t filter -nvxL DOCKER --lineChain DOCKER (1 references)num pkts bytes target prot opt in out source destination1 5076 321478 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:84432 37233 54082508 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:223 1712 255195 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:90004 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:80005 40224 6343104 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.4 tcp dpt:34436 21034 2227009 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.5 tcp dpt:33067 58 5459 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.6 tcp dpt:808 826 70081 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.6 tcp dpt:4439 10306905 1063612492 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.9 tcp dpt:330610 159775 12297727 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.7 tcp dpt:11111登录后复制
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP登录后复制 在指定表的指定链的首部添加一条规则,-I 选型表示在对应链的开头添加规则:
命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT登录后复制 在指定表的指定链的指定位置添加一条规则:
命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT登录后复制
命令语法:iptables -t 表名 -D 链名 规则序号示例:iptables -t filter -D INPUT 3登录后复制 按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。示例表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则。:
命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP登录后复制 删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则:
命令语法:iptables -t 表名 -F 链名示例:iptables -t filter -F INPUT登录后复制
命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT登录后复制 设置指定表的指定链的默认策略(默认动作):
命令语法:iptables -t 表名 -P 链名 动作示例:iptables -t filter -P FORWARD ACCEPT登录后复制
service iptables save登录后复制 当然,如果你误操作了规则,但是并没有保存,那么使用 service iptables restart 命令重启 iptables 以后,规则会再次回到上次保存 /etc/sysconfig/iptables 文件时的模样。 centos7 中,已经不再使用 init 风格的脚本启动服务,而是使用 unit 文件,所以,在 centos7 中已经不能再使用类似 service iptables start 这样的命令了,所以 service iptables save 也无法执行,同时,在 centos7中,使用 firewall 替代了原来的 iptables service,不过不用担心,我们只要通过 yum 源安装 iptables与iptables-services 即可(iptables 一般会被默认安装,但是iptables-services 在 centos7 中一般不会被默认安装),在centos7 中安装完 iptables-services 后,即可像 centos6 中一样,通过 service iptables save 命令保存规则了,规则同样保存在 /etc/sysconfig/iptables 文件中。此处给出 centos7 中配置 iptables-service 的步骤:
#配置好yum源以后安装iptables-serviceyum install -y iptables-services#停止firewalldsystemctl stop firewalld#禁止firewalld自动启动systemctl disable firewalld#启动iptablessystemctl start iptables#将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务systemctl enable iptables登录后复制 上述配置过程只需一次,以后即可在 centos7 中使用 service iptables save 命令保存 iptables 规则了。
iptables-save > /etc/sysconfig/iptables登录后复制
iptables-restore < /etc/sysconfig/iptables登录后复制
#示例如下iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROPiptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPTiptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT登录后复制 -d 用于匹配报文的目标地址,可以同时指定多个目标地址,每个 IP 之间用逗号隔开,也可以指定为一个网段。
#示例如下iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROPiptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPTiptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT登录后复制 -p 用于匹配报文的协议类型,可以匹配的协议类型 tcp、udp、udplite、icmp、esp、ah、sctp 等(centos7 中还支持 icmpv6、mh)。
#示例如下iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPTiptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT登录后复制 -i 用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在 OUTPUT 链与 POSTROUTING 链中不能使用此选项。
#示例如下iptables -t filter -I INPUT -p icmp -i eth4 -j DROPiptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP登录后复制 -o 用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在 INPUT 链与 PREROUTING 链中不能使用此选项。
#示例如下iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROPiptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP登录后复制
–sport:用于匹配 tcp 协议报文的源端口,可以使用冒号指定一个连续的端口范围。
–dport:用于匹配 tcp 协议报文的目标端口,可以使用冒号指定一个连续的端口范围。
–tcp-flags:用于匹配报文的tcp头的标志位。
–syn:用于匹配 tcp 新建连接的请求报文,相当于使用 –tcp-flags SYN,RST,ACK,FIN SYN 。 注意,-p tcp与 -m tcp 并不冲突,-p 用于匹配报文的协议,-m 用于指定扩展模块的名称,正好,这个扩展模块也叫 tcp。
#示例如下iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECTiptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPTiptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECTiptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECTiptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECTiptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECTiptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT登录后复制
–sport:匹配udp报文的源地址。
–dport:匹配udp报文的目标地址。
#示例iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPTiptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT登录后复制
–icmp-type:匹配icmp报文的具体类型。
#示例iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECTiptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECTiptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECTiptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECTiptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT登录后复制
-p tcp -m multiport –sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开。
-p udp -m multiport –dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开。
#示例如下iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT登录后复制
–src-range:指定连续的源地址范围。
–dst-range:指定连续的目标地址范围。
#示例iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROPiptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROPiptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP登录后复制
牛逼啊!接私活必备的 N 个开源项目!赶快收藏登录后复制
–algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
–string:指定需要匹配的字符串 我们想要达到的目的是,如果报文中包含”OOXX”字符,我们就拒绝报文进入本机:
#示例 iptables -t filter -I INPUT -m string --algo bm --string "OOXX" -j REJECT登录后复制
–timestart:用于指定时间范围的开始时间,不可取反。
–timestop:用于指定时间范围的结束时间,不可取反。
–weekdays:用于指定”星期几”,可取反。
–monthdays:用于指定”几号”,可取反。
–datestart:用于指定日期范围的开始日期,不可取反。
–datestop:用于指定日期范围的结束时间,不可取反。
#示例 iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT登录后复制
–connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
–connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制,如果不明白可以参考上文的详细解释。
#示例 iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT登录后复制
–limit-burst:类比”令牌桶”算法,此选项用于指定令牌桶中令牌的**数量。
–limit:类比”令牌桶”算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。 示例表示限制外部主机对本机进行ping操作时,本机最多每6秒中放行一个ping包
#示例,注意,如下两条规则需配合使用 #令牌桶中最多能存放3个令牌,每分钟生成10个令牌(即6秒钟生成一个令牌)。 iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT #默认将icmp包丢弃 iptables -t filter -A INPUT -p icmp -j REJECT登录后复制
NEW:连接中的第一个包,状态就是 NEW,我们可以理解为新连接的第一个包的状态为 NEW。
ESTABLISHED:我们可以把 NEW 状态包后面的包的状态理解为 ESTABLISHED,表示连接已建立。
RELATED:从字面上理解 RELATED 译为关系,但是这样仍然不容易理解,我们举个例子。比如 FTP 服务,FTP 服务端会建立两个进程,一个命令进程,一个数据进程。命令进程负责服务端与客户端之间的命令传输(我们可以把这个传输过程理解成 state 中所谓的一个”连接”,暂称为”命令连接”)。数据进程负责服务端与客户端之间的数据传输 (我们把这个过程暂称为”数据连接”)。但是具体传输哪些数据,是由命令去控制的,所以,”数据连接”中的报文与”命令连接”是有”关系”的。那么,”数据连接”中的报文可能就是 RELATED 状态,因为这些报文与”命令连接”中的报文有关系。(注:如果想要对ftp进行连接追踪,需要单独加载对应的内核模块 nf_conntrack_ftp,如果想要自动加载,可以配置 /etc/sysconfig/iptables-config 文件)
INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是 INVALID,我们可以主动屏蔽状态为 INVALID 的报文。
UNTRACKED:报文的状态为 untracked 时,表示报文未被追踪,当报文的状态为 Untracked 时通常表示无法找到相关的连接。 刚才举例中的问题即可使用 state 扩展模块解决,我们只要放行状态为 ESTABLISHED 的报文即可,因为如果报文的状态为 ESTABLISHED,那么报文肯定是之前发出的报文的回应,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙:
iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT登录后复制
TOS:用来设置或改变数据包的服务类型域。这常用来设置网络上的数据包如何被路由等策略。注意这个操作并不完善,有时得不所愿。它在Internet 上还不能使用,而且很多路由器不会注意到这个域值。换句话说,不要设置发往 Internet 的包,除非你打算依靠 TOS 来路由,比如用 iproute2。
TTL:用来改变数据包的生存时间域,我们可以让所有数据包只有一个特殊的 TTL。它的存在有 一个很好的理由,那就是我们可以欺骗一些ISP。为什么要欺骗他们呢?因为他们不愿意让我们共享一个连接。那些 ISP 会查找一台单独的计算机是否使用不同的 TTL,并且以此作为判断连接是否被共享的标志。
MARK 用来给包设置特殊的标记。iproute 2能识别这些标记,并根据不同的标记(或没有标记) 决定不同的路由。用这些标记我们可以做带宽限制和基于请求的分类。
例如内网的客户端通过 Linux 主机连入 Internet,而 Linux 主机与Internet 连接时有两条线路,它们的网关如图所示。现要求对内网进行策略路由,所有通过 TCP 协议访问 80 端口的数据包都从 ChinaNet 线路出去,而所有访问 UDP 协议 53 号端口的数据包都从 Cernet 线路出去。
这是一个策略路由的问题,为了达到目的,在对数据包进行路由前,要先根据数据包的协议和目的端口给数据包做上一种标志,然后再指定相应规则,根据数据包的标志进行策略路由。为了给特定的数据包做上标志,需要使用mangle 表,mangle 表共有 5 条链,由于需要在路由选择前做标志,因此应该使用 PREROUTING 链,下面是具体的命令:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1; iptables -t mangle -A PREROUTING -i eth0 -p udp --dprot 53 -j MARK --set-mark 2;登录后复制 数据包经过 PREROUTING 链后,将要进入路由选择模块,为了对其进行策略路由,执行以下两条命令,添加相应的规则:
ip rule add from all fwmark 1 table 10 ip rule add from all fwmark 2 table 20登录后复制 以上两条命令表示所有标志是1的数据包使用路由表 10 进行路由,而所有标志是 2 的数据包使用路由表 20 进行路由。路由表 10 和 20 分别使用了 ChinaNet 和 Cernet 线路上的网关作为默认网关,具体设置命令如下所示:
ip route add default via 10.10.1.1 dev eth1 table 10 ip route add default via 10.10.2.1 dev eth2 table 20登录后复制 以上两条命令在路由表 10 和 20 上分别指定了 10.10.1.1 和 10.10.2.1 作为默认网关,它们分别位于 ChinaNet 和 Cernet 线路上。于是,使用路由表 10 的数据包将通过 ChinaNet 线路出去,而使用路由表20的数据包将通过 Cernet 线路出去。
#在filter表中创建IN_WEB自定义链 iptables -t filter -N IN_WEB登录后复制
#在INPUT链中引用刚才创建的自定义链 iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB登录后复制
#将IN_WEB自定义链重命名为WEB iptables -E IN_WEB WEB登录后复制
1、自定义链没有被引用。
2、自定义链中没有任何规则。
#第一步:清除自定义链中的规则 iptables -t filter -F WEB #第二步:删除自定义链 iptables -t filter -X WEB登录后复制
kern.warning /var/log/iptables.log登录后复制 完成上述配置后,重启rsyslog服务(或者syslogd):
service rsyslog restart登录后复制 LOG 动作也有自己的选项,常用选项如下:
–log-level 选项可以指定记录日志的日志级别,可用级别有 emerg,alert,crit,error,warning,notice,info,debug。
–log-prefix 选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。–log-prefix 对应的值不能超过 29 个字符。 比如,我想要将主动连接22号端口的报文的相关信息都记录到日志中,并且把这类记录命名为”want-in-from-port-22″,则可以使用如下命令:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"登录后复制 完成上述配置后,我在IP地址为 192.168.1.98 的客户端机上,尝试使用 ssh 工具连接上例中的主机,然后查看对应的日志文件(已经将日志文件设置为 /var/log/iptables.log):
如上图所示,ssh 连接操作的报文的相关信息已经被记录到了 iptables.log 日志文件中,而且这条日志中包含”标签”:want-in-from-port-22,如果有很多日志记录,我们就能通过这个”标签”进行筛选了,这样方便我们查看日志,同时,从上述记录中还能够得知报文的源IP与目标IP,源端口与目标端口等信息,从上述日志我们能够看出,192.168.1.98 这个 IP 想要在 14点11分 连接到 192.168.1.139(当前主机的 IP)的22号端口,报文由eth4网卡进入,eth4 网卡的 MAC 地址为 00:0c:29:b7:f4:d1,客户端网卡的 MAC 地址为 f4:8e:38:82:b1:29。
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables/
https://my.oschina.net/mojiewhy/blog/3039897
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#MARKTARGET
https://mp.weixin.qq.com/s/NOxY4ZC7Cay4LCWlMkVx8A
以上就是不会用 Linux 防火墙软件 IPtables!你算啥运维人!的详细内容,更多请关注本网内其它相关文章!