iptables详解(12):iptables动作总结之一

  • A+
所属分类:IPtables  Linux基础

在本博客中,从理论到实践,系统的介绍了iptables,如果你想要从头开始了解iptables,可以查看iptables文章列表,直达链接如下

iptables零基础快速入门系列

 

前文一直在介绍iptables的匹配条件,并没有对动作进行过总结,那么此处,我们就来总结一下iptables中的动作。

之前的举例中已经用到了一些常用动作,比如ACCEPT、DROP、REJECT等。

其实,"动作"与"匹配条件"一样,也有"基础"与"扩展"之分。

同样,使用扩展动作也需要借助扩展模块,但是,扩展动作可以直接使用,不用像使用"扩展匹配条件"那样指定特定的模块。

 

之前用到的ACCEPT与DROP都属于基础动作。

而REJECT则属于扩展动作。

 

之前举过很多例子,我们知道,使用-j可以指定动作,比如

-j ACCEPT

-j DROP

-j REJECT

 

其实,"动作"也有自己的选项,我们可以在使用动作时,设置对应的选项,此处以REJECT为例,展开与"动作"有关的话题。

 

动作REJECT

REJECT动作的常用选项为--reject-with

使用--reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝。

可用值如下

icmp-net-unreachable

icmp-host-unreachable

icmp-port-unreachable,

icmp-proto-unreachable

icmp-net-prohibited

icmp-host-pro-hibited

icmp-admin-prohibited

当不设置任何值时,默认值为icmp-port-unreachable。

 

我们来动手实践一下,在主机139上设置如下规则,如下图所示,当没有明确设置--reject-with的值时,默认提示信息为icmp-port-unreachable,即端口不可达之意。

iptables详解(12):iptables动作总结之一

此时在另一台主机上向主机139发起ping请求,如下图所示,提示目标端口不可达。

iptables详解(12):iptables动作总结之一

 

那么我们将拒绝报文的提示设置为"主机不可达",示例如下

iptables详解(12):iptables动作总结之一

如上图所示,我们在设置拒绝的动作时,使用了--reject-with选项,将提示信息设置为icmp-host-unreachable,完成上述操作后,我们再次在在另一台主机上向主机139发起ping请求。

如下图所示。

iptables详解(12):iptables动作总结之一

可以看到,ping请求被拒绝时,提示信息已经从"目标端口不可达"变成了"目标主机不可达"。

 

动作LOG

在本博客中,前文并没有对LOG动作进行示例,此处我们来了解一下LOG动作。

使用LOG动作,可以将符合条件的报文的相关信息记录到日志中,但当前报文具体是被"接受",还是被"拒绝",都由后面的规则控制,换句话说,LOG动作只负责记录匹配到的报文的相关信息,不负责对报文的其他处理,如果想要对报文进行进一步的处理,可以在之后设置具体规则,进行进一步的处理。

示例如下,下例表示将发往22号端口的报文相关信息记录在日志中。

iptables详解(12):iptables动作总结之一

如上图所示,上述规则表示所有发往22号端口的tcp报文都符合条件,所以都会被记录到日志中,查看/var/log/messages即可看到对应报文的相关信息,但是上述规则只是用于示例,因为上例中使用的匹配条件过于宽泛,所以匹配到的报文数量将会非常之多,记录到的信息也不利于分析,所以在使用LOG动作时,匹配条件应该尽量写的精确一些,匹配到的报文数量也会大幅度的减少,这样冗余的日志信息就会变少,同时日后分析日志时,日志中的信息可用程度更高。

注:请把刚才用于示例的规则删除。

 

从刚才的示例中我们已经了解到,LOG动作会将报文的相关信息记录在/var/log/message文件中,当然,我们也可以将相关信息记录在指定的文件中,以防止iptables的相关信息与其他日志信息相混淆,修改/etc/rsyslog.conf文件(或者/etc/syslog.conf),在rsyslog配置文件中添加如下配置即可。

#vim /etc/rsyslog.conf

kern.warning /var/log/iptables.log

加入上述配置后,报文的相关信息将会被记录到/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详解(12):iptables动作总结之一

 

