iptables详解:链、表、表链关系、规则的基本使用

news2024/11/19 21:20:20

目录

防火墙基本概念

什么是防火墙?

Netfilter与iptables的关系

链的概念

表的概念

表链关系

规则的概念

查询规则

添加规则

删除iptables中的记录

修改规则

更详细的命令(5链4表)


防火墙基本概念

什么是防火墙?

在计算中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

防火墙分为软件防火墙和硬件防火墙,他们的优缺点: 硬件防火墙:拥有经过特别设计的硬件及芯片,性能高、成本高(当然硬件防火墙也是有软件的,只不过有部分功能由硬件实现,所以硬件防火墙其实是硬件+软件的方式); 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能比硬件防火墙低、成本低。

Netfilter与iptables的关系

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。

Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)

  • 数据包内容修改

  • 以及数据包过滤的防火墙功能

Netfilter平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Netfilter所设置的规则是存放在内核空间中的,而iptables是一个应用层的应用程序,它通过Netfilter放出的接口来对存放在内核空间中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件,类似的应用程序还有firewalld(CentOS7默认防火墙)。

所以Linux中真正的防火墙是Netfilter,但由于都是通过应用层程序如iptables或firewalld进行操作,所以我们一般把iptables或firewalld叫做Linux的防火墙。

注意:以上说的iptables都是针对IPv4的,如果IPv6,则要用ip6tables,至于用法应该是跟iptables是一样的。

注:Linux系统运行时,内存分内核空间和用户空间,内核空间是Linux内核代码运行的空间,它能直接调用系统资源,用户空间是指运行用户程序的空间,用户空间的程序不能直接调用系统资源,必须使用内核提供的接口“system call”。

链的概念

iptables开启后,数据报文从进入服务器到出来会经过5道关卡,分别为Prerouting(路由前)、Input(输入)、Outpu(输出)、Forward(转发)、Postrouting(路由后):

Xnip2019-07-16_15-56-50

每一道关卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把这些关卡都叫“链”

021217_0051_3

  • INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;本机入站

  • OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则;本机出站

  • FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则;

  • PREROUTING链:(互联网进入局域网)在对数据包作路由选择之前,应用此链中的规则,如DNAT;

  • POSTROUTING链:(局域网出互联网)在对数据包作路由选择之后,应用此链中的规则,如SNAT。

其中中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

表的概念

虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”: – filter表:主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter; – nat表:network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat; – mangle表:拆解报文做出修改并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;(应用少) – raw表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。(应用少) 我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。

表链关系

重点的两个链:input post

重要的一个表:filter1

5条链(即5个关卡)中,并不是每条链都能应用所有类型的表,事实上除了Ouptput链能同时有四种表,其他链都只有两种或三种表:

实际上由上图我们可以看出,无论在哪条链上,raw表永远在mangle表上边,而mangle表永远在nat表上边,nat表又永远在filter表上边,这表明各表之间是有匹配顺序的。

前面说过,数据报文必须按顺序匹配每条链上的一个一个的规则,但其实同一类(即属于同一种表)的规则是放在一起的,不同类的规则不会交叉着放,按上边的规律,每条链上各个表被匹配的顺序为:raw→mangle→nat→filter

前面说过,我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中,所以我们实际操作是对“表”进行操作的,所以我们反过来说一下,每种表都能用于哪些链:

表名能应用的链
rawpreroutingoutput
manglepreroutinginputforwardoutputpostrouting
natpreroutinginput(仅centos7)outputpostrouting
filterinputforwardoutput

综上,数据包通过防火墙的流程可总结为下图:

规则的概念

iptables规则主要包含“条件&动作”,即匹配出符合什么条件(规则)后,对它采取怎样的动作。

匹配条件(五元组)

  • S_IP:source ip,源ip

  • S_PORT:source port,源端口

  • D_IP: destination ip,目标ip

  • D_PORT: destination port,目标端口

  • TCP/UDP:第四层(传输层)协议

处理的动作

  • ACCEPT:允许数据包通过;

  • DROP:直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;

  • REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;

  • SNAT:S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;

  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上;

  • DNAT:D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;

  • REDIRECT:在本机做端口映射;

  • LOG:/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

