简介
前面文章介绍iptables的匹配条件,并且已经用到了一些常用动作,比如ACCEPT、DROP、REJECT等。
以下是 iptables 中常用的一些目标(target)及其原理和时机:
ACCEPT
原理:允许数据包通过,并停止对后续规则的匹配。
时机:当你想允许特定的数据包通过防火墙时。
DROP
原理:丢弃数据包,并不返回任何错误消息给发送者。
时机:当你想阻止特定的数据包通过防火墙,并且不想让发送者知道数据包已被丢弃时。
REJECT
原理:拒绝数据包,并返回一个错误消息给发送者(通常是 ICMP 类型的消息)。
时机:当你想阻止特定的数据包通过防火墙,并希望发送者知道数据包已被拒绝时。
LOG
原理:记录数据包的信息到系统日志(通常是 /var/log/syslog 或 /var/log/messages),然后根据下一个目标(通常是 DROP 或 REJECT)来处理数据包。
时机:当你想记录通过或未通过防火墙的数据包信息时。
RETURN
原理:结束当前链中的处理,并返回到调用它的链继续处理。
时机:当你使用用户定义的链(user-defined chains)时,并且在处理完特定条件后想返回到主链(如 INPUT、OUTPUT、FORWARD)继续处理。
QUEUE
原理:将数据包放入用户空间队列,以便应用程序(如防火墙脚本)可以进一步处理。
时机:当你想在用户空间中对数据包进行更复杂的处理时。
MARK
原理:设置数据包的 NFMARK 字段。这通常与路由和其他更高级的功能一起使用。
时机:当你需要为数据包设置特定的标记以进行后续处理时。
GOTO
原理:跳转到另一个用户定义的链进行进一步处理。与 RETURN 类似,但不返回,而是继续在新的链中处理。
时机:当你想在一个复杂的用户定义的链结构中进行控制流处理时。
DNAT(目标地址转换)和 SNAT(源地址转换)
原理:修改数据包的源或目标 IP 地址。通常用于 NAT(网络地址转换)场景。
时机:当你想在防火墙级别进行地址转换时,例如,将外部 IP 地址映射到内部服务器。
MASQUERADE(或MASQUERADE-SAVE)
原理:对源地址进行伪装,通常用于从私有网络到公共网络的NAT。
时机:在私有网络中的主机需要访问公共网络时。
TOS 或 TCLASS
原理:修改数据包的Type of Service(TOS)字段(IPv4)或Traffic Class(IPv6)。
时机:根据数据包的优先级或服务类型进行路由决策。
TTL
原理:修改数据包的TTL(Time to Live)字段。
时机:需要控制数据包在网络中的生存时间时。
CT(Connection Tracking)
原理:允许为数据包或其相关连接设置参数,如修改连接的状态或超时值。
时机:需要更精细地控制连接跟踪的行为时。
SECMARK
原理:设置安全标记,用于安全相关的决策。
时机:在需要基于安全标记进行数据包处理时。
CLUSTERIP
原理:配置一个简单的节点集群,这些节点共享特定的IP和MAC地址。
时机:设置负载均衡集群或简单的故障转移配置时。
每个目标都有其特定的用途和适用场景,并且可以根据需要组合使用。当数据包匹配一个规则时,iptables
会根据该规则的目标来执行相应的操作。iptables的功能和可用的target可能会随着Linux内核版本和
iptables/netfilter项目的更新而发生变化。
REJECT动作
REJECT动作的常用选项为--reject-with,使用该选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝。
icmp-port-unreachable
描述:目标端口不可达。
用途:当数据包的目标端口在目标主机上不存在或未打开时,可以使用此选项。
icmp-proto-unreachable
描述:协议不可达。
用途:当数据包使用的协议在目标主机上不支持时,可以使用此选项。
icmp-net-unreachable
描述:网络不可达。
用途:当目标网络不可达时(例如,路由问题),可以使用此选项。
icmp-host-unreachable
描述:主机不可达。
用途:当目标主机不可达时(例如,主机已关闭或崩溃),可以使用此选项。
icmp-net-prohibited
描述:网络被禁止。
用途:当出于某种策略原因(如防火墙规则)拒绝数据包时,可以使用此选项。
icmp-host-prohibited
描述:主机被禁止。
用途:当出于某种策略原因(如防火墙规则)拒绝特定主机的数据包时,可以使用此选项。
icmp-admin-prohibited
描述:管理禁止。
用途:这是一个较通用的错误消息,表示出于管理原因数据包被拒绝。
icmp-fragmentation-needed (在某些iptables版本中可能不可用)
描述:需要分片但设置了不分片位。
用途:当数据包太大而无法在不需要分片的情况下传输时,可以使用此选项(在iptables中可能不直接支持)。
icmp-fragmentation-failed (在某些iptables版本中可能不可用)
描述:分片失败。
用途:当数据包在分片过程中失败时,可以使用此选项(在iptables中可能不直接支持)。
当不设置任何值时,默认值为icmp-port-unreachable
![](https://img-blog.csdnimg.cn/direct/235e05502eee4909b7f44c0421614068.png)
![](https://img-blog.csdnimg.cn/direct/295bb294aad34fb1b81461a62185ccf3.png)
![](https://img-blog.csdnimg.cn/direct/07dfc47a23d44c5ea3e73422606f6163.png)
![](https://img-blog.csdnimg.cn/direct/88428e24eeef414d93ebdd01dfb76a05.png)
LOG动作
iptables中的LOG动作主要用于记录与防火墙规则匹配的数据包的相关信息到日志文件中,但它本身并不决定数据包是被接受还是被拒绝。
默认情况下,LOG动作会将日志信息记录到系统的/var/log/messages
文件中(具体存放在什么位置取决于自己的系统和使用的日志系统),通常这是通过rsyslog或syslogd服务来实现的。也可以将LOG动作的日志信息记录到指定的文件中,以避免与其他日志信息混淆。这可以通过修改rsyslog或syslogd的配置文件(如/etc/rsyslog.conf
或/etc/syslog.conf
)来实现
--log-level
:指定记录日志的日志级别。可用的日志级别包括emerg、alert、crit、error、warning、notice、info、debug等。
--log-prefix
:给记录到的相关信息添加前缀信息,以便区分不同的日志。前缀信息最多可以是29个字符
![](https://img-blog.csdnimg.cn/direct/df301c6f0b3647fe8c2867f637df7293.png)
![](https://img-blog.csdnimg.cn/direct/246a6bef95fc46a0869c094aef53a072.png)
![](https://img-blog.csdnimg.cn/direct/e599374c33844f26ba7e7aebcf2ef745.png)
由于我使用的是systemd-journald如果要区分iptables的日志信息,可以使用iptables的systemd-journald,也可以将iptables的日志发送到特定的日志平台如ELK堆栈,graylog等。
![](https://img-blog.csdnimg.cn/direct/5179ebc880ea465b98218bb2be714886.png)
如果你想要给 FRW-A-C
链中的每个规则都加上日志记录功能,你需要使用 LOG
目标来为每个规则添加日志。但请注意,直接在每个规则前添加 LOG
目标可能会导致日志记录非常频繁,这可能会对你的系统性能产生影响。
在 iptables
中,你可以在每个规则前添加一个 LOG
目标。但是,由于 iptables
的限制,你不能在一个 -A
(追加)操作中同时添加多个目标。因此,你需要为每个规则单独执行 iptables -A
命令。
![](https://img-blog.csdnimg.cn/direct/03ac1b009e254bb1a2b545ea296c1801.png)
![](https://img-blog.csdnimg.cn/direct/7e6b7fce9e9c4a1b94424bdcb1012135.png)
![](https://img-blog.csdnimg.cn/direct/60b87198e10844b384fc30719343c2d2.png)
![](https://img-blog.csdnimg.cn/direct/68413d78c2064a2e8ed0025e6ba2e3dd.png)