完成上述配置后,我在IP地址为192.168.1.98的客户端机上,尝试使用ssh工具连接上例中的主机,然后查看对应的日志文件(已经将日志文件设置为/var/log/iptables.log)

iptables详解(12):iptables动作总结之一

如上图所示,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。

 

除了ACCEPT、DROP、REJECT、LOG等动作,还有一些其他的常用动作,比如DNAT、SNAT等,我们会在之后的文章中对它们进行总结。

希望这篇文章能够对你有所帮助。

 
 

weinxin
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
朱双印

发表评论取消回复

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:17   其中:访客  11   博主  6

    • avatar L1nux 0

      兄弟 你写的也太棒了

      • avatar haha123 2

        -j LOG DROP 这样使用会报错,难道需要做LOG的规则,都要做两条么?有什么办法?

          • avatar katefic 1

            @haha123 是要写两条,下面是man iptables里面的
            LOG
            Turn on kernel logging of matching packets. When this option is set for a rule, the Linux kernel will print some information on all
            matching packets (like most IP header fields) via the kernel log (where it can be read with dmesg or syslogd(8)). This is a “non-
            terminating target”, i.e. rule traversal continues at the next rule. So if you want to LOG the packets you refuse, use two separate
            rules with the same matching criteria, first using target LOG then DROP (or REJECT).

          • avatar 捡头大魔王 0

            你好,博主,请问在很多地方都看到 INPUT_direct, INPUT_ZONES_SOURCE, INPUT_ZONES ,这三个target,请问这三个target是什么意思?

            • avatar yann 0

              如果修改/etc/rsyslog.conf文件,实际/var/log/messages 同时也在写入。有什么方法只写入到指定的日志路径里呢

              • avatar 老张 2

                谢谢博主的好文。
                菜鸟也就只能找找可能的错别字了。

                当然,我们有可以将相关信息记录在指定的文件中
                也可以?

                  • avatar 朱双印 Admin

                    @老张 感谢指正,错误已经修改,共勉,加油~

                  • avatar 杨某人 1

                    朱兄你就是我的偶像,你的文章超级好

                    • avatar 问天 0

                      朱兄,最近遇到这么个问题,某个网口所有的流量我都做了SNAT和DNAT的转发,但是其中的WEB80端口的数据,和22端口的数据我不希望它转发而希望他正常返回我该怎么做呢?
                      多谢!

                        • avatar 朱双印 Admin

                          @问天 兄弟,你的意思是在网络防火墙上排除80端口与22端口的映射吗??
                          在做DNAT的时候需要指定端口,只要把这两个端口排除在外就行了,这样做不行吗?还是我没有理解你的意思??

                            • avatar 朱双印 Admin

                              @朱双印 现在已经可以通过127.1.0.2的各个端口访问后端主机B中各个IP对应的端口,是这样吗?但是你访问主机A的80端口和22端口的时候,也会被映射??我还是不清楚,你想要排除的80端口和22号端口是哪个主机上的,是哪个IP的,哪个网口上的??能再说清楚点吗?或者说主机A和主机B的规则都是什么样的,方便的话贴出来,更容易理解你的问题,还有,在DNAT的时候需要指定端口的,为什么要映射80和22呢,不映射它们不就不会转发了?还有,你说的转发是从哪里访问哪里,访问的方向和流程说一下

                              • avatar 问天 3

                                @朱双印 多谢帮助 问题已经解决了 在PREROUTING链中添加了80 22的-j ACCEPT就不会被转发了,之前我一直还以为ACCEPT只能用在filter中.. :arrow: :arrow:

                                  • avatar 朱双印 Admin

                                    @问天 666,学习到了,以后遇到这种情况就知道怎么解决了,我的方法并没有帮助到你,反而是你自己提供了正确答案,让我get新技能,很6,加油~~~

                              • avatar echo 6

                                打卡 学习

                                  • avatar 朱双印 Admin

                                    @echo 兄弟很有毅力啊,加油~~~

                                  • avatar 小石头 1

                                    消灭零回复!文章很棒!