其中REJECT和DROP有点类似,以下是服务器设置REJECT和DROP后,ping这个服务器的响应的区别:

REJECT动作:

PING 10.37.129.9 (10.37.129.9): 56 data bytes
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 29a3   0 0000  40  01 3ab1 10.37.129.2  10.37.129.9
​
Request timeout for icmp_seq 0
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 999d   0 0000  40  01 cab6 10.37.129.2  10.37.129.9

DROP动作:

PING 10.37.129.9 (10.37.129.9): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4

对iptables进行操作,其实就是对它的四种“表”进行“增删改查”操作。

查询规则

命令格式:iptables [选项] [参数]

常用选项:

-L: list的缩写,list我们通常翻译成列表,意思是列出每条链上的规则,因为多条规则就是一个列表,所以用-L来表示。

-L后面还可以跟上5条链(POSTROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)的其中一条链名,注意链名必须全大写,如查看“INPUT链”上的规则:

iptables -L INPUT (这里默认就是-t filter)
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

 不指定的话就是默认查看所有链上的规则列表:

iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
​
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
  • Chain INPUT: INPUT链上的规则,同理,后面的“Chain FORWARD”、“Chain OUTPUT”分别是FORWARD链和OUTPUT链上的规则;

  • (policy ACCEPT): 表示默认策略是接受,即假如我没设置,那就是允许,只有我设置哪个不允许,才会不允许,示例中是安装iptables后的默认规则,由于默认是ACCEPT,你规则也设置为ACCEPT按道理来说是没什么意义的,因为你不设置也是ACCEPT呀,但事实上,是为了方便修改为REJECT/DROP等规则,说白了就是放在那,要设置的时候我们就可以直接修改;

  • target: 英文意思是“目标”,但该列的值通常是动作,比如ACCEPT(接受)、REJECT(拒绝)等等,但它确实可以是“目标”,比如我们创建 一条链iptables -N July_filter,然后在INPUT链上添加一条规则,让它跳转到刚刚的新链-A INPUT -p tcp -j July_filter,再用iptables -L查看,可以看到target此时已经是真正的“target(July_filter)”而不再是动作了:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
July_filter  tcp  --  anywhere             anywhere
​
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
​
Chain July_filter (1 references)
target     prot opt source               destination
  • prot: protocol,协议;

  • opt: option,选项;

  • source: 源地址(ip(可以是网段)/域名/主机名)

  • destination: 目标地址(ip(可以是网段)/域名/主机名)

  • 末列: 一些额外的信息


-t:前面-L不是列出所有链的规则列表吗?为什么没有PREROUTING和POSTROUTING链呢?

因为有默认参数-t,t是table的缩写,意思是指定显示哪张“表”中的规则(前面说过iptables有四种表),iptables -L其实就相当于iptables -t filter -L,即相当于你查看的是“filter”表中的规则。而根据前面的讲解,filter表只可用于INPUT、FORWARD、OUTPUT三条链中,这就是为什么iptables -L不显示PREROUTING链和POSTROUTING链的原因。


-n: numeric的缩写,numeric意思是数字的,数值的,意思是指定源和目标地址、端口什么的都以数字/数值的方式显示,否则默认会以域名/主机名/程序名等显示,该选项一般与-L合用,因为单独的-n是没有用的(没有-L列表都不显示,所以用-n就没有意义了)。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
​
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

其中dpt:22中的dpt是指destination port(目标端口),同理,spt就是source port(源端口)。


-v: 基本上有点Linux常识的童鞋就应该知道,-v在Linux命令里,一般都是指“verbose”,这个词的意思是是“冗余的,啰嗦的”,即输出更加详细的信息,在iptables这里也是这个意思,一般可以跟-L连用:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
13627 1033K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    2   128 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
  275 53284 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 12506 packets, 1485K bytes)
 pkts bytes target     prot opt in     out     source               destination

可以看到多了四列:

  • pkts: packets,包的数量;

  • bytes: 流过的数据包的字节数;

  • in: 入站网卡;

  • out: 出站网卡。

当然还可以跟前面的-n合用:

iptables -n -v -L  
-n:以数字的形式展示
-v:详细的输出
-L:指定查看的表(不指定则全部输出)

