前言
简单地说,iptables是Linux的防火墙程序。它将使用表监控进出服务器的流量。这些表包含称为链的规则集,这些规则将过滤传入和传出数据包。
作用
当数据包与规则匹配的时候,会为其指定一个目标,该目标可以是另一条链 或者是以下的特殊值之一:
ACCEPT 允许数据包通过 DROP 直接丢弃 RETURN 组织数据包遍历链并告诉它返回到上一个链(没用过) iptables 规则仅适用于 IPv4。如果要为 ipv6 协议设置防火墙,则需要改用 ip6tables。
默认我们使用的是filter表,常说三表五链,但是我所了解的更多有关于filter表和nat表。 首先大概了解一下报文经过防火墙时大概经历了哪些。
这里我们跳过安装部分。 介绍几个常见的指令: 查看当前的iptables 的配置: iptables -nL 我们可以观察到一开始的所有的链上面的规则默认都是ACCEPT的。这明显是不安全的,说明任何的数据包到达之后我们都可以直接通过。图中圈起来的是默认策略,可以进行修改。 修改对应链的默认配置: iptables -P FORWARD DROP 往对应链增加新规则: iptables -A INPUT -p tcp --dport 8080 -j ACCEPT 比如说我想让所有访问tcp协议,访问我的主机的8080号端口的都放行,我可以在INPUT链做操作。 语法: iptables -A -i -p -s --dport -j
-i (接口) — 要过滤其流量的网络接口,例如 eth0、lo、ppp0 等。 -p(协议) — 进行过滤过程的网络协议。它可以是tcp,udp,udplite,icmp,sctp,icmpv6等。或者,您可以键入 all 以选择每个协议。 -s(源) — 流量来自的地址。您可以添加主机名或 IP 地址。 –dport (目标端口) — 协议的目标端口号,例如 22 (SSH)、443 (https) 等。 -j (target) — 目标名称(ACCEPT, DROP, RETURN)。每次创建新规则时都需要插入此规则。
那么要是想在链头新增规则,可以采用-I 指定链 + number 进行插入,默认插入到第一行。 iptables -I INPUT -p tcp --dport 22 -j DROP 执行上面指令,就能让ssh失去连接。 那我如果后悔了,我的xshell或者vs code链接不上虚拟机了,此时可以使用 iptables -D INPUT 1 删除第一条规则,然后就可以恢复正常了。 要是嫌麻烦iptables -F
可以删除所有链上已有的规则,可以指定链,默认对filter表的链全部进行删除。
基于源过滤数据包 Iptables 允许您根据 IP 地址或 IP 地址范围过滤数据包。您需要在 -s 选项后指定它。例如,要接受来自 192.168.1.3 的数据包,命令将是: sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT
如果要丢弃来自某个 IP 地址范围的数据包,则必须使用 -m 选项和 iprange 模块。然后,使用 –src-range 指定 IP 地址范围。请记住,连字符应分隔不带空格的 IP 地址范围,如下所示: sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
丢弃所有其他流量 在定义 –dport 规则后,将 DROP 目标用于所有其他流量至关重要。这将防止未经授权的连接通过其他开放端口访问服务器。要实现此目的,只需键入:
sudo iptables -A INPUT -j DROP
持久化和恢复
由于每一次重启虚拟机防火墙策略都会发生改变,而一行行在终端上面修改又比较麻烦,所以通常持久化到文件当中。 iptables-save > /root/ipt.save iptables的保存 iptables-restore
其他: 链管理 -X, --delete-chain [chain]:删除用户自定义的引用计数为0的空链; -E, --rename-chain old-chain new-chain:重命名链;
规则管理: -R, --replace chain rulenum rule-specification:替换指定的规则为新的规则;
–syn 说明是tcp的syn字段为1,其他字段为0的情况。
state 限制收发包的状态
[!] --state state
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新连接请求;
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
UNTRACKED:未追踪的连接;
也可以对icmp协议进行一个处理 iptables -A INPUT -p icmp --icmp-type 8 -j ljh
执行的顺序
iptables执行规则时,是从从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept, reject, log等),决定下一步执行的情况,后续执行一般有三种情况。
1.一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。也就是当我们进入任意一条链,执行完后也会返回。
2.一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
3.一种是中止所有规则队列的执行。比如说DROP,当前访问被丢弃了。
iptables 是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的 IP 判断是否需要转送出去,接着就会跳到 INPUT 或 Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述流程继续进行下一个规则炼的过滤(注意:这一点与 ipchains 不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。
参考: iptables命令使用详解 执行顺序