iptables
安装iptables
[root@iptables ~]# yum install -y iptables-services
[root@iptables ~]# systemctl enable iptables.service --now
注意:对iptables规则的修改只是写在内存中,没有保存在/etc/sysconfig/iptables,重启iptables.service失效
[root@iptables ~]# iptables-save > /etc/sysconfig/iptables # iptables-save会显示当前的规则
`-L`(list):查看该链所有规则。
[root@iptables ~]# iptables -t filter -L # 省略链名默认该表下所有链
[root@iptables ~]# iptables -L # 省略表名默认为-t filter
[root@iptables ~]# yum install -y iptables-services
[root@iptables ~]# systemctl enable iptables.service --now
[root@iptables ~]# iptables -t filter -L # 看到新增一些规则
[root@iptables ~]# iptables -t filter -nL # 以数字形式显示地址和端口
[root@iptables ~]# iptables -t filter -L --line-numbers # --line-numbers显示规则序号
`-F`(fulsh):清空该链所有规则。
[root@iptables ~]# iptables -t filter -F
四表五链
iptables是一个在Linux系统中用于设置和管理防火墙规则的工具。它包含四个表格(Tables)和五个链(Chains),它们分别是:
四个表:
+ `Filter表`(filter):用于过滤数据包,决定是否接受或拒绝数据包。
它包含了INPUT、FORWARD和OUTPUT三个链。
+ `NAT表`(nat):用于网络地址转换,通常用于将私有IP地址转换为公有IP地址。主要用于端口转发、SNAT和DNAT等网络地址转换操作。
它包含了PREROUTING、POSTROUTING和OUTPUT三个链。
+ `Mangle表`(mangle):用于修改包头的特殊选项。
它包含了PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING等五个链。
+ `Raw表`(raw):用于配置某些特殊的免连接跟踪规则,对数据包的处理是在连接跟踪表之前进行的。
它包含了PREROUTING和OUTPUT两个链。
五个链:
+ `PREROUTING链`:用于对数据包进行处理,在数据包路由之前执行。
+ `INPUT链`:用于处理到达本机的数据包。
+ `FORWARD链`:用于处理需要转发到其他主机的数据包。
+ `OUTPUT链`:用于处理由本机发出的数据包。
+ `POSTROUTING链`:用于对数据包进行处理,将数据包从路由出口发出之前执行。
当主机收到一个数据包时,iptables会根据数据包的流向和目的(输入、转发、输出)选择相应的链进行处理。具体的处理过程如下:
数据包到达主机后,首先会经过PREROUTING链,进行一些预处理操作,比如端口转发、源地址转换等。
然后,数据包会进入相应的表格(如filter、nat、mangle、raw),根据匹配规则进行处理。注意,数据包可能会依次经过多个表格,每个表格都可以有自己的规则。
在每个表格中,数据包会根据匹配规则进行过滤或修改操作。如果数据包与规则匹配,则根据规则的动作(比如ACCEPT、DROP、REJECT)来决定是否接受、拒绝或处理数据包。
处理完表格中的规则后,数据包会进入相应的链(如INPUT、FORWARD、OUTPUT),进行最后的处理操作。
filter表
"filter表用于过滤网络数据包",默认有三条规则链:`INPUT`、`OUTPUT`、`FORWARD`
+ `INPUT`:数据包的目标IP地址是自己,则进入INPUT链。
+ `OUTPUT`:数据包的源IP地址是自己,则进入OUTPUT链。
+ `FORWARD`:数据包穿过自己(目标IP地址和源IP地址均不是自己),则进入FORWARD链。(必须开启路由转发`net.ipv4.ip_forward = 1`)
数据包进入规则链后,从上向下匹配,"匹配则停止",应用该规则。如果全都不匹配,则应用默认规则。
filter表主要实现"防火墙"的功能,根据防火墙的防护对象(数据包的目标地址),可以分为主机防护(`INPUT`链)和网络防护(`FORWARD`链)。
注意:数据包都是一去一回。
filter表通用命令。处理动作有ACCEPT、DROP、REJECT | 说明。规则从上到下匹配,匹配即停止 | |
---|---|---|
iptables [-t filter] -L [选项] [链名 [规则序号]] | list | 查看规则。 省略规则序号默认所有规则。省略链名默认所有链。 选项 -n :以数字形式显示地址和端口。选项 --line-numbers :显示规则序号。 |
iptables [-t filter] -S [链名 [规则序号]] | show | 查看规则(命令形式)。 省略规则序号默认所有规则。省略链名默认所有链。 |
iptables [-t filter] -P 链名 ACCEPT或DROP | policy | 设置默认策略 |
iptables [-t filter] -I 链名 [规则序号] 具体规则 -j 处理动作 | insert | 插入规则。省略规则序号默认序号为1。 |
iptables [-t filter] -A 链名 具体规则 -j 处理动作 | append | 追加规则。新规则序号为最末。 |
iptables [-t filter] -R 链名 规则序号 具体规则 -j 处理动作 | replace | 替换规则。不改变规则序号。 |
iptables [-t filter] -D 链名 规则序号 -j 处理动作 | delete | 删除规则。 |
iptables [-t filter] -F [链名] | flush | 清空链的所有规则。省略链名默认所有链。 |
filter表常用具体规则 | 说明 |
---|---|
-p 协议 [--sport 源端口] [--dport 目标端口] | 协议为tcp 或udp 则可以使用端口。协议为其他协议则不可使用端口,例如 icmp |
-s 源IP地址A,源IP地址B | 占用多条规则 |
-d 目标IP地址A,目标地址B | 占用多条规则 |
-i 入方向网卡 | |
-o 出方向网卡 | |
-m state --state ESTABLISHED | 从自身发出去、返回来的数据包,其状态是ESTABLISHED |
-m multiport [--sport 端口A,端口B,端口C:端口D] [--dport 端口E,端口F,端口G:端口H] | 占用一条规则。 连续端口使用 : ,不连续端口使用, |
-m iprange --src-range IP地址A-IP地址B --dst-range IP地址E-IP地址F | 占用一条规则。 连续IP地址使用 - |
-m mac --mac-source 源MAC地址 |
filter表INPUT链(主机防护)
filter表INPUT链(主机防护)
主机(192.168.88.7,192.168.99.7):
// -F清空
[root@iptables ~]# iptables -F INPUT // 省略表默认为`-t filter`
// -A追加。-P默认策略。-I插入
[root@iptables ~]# iptables -A INPUT -s 192.168.88.254 -j ACCEPT // 接受源IP地址192.168.88.254的数据包
[root@iptables ~]# iptables -P INPUT DROP // 默认策略为丢弃
[root@iptables ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT // 接受状态为ESTABLISHED的数据包
[root@iptables ~]# iptables -I INPUT 1 -s 192.168.88.254 -p icmp -j REJECT // 拒绝192.168.88.254的icmp协议数据包
[root@iptables ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT // 接受目标端口80的数据包
[root@iptables ~]# iptables -A INPUT -s 192.168.88.0/24 -p tcp -m multiport --dport 22,443,100:120 -j ACCEPT // 接受源IP地址192.168.88.0/24网段,目标端口22、443、100~120的数据包
[root@iptables ~]# iptables -A INPUT -m iprange --src-range 192.168.99.100-192.168.99.200 -p tcp -m multiport --dport 22,443,100:120 -j ACCEPT // 接受源IP地址192.168.99.100~200,目标端口22、443、100~120的数据包
// -L查看。-n以数字方式显示。--line-numbers显示规则序号
[root@iptables ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 REJECT icmp -- 192.168.88.254 0.0.0.0/0 reject-with icmp-port-unreachable
2 ACCEPT all -- 192.168.88.254 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 multiport dports 22,443,100:120
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.99.100-192.168.99.200 multiport dports 22,443,100:120
// -S查看(命令形式)
[root@iptables ~]# iptables -S INPUT
-P INPUT DROP
-A INPUT -s 192.168.88.254/32 -p icmp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 192.168.88.254/32 -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.88.0/24 -p tcp -m multiport --dports 22,443,100:120 -j ACCEPT
-A INPUT -p tcp -m iprange --src-range 192.168.99.100-192.168.99.200 -m multiport --dports 22,443,100:120 -j ACCEPT
// 永久生效
[root@iptables ~]# iptables-save > /etc/sysconfig/iptables
filter表FORWARD链(网络防护)
filter表FORWARD链(网络防护)
主机(192.168.88.7,192.168.99.7):
// 开启路由转发
[root@iptables ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@iptables ~]# sysctl -p
// -F清空
[root@iptables ~]# iptables -F FORWARD
// -A追加。-P默认策略。-I插入
[root@iptables ~]# iptables -P FORWARD DROP
[root@iptables ~]# iptables -A FORWARD -s 192.168.88.5 -d 192.168.99.10 -p icmp -j ACCEPT
[root@iptables ~]# iptables -A FORWARD -s 192.168.99.10 -d 192.168.88.5 -p icmp -j ACCEPT
[root@iptables ~]# iptables -A FORWARD -m iprange --src-range 192.168.99.80-192.168.99.100 --dst-range 192.168.88.5 -p tcp -m multiport --dports 22,443,100:120 -j ACCEPT
[root@iptables ~]# iptables -I FORWARD 3 -m iprange --src-range 192.168.88.5 --dst-range 192.168.99.80-192.168.99.100 -p tcp -m multiport --sports 22,443,100:120 -j ACCEPT
[root@iptables ~]# iptables -A FORWARD -s 192.168.99.80,192.168.99.100 -d 192.168.88.70,192.168.88.110 -p icmp -j ACCEPT
// -L查看。-n以数字方式显示。--line-numbers显示规则序号
[root@iptables ~]# iptables -nL FORWARD --line-numbers
Chain FORWARD (policy DROP)
num target prot opt source destination
1 ACCEPT icmp -- 192.168.88.5 192.168.99.10
2 ACCEPT icmp -- 192.168.99.10 192.168.88.5
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.88.5-192.168.88.5 destination IP range 192.168.99.80-192.168.99.100 multiport sports 22,443,100:120
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.99.80-192.168.99.100 destination IP range 192.168.88.5-192.168.88.5 multiport dports 22,443,100:120
5 ACCEPT icmp -- 192.168.99.80 192.168.88.70
6 ACCEPT icmp -- 192.168.99.80 192.168.88.110
7 ACCEPT icmp -- 192.168.99.100 192.168.88.70
8 ACCEPT icmp -- 192.168.99.100 192.168.88.110
// -S查看(命令形式)
[root@iptables ~]# iptables -S FORWARD
-P FORWARD DROP
-A FORWARD -s 192.168.88.5/32 -d 192.168.99.10/32 -p icmp -j ACCEPT
-A FORWARD -s 192.168.99.10/32 -d 192.168.88.5/32 -p icmp -j ACCEPT
-A FORWARD -p tcp -m iprange --src-range 192.168.88.5-192.168.88.5 --dst-range 192.168.99.80-192.168.99.100 -m multiport --sports 22,443,100:120 -j ACCEPT
-A FORWARD -p tcp -m iprange --src-range 192.168.99.80-192.168.99.100 --dst-range 192.168.88.5-192.168.88.5 -m multiport --dports 22,443,100:120 -j ACCEPT
-A FORWARD -s 192.168.99.80/32 -d 192.168.88.70/32 -p icmp -j ACCEPT
-A FORWARD -s 192.168.99.80/32 -d 192.168.88.110/32 -p icmp -j ACCEPT
-A FORWARD -s 192.168.99.100/32 -d 192.168.88.70/32 -p icmp -j ACCEPT
-A FORWARD -s 192.168.99.100/32 -d 192.168.88.110/32 -p icmp -j ACCEPT
// 永久生效
[root@iptables ~]# iptables-save > /etc/sysconfig/iptables
nat表
通用命令。省略表名默认为filter表 | 说明。规则从上到下匹配,匹配即停止 | |
---|---|---|
iptables -t nat -L [选项] [链名 [规则序号]] | list | 查看规则。 省略规则序号默认所有规则。省略链名默认所有链。 选项 -n :以数字形式显示地址和端口。选项 --line-numbers :显示规则序号。 |
iptables -t nat -S [链名 [规则序号]] | show | 查看规则(命令形式)。 省略规则序号默认所有规则。省略链名默认所有链。 |
iptables -t nat -P 链名 ACCEPT或DROP | policy | 设置默认策略 |
iptables -t nat -I 链名 [规则序号] 具体规则 | insert | 插入规则。省略规则序号默认序号为1。 |
iptables -t nat -A 链名 具体规则 | append | 追加规则。新规则序号为最末。 |
iptables -t nat -R 链名 规则序号 具体规则 | replace | 替换规则。不改变规则序号。 |
iptables -t nat -D 链名 规则序号 | delete | 删除规则。 |
iptables -t nat -F [链名] | flush | 清空链的所有规则。省略链名默认所有链。 |
nat表POSTROUTING链常用具体规则 | 使用情形 | 说明 |
---|---|---|
-s 内网IP地址网段 -j SNAT --to-source 本机公网IP地址 | 固定的 公网IP地址 | 本机作为网关, 转换filter表FORWARD链的数据包的源IP地址为固定的公网IP地址 |
-s 内网IP地址网段 -j MASQUERADE | 不固定的 公网IP地址 | 本机作为网关, 转换filter表FORWARD链的数据包的源IP地址为本机的公网IP地址 |
nat表POSTROUTING链
- nat表POSTROUTING链可以转换filter表FORWARD链的数据包的源IP地址,实现NAT功能。
nat表POSTROUTING链
主机(192.168.88.7,192.168.99.7):
// 开启路由转发
[root@iptables ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@iptables ~]# sysctl -p
[root@iptables ~]# iptables -t filter -P FORWARD ACCEPT
[root@iptables ~]# iptables -t nat -F POSTROUTING
固定(静态)的网关IP地址
[root@iptables ~]# iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j SNAT --to-source 192.168.99.7
192.168.88.0/24网段的主机(网关为192.168.88.7)访问192.168.99.0/24网段的主机时,本主机会将数据包的源IP地址转换为192.168.99.7
[root@iptables ~]# iptables -t nat -nL POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.88.0/24 0.0.0.0/0 to:192.168.99.7
不固定(DHCP)的网关IP地址
[root@iptables ~]# iptables -t nat -A POSTROUTING -s 192.168.88.10/24 -j MASQUERADE
[root@iptables ~]# iptables -t nat -nL POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.88.0/24 0.0.0.0/0
192.168.88.0/24网段的主机(网关为192.168.88.7)访问192.168.99.0/24网段的主机时,本主机会将数据包的源IP地址转换为本机的99网段的IP地址