这样source和destination中用域名或者字符串表示的方式就换成ip了:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
13642 1034K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    2   128 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
  275 53284 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
​
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
​
Chain OUTPUT (policy ACCEPT 12516 packets, 1489K bytes)
 pkts bytes target     prot opt in     out     source               destination

稍微了解Linux命令的童鞋应该都知道,在很多情况下,Linux的选项是可以合并的,比如前面的iptables -n -v -L其实是可以合并成iptables -nvL的,并且参数顺序一般情况下是无关紧要的,比如iptables -vnL也是一样的。

但是-L一定要写在最后,原因是-L是要接收参数的选项(虽然可以不传参数),而-v-n是不需要接收参数的,假如你写成iptables -Lvn,那就表示是用-n来接收参数了,这肯定是不行的。


-x: 加了-v后,Policy那里变成了“(policy ACCEPT 0 packets, 0 bytes)”,即多了过滤的数据包数量和字节数,其中的字节数,如果数据大了之后,会自动转换单位,比如够KB不够MB,它会显示“xxxk”,够了MB它显示“MB”,但单位转换之后,就不完全精确了,因为它没有小数,如果还是想要看以“字母”即“byptes”为单位查看的话,加个-x就行了,“x”来自于“exact”,意思是“精确的;准确的”,不取首字母应该是太多选项首字母是e了。


--line-numbers: 如果你想列表有序号,可以加上该选项:

iptables -nvL --line-numbers

结果中多了一列“num”,就是序号:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1    14739 1123K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4        2   128 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5      305 55948 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
6        0     0 July_filter  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
​
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
​
Chain OUTPUT (policy ACCEPT 310 packets, 42772 bytes)
num   pkts bytes target     prot opt in     out     source               destination
​
Chain July_filter (1 references)
num   pkts bytes target     prot opt in     out     source               destination

其实,--line-numbers并不用写全,不然也太长了,其实写成--line就行了,甚至你不写最后一个e,即写成--lin都行。

合并使用各选项的命令示例:

iptables --line -t filter -nvxL INPUT --list-number
n:数字的形式展示
v:展示详情
L:指定要查看的表(不指定则显示全部)
x:精准的
--line-number:增加列表

添加规则

我们可以向某条链中的某个表的最前面添加记录(我们叫“插入”,会用到-I选项,I表示Insert(指定插入的位置)),也可以向某条链中的某个表的最后面添加记录(我们叫“追加”,会用到-A选项,A表示Append(插入到末尾)),熟悉vi/vim的童鞋会对这个“I”和“A”感觉到熟悉,因为在vi/vim的命令模式下,按I是在光标所行的行首插入,按A是在光标所在行的行尾插入,跟这个在表头跟表尾插入非常像。

之所以有向前添加和向后添加,是因为如果前面规则的是丢弃或拒绝,那么后面的规则是不会起作用的;而如果前面的是接受后面的是丢弃或拒绝,则接受之后后面的丢弃或拒绝也是不会生效的。

向INPUT链的filter表中添加一条规则:

iptables -t(指定表) filter -I(指定插入) INPUT -s(匹配源ip) 10.37.129.2 -j(跳转) DROP
  • -t: 是指定插入到哪个表中,不写的话默认为“filter”表;

  • -I: 指定插入到哪条链中,并且会在该链指定表(在这里是filter表)中的最前面插入(I:Input),如果用-A则是在最后插入(A:Append)。

  • -s: 匹配源ip,s: source,源。

  • -j: jump,跳转的意思,后面可指定跳转的target(目标),比如自定义的链,当然更多的是跳转到“action(动作)”中,比如ACCEPT、DROP、REJECT等等。

  • 整个意思,就是向iptables中的“INPUT”链(-I INPUT)的“filter”表(-t filter)的最前面(-I)添加一条记录,这次记录会匹配源地址为“10.39.129.2”的请求(-s 10.39.129.2),并把该请求丢弃掉(-j DROP)。

例如:

iptables -t filter -I INPUT -s 192.168.159.0/24 -j DROP

如果敲完命令后自己所连接的ip是该网段那么远程连接会断开

需要在虚拟机中删除这条记录,然后才能正常的远程登录

删除iptables中的记录

