iptables
是 Linux 系统中用于配置和管理防火墙规则的核心工具。它允许用户定义、修改和查看数据包过滤规则,从而控制网络流量的进出。通过 iptables
,用户可以设置允许或阻止特定 IP 地址、端口或协议的通信,实现网络安全策略的灵活管理。其规则链包括 INPUT,
OUTPUT
和 FORWARD
,分别用于处理进入、离开和转发的数据包。iptables
功能强大,是 Linux 系统网络安全的重要组成部分。
一.iptables表和链的数量
1.早期2.4 - Linux的内核版本仅支持3个表:filter,nat,mangle,这是常见的说法
2.现代版本2.6 -Linux的内核版本新增了raw,security,capture,route表,理论上总共有七个表,但最后两个,capture,route表极为少用,一般说为五表五链。但有人因为security表功能较少使用,一般也有人统称四表五链。
3.数据包进入通过五表的顺序(rwa,mangle,nat,filter,security)
这是使用最为频繁的表,主要用于过滤数据包,默认的表。它包含以下三个链:
INPUT 链:处理目标地址为本机的入站数据包,用于决定是否允许特定的入站流量到达本机的服务或应用程序。比如可设置规则允许来自特定 IP 地址段的 SSH 连接请求进入本机。
OUTPUT 链:处理从本机发出的出站数据包,能控制本机向外发送的流量。例如可限制本机某些程序连接外部特定 IP 或端口。
FORWARD 链:当本机充当路由器时,处理需要转发的数据包,决定是否将数据包从一个网络接口转发到另一个网络接口。比如在企业网络中,通过该链规则允许或禁止内部子网间的流量转发。
用于网络地址转换(NAT),包括源地址转换(SNAT)和目的地址转换(DNAT)。它包含以下三个链:
PREROUTING 链:在进行路由选择之前处理数据包,常用于目的地址转换(DNAT)。比如将外部对服务器公网 IP 的特定端口访问映射到内部服务器的相应端口。
POSTROUTING 链:在进行路由选择之后处理数据包,常用于源地址转换(SNAT)。比如在家庭网络中,让内网多台设备共用一个公网 IP 访问互联网。
OUTPUT 链:处理从本机发出的数据包,可在此链进行源地址转换等操作,让本机以特定的公网 IP 地址访问外部网络。
用于修改数据包的 TOS(服务类型)、TTL(生存时间)等信息,还可对数据包进行标记。它包含全部五个链:
PREROUTING 链:在数据包进入路由决策之前进行标记或修改 TOS、TTL 等字段。
INPUT 链:对目标地址为本机的入站数据包进行修改和标记。
FORWARD 链:对需要转发的数据包进行修改和标记。
OUTPUT 链:对从本机发出的数据包进行修改和标记。
POSTROUTING 链:在数据包完成路由决策之后进行修改和标记。
主要用于配置数据包是否被状态跟踪机制处理,以提高性能或实现特殊的处理需求。它包含以下两个链:
PREROUTING 链:在数据包进入路由选择之前,决定是否对其进行状态跟踪。
OUTPUT 链:在本机发出数据包时,决定是否对其进行状态跟踪。
用于强制访问控制(MAC),与 SELinux 等安全机制配合使用。它包含以下三个链:
INPUT 链:对目标地址为本机的入站数据包进行基于安全上下文的过滤和控制。
OUTPUT 链:对从本机发出的数据包进行基于安全上下文的过滤和控制。
FORWARD 链:对需要转发的数据包进行基于安全上下文的过滤和控制。
-A 追加规则-->iptables -A INPUT
-D 删除规则-->iptables -D INPUT 1(编号)
-R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则
通用参数:
-p 协议 例:iptables -A INPUT -p tcp
-s 源地址 例:iptables -A INPUT -s 192.168.1.1
-d 目的地址 例:iptables -A INPUT -d 192.168.12.1
--sport 源端口 例:iptables -A INPUT -p tcp --sport 22
--dport 目的端口 例:iptables -A INPUT -p tcp --dport 22
-i 指定入口网卡 例:iptables -A INPUT -i eth0
-o 指定出口网卡 例:iptables -A FORWARD -o eth0
-j 指定要进行的处理动作
常用的ACTION:
DROP:丢弃
REJECT:明示拒绝
ACCEPT:接受
2.使用
iptables -t fileter -L #查看filter的所有规则
Chain INPUT (policy ACCEPT) # INPUT链默认规则是接受(ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT) # FORWARD链默认规则是接受
target prot opt source destination
Chain OUTPUT (policy ACCEPT) # OUTPUT链默认规则是接受
target prot opt source destination
[root@localhost ~]# iptables -P FORWARD DROP #设置FORWARD的默认规则是DROP(丢弃)
[root@localhost ~]# iptables -L (不指定表名,就默认操作filter表)
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -F (清空所有规则)
iptables语法
iptables [-t 表名] 选项 [链名] [条件] [-j 满足条件的操作]
iptables -A INPUT -s 192.168.1.13 -j ACCEPT #在INPUT链种添加源地址为192.168.1.13 的ip允许进入本机
iptables -I INPUT -s 192.168.1.13 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 允许ip为192.168.1.0的网段访问目标地址的22端口 (一般想要禁止数据使用ssh一般是禁掉目标端口为22的数据,而不是禁掉源地址的22端口的数据包,因为源地址连接目标地址的ssh的端口是随机的,而不是固定的22端口)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许所有地址所有的tcp协议可以访问80端口
#FORWARD链
#默认拒绝所有数据包通过
iptables -P FORWARD DROP
#源地址是192.168.1.0/24网段到192.168.2.0/24网段的放行
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
#允许源地址192.168.1.0/24使用icmp协议(ping命令所使用的协议)访问192.168.2.0/24
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -p icmp -j ACCEPT