1、根据编号删除: 前面说过,查询iptables规则列表时,添加--line-numbers简写成--line即可显示记录编号,我们现在就可以根据这个编号来删除了:

iptables -t filter -D INPUT 2

-t filter指定操作的表为filter表,-D表示delete,后面跟的两个参数,第一个是链名,第二个是要删除的规则的编号。

例如:

iptables -t filter -D input 1

这样执行完成后,远程连接功能就会可以恢复了

2、根据条件删除:

iptables -t filter -D INPUT -s 10.37.129.2 -j DROP

删除INPUT链中的filter表中源地址为“10.37.129.2”并且动作为“DROP”的规则。

3、清空:-F -F: flush的缩写,flush是“冲洗、冲掉”的意思,在这里是清空的意思,iptables -t filter -F INPUT代表清空“INPUT”链中“filter”表中的所有规则,如果不指定链不指定表,即直接用iptables -F,则清空所有链中所有表的规则。

注:在生产环境中轻易不要使用这个方法

修改规则

事实上用“替换”来描述会更好一点,因为所谓的修改其实就是把整个规则替换成新的规则:

iptables -t filter -R(replace) INPUT 1 -s 10.37.129.3 -j ACCEPT

其中的-R就是replace,即替换的意思,整句命令意思是从INPUT链中的filter表中替换编号为1的规则,编号1后面的-s 10.37.129.3 -j ACCEPT就是要替换成的新规则。

修改策略(policy):

iptables -P(policy) FORWARD DROP

-P: policy,即策略。

整个意思是把FORWARD链的默认规则设置为DROPiptables [-t table] -P chain target这个说明,表示可以根据不同的表,设置不同的限制

iptables -t raw -P OUTPUT ACCEPT
iptables -t filter -P OUTPUT DROP

例如:

//防止自己的终端被禁止
iptables -t filter -I INPUT -s 192.168.159.0/24 -j ACCEPT
//将默认规则修改为DROP
iptables -P INPUT DROP

更详细的命令(5链4表)

-d:destination,用于匹配报文的目标地址,可以同时指定多个ip(逗号隔开,逗号两侧都不允许有空格),也可指定ip段:

iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
iptables -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 ACCEPT
# 感叹号表示“非”,即除了匹配这个条件的都ACCEPT,但匹配这个条件不一定就是REJECT或DROP?这要看是否有为它特别写一条规则,如果没有写就会用默认策略:
iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT

上面的规则中,使用”! -s 192.168.1.146″表示对 -s 192.168.1.146这个匹配条件取反, -s 192.168.1.146表示报文源IP地址为192.168.1.146即可满足匹配条件,使用 “!” 取反后则表示,报文源地址IP只要不为192.168.1.146即满足条件,那么,上例中规则表达的意思就是,只要发往本机的报文的源地址不是192.168.1.146,就接受报文。

此刻,你猜猜,按照上例中的配置,如果此时从146主机上向防火墙所在的主机发送ping请求,146主机能得到回应吗?(此处不考虑其他链,只考虑filter表的INPUT链)

答案是:能,也就是说,按照上例的配置,146主机仍然能够ping通当前主机,为什么呢?我们来分析一下。

上例中,filter表的INPUT链中只有一条规则,这条规则要表达的意思就是:

只要报文的源IP不是192.168.1.146,那么就接受此报文,但是,某些小伙伴可能会误会,把上例中的规则理解成如下含义,

只要报文的源IP是192.168.1.146,那么就不接受此报文,这种理解与上述理解看似差别不大,其实完全不一样,这样理解是错误的,上述理解才是正确的。

换句话说就是,报文的源IP不是192.168.1.146时,会被接收,并不能代表,报文的源IP是192.168.1.146时,会被拒绝。

上例中,因为并没有任何一条规则指明源IP是192.168.1.146时,该执行怎样的动作,所以,当来自192.168.1.146的报文经过INPUT链时,并不能匹配上例中的规则,于是,此报文就继续匹配后面的规则,可是,上例中只有一条规则,这条规则后面没有其他可以匹配的规则,于是,此报文就会去匹配当前链的默认动作(默认策略),而上例中,INPUT链的默认动作为ACCEPT,所以,来自146的ping报文就被接收了,如果,把上例中INPUT链的默认策略改为DROP,那么,146的报文将会被丢弃,146上的ping命令将得不到任何回应,但是如果将INPUT链的默认策略设置为DROP,当INPUT链中没有任何规则时,所有外来报文将会被丢弃,包括我们ssh远程连接。

-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项:

iptables -t filter -I INPUT -p icmp -i eth0 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth0 -j DROP

-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。

iptables -t filter -I OUTPUT -p icmp -o eth0 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth0 -j DROP

以上就是iptables中一些常见词的详解和规则的简单用法,下一篇将会对一些扩展模块的使用详细介绍 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【腾讯云云上实验室-向量数据库】探索腾讯云向量数据库:全方位管理与高效利用多维向量数据的引领者

目录 前言1 腾讯云向量数据库介绍2 向量数据库信息及设置2.1 向量数据库实例信息2.2 实例监控2.3 密钥管理2.4 安全组2.5 Embedding2.6 可视化界面 3 可视化界面4 Embedding4.1 embedding_coll精确查询4.2 unenabled_embedding_coll精确查询 5 数据库5.1 创建数据库5.2 插入数据…

带你精通chrony服务器

华子目录 为什么会出现Chrony?Linux的两个时钟NTP介绍Chrony介绍安装与配置安装Chrony配置文件分析实验1实验2chronyc命令查看时间服务器chronyc sources输出分析其他命令 常见时区 为什么会出现Chrony? 由于IT系统中,准确的计时非常重要&am…

C++标准模板(STL)- 类型支持 (类型关系,检查两个类型是否相同,std::is_same)

类型特性 类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完…

Python中,我们可以使用pandas和numpy库对Excel数据进行预处理,包括读取数据、数据清洗、异常值剔除等

文章目录 一、什么是数据预处理二、对excel数据进行详细的数据预处理操作总结 一、什么是数据预处理 数据预处理是一种对数据进行清洗、整理、转换等操作的过程&#xff0c;旨在提高数据质量&#xff0c;使其适应模型的需求&#xff0c;从而改进数据挖掘或机器学习的结果。 数…

Maven依赖管理项目构建工具(保姆级教学---下篇)

对于Maven依赖管理项目构建工具的介绍&#xff0c;我们将其分为上篇和下篇。如果您对文章感兴趣&#xff0c;您可以在此链接中找到上篇详细内容&#xff1a; Maven依赖管理项目构建工具&#xff08;保姆级教学上篇&#xff09;-CSDN博客 一、Maven依赖传递和依赖冲突 1. …

Portraiture2024PS/LR专用智能磨皮插件,AI算法美颜,提高P图效率

ps皮肤美白磨皮滤镜有吗&#xff1f;ps本身无自带美白磨皮滤镜&#xff0c;虽然部分滤镜有磨皮、提亮功能&#xff0c;但往往需要搭配蒙版、通道功能使用。但ps可安装第三方软件&#xff0c;比如常用的磨皮插件portraiture3&#xff0c;那么&#xff0c;磨皮插件portraiture3怎…

Kotlin 知识体系

Kotlin 知识体系 1、Kotlin 文档2、Kotlin 基础3、桌面应用程序4、Android 与 iOS 应用程序 1、Kotlin 文档 Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复…

Python (十二) 模块、包

模块 模块是以 .py后缀的文件&#xff0c;包含所有定义的函数和变量的文件。 模块可以被别的程序引入&#xff0c;以使用该模块中的函数等功能&#xff0c;如python 标准库、第三方模块等。 导入模块用关键词-import,from ...import 引入python标准库math模块 import math #调用…

Alien Skin Exposure2024胶片滤镜中文免费版插件

Exposure是一个在你的照片上实现完整个人看法的终极工具。它是一个完整、强大、多才多艺的照片编辑器和组织者&#xff0c;并且带有你在市场上任何软件中都找不到的独特功能。 Alien Skin Exposure是我处理图片主要的一款软件。Exposure整体界面非常直观&#xff0c;而且操作易…

Linux使用ifconifg命令,没有显示ens33

Linux使用ifconifg命令&#xff0c;没有显示ens33 1.问题2.步骤2.1 查看虚拟机的组件是否启动了2.2 修改网络配置文件 ONBOOT修改为yes2.3 重启网络2.4 修改网络服务配置 3.解决 1.问题 打开虚拟机准备使用xshell连接时发现连接失败&#xff0c;在机器上查看ip发现ens33不现实…

使用 Filebeat+Easysearch+Console 打造日志管理平台

近年来&#xff0c;日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志&#xff0c;挖掘日志数据价值&#xff0c;驱动运维、运营&#xff0c;提升服务管理效率。 方案架构 Beats 是轻量级采集器&#xff0c;包括 Filebeat、Metricbeat 等。E…

【数据结构(二)】队列(2)

文章目录 1. 队列的应用场景和介绍1.1. 队列的一个使用场景1.2. 队列介绍 2. 数组模拟队列2.1. 思路分析2.2. 代码实现 3. 数组模拟环形队列3.1. 思路分析3.2. 代码实现 1. 队列的应用场景和介绍 1.1. 队列的一个使用场景 银行排队的案例&#xff1a; 1.2. 队列介绍 队列是一…

数据采集与大数据架构分享

实现场景 要实现亿级数据的长期收集更新&#xff0c;并对采集后的数据进行整理和加工&#xff0c;用于人工智能的训练数据素材集。 数据采集 java支持的爬虫框架还是有很多的&#xff0c;如&#xff1a;webMagic、Spider、Jsoup等添加链接描述 pipeline处理管道 数据并发开发…

Dubbo的优雅下线原理分析

文/朱季谦 Dubbo如何实现优雅下线&#xff1f; 这个问题困扰了我一阵&#xff0c;既然有优雅下线这种说法&#xff0c;那么&#xff0c;是否有非优雅下线的说法呢&#xff1f; 这&#xff0c;还真有。 可以从linux进程关闭说起&#xff0c;其实&#xff0c;我们经常使用到杀…

(C++)字符串相加

愿所有美好如期而遇 题目链接&#xff1a;415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09; 思路 我们看到字符串长度可能到达一万&#xff0c;而且不允许使用处理大整数的库&#xff0c;也就是说&#xff0c;转成整数相加后再转成字符串是不可行的。 那么我们就让…

在VS Code中使用VIM

文章目录 安装和基本使用设置 安装和基本使用 VIM是VS Code的强大对手&#xff0c;其简化版本VI是Linux内置的文本编辑器&#xff0c;堪称VS Code问世之前最流行的编辑器&#xff0c;也是VS Code问世之后&#xff0c;我仍在使用的编辑器。 对VIM无法割舍的原因有二&#xff0…

Java Swing算术我最棒

内容要求 1) 本次程序设计是专门针对 Java 课程的,要求使用 Java 语言进行具有一定代码量的程序开发。程序的设计要结合一定的算法&#xff0c;在进行代码编写前要能够设计好自己的算法。 本次程序设计涉及到 Java 的基本语法&#xff0c;即课堂上所介绍的变量、条件语句、循…

[ATC复盘] abc329 20231118

[ATC复盘] abc329 20231118 总结A - Spread1. 题目描述2. 思路分析3. 代码实现 B - Next1. 题目描述2. 思路分析-3. 代码实现 C - Count xxx1. 题目描述2. 思路分析3. 代码实现 D - Election Quick Report2. 思路分析3. 代码实现 E - Stamp2. 思路分析3. 代码实现 F - Colored…

Compose学习之绘制速度表盘

内心想法XX compose已经发布好久了&#xff0c;还没有用过compose写过UI&#xff0c;之前只是在官网上了解过&#xff0c;看着这可组合函数嵌套&#xff0c;我就脑袋大&#xff0c;更Flutter一个德行&#xff0c;我的内心是抵触的&#xff0c;还是觉得用XML写香&#xff0c;抱…

DPAFNet:一种用于多模式脑肿瘤分割的残差双路径注意力融合卷积神经网络

DPAFNet: A Residual Dual-Path Attention-Fusion Convolutional Neural Network for Multimodal Brain Tumor Segmentation DPAFNet&#xff1a;一种用于多模式脑肿瘤分割的残差双路径注意力融合卷积神经网络背景贡献实验方法ulti-scale context feature extraction block&…