iptables基础教程
此篇很早就想写了,因为不言而喻,iptables是极其重要的Linux防火墙工具。
iptables简介
iptables是一个命令行实用程序,用于配置Netfilter项目中实现的Linux内核防火墙。术语iptables也通常用于指代此内核级防火墙。可以直接使用iptables进行配置,也可以使用许多控制台和图形化前端之一进行配置。iptables用于IPv4,ip6tables用于IPv6。双方的iptables和ip6tables有相同的语法,但一些选项特定于IPv4或IPv6。
好吧,以上都是废话,下面来正题。
iptables基础概念
iptables管理系统网络流量,是通过表和链以及规则,来实现的。
iptables的链
iptables管理着5个链
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查(注意:这里提示iptables的规则是有顺序性的),看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
- 外部流量进入主机网卡时会被
PREROUTING
链处理,PREROUTING
链通过判断流量的目的地是本机还是其他主机来决定流量的流向。 - 如果
PREROUTING
判定流量目的地是本机,且被规则放行,数据会流入INPUT
链。INPUT
链根据规则判断是否接受流量,如果接受,数据便会传递给本地进程。 - 如果
PREROUTING
链判断流量需要转发,数据则会来到FORWARD
链。FORWARD
如果允许数据转发,就会把数据发给POSTROUOTING
链。 - 从本机进程发出的流量,会首先进入
OUTPUT
链,如果规则允许,流量被发送给POSTROUTING
链。 - 流量最终从
POSTROUTING
链出口。
iptables的表
表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。
RAW表
只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
filter表
主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),FORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)。在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。
nat表
主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)。
mangle表
主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),FORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)。
表的优先级:
raw > mangle > nat > filter
iptables的规则
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
iptables语法
iptables主操作参数
“主操作参数”,顾名思义,是定义这个操作的主要目的的参数。
-P
--policy
定义默认策略(如果系统不自带iptables,安装下来的所有链的默认策略都是ACCEPT)-L
--list
查看iptables规则列表-A
--append
在指定链的规则列表的最后添加一条规则-I
--insert
在指定链的指定位置插入一条规则(原来该位置所有的规则及其后的规则,顺位后移一位)-D
--delete
删除指定链中的一条指定规则-R
--replace
替换一条规则-F
--flush
删除表中所有规则-Z
--zero
将表中数据包计数器和流量计数器归零-X
--delete-chain
删除自定义链-v
--verbose
与-L
一起使用获得更详细的信息
iptables动作
- ACCEPT:接受数据报。
- DROP:丢弃数据报。
- REDIRECT:将数据包重新转向到本机或另一台主机的某一个端口,通常实现透明代理或对外开放内网的某些服务。
- REJECT:拦截该数据封包,并发回封包通知对方。
- SNAT:源地址转换(一般在POSTROUTING链操作),即改变数据包的源地址。例如:将局域网的IP(10.0.0.1/24)转化为广域网的IP(203.93.236.141/24),在NAT表的POSTROUTING链上进行该动作。
- DNAT:目标地址转换(一般在PREROUTING链操作),即改变数据包的目标地址。例如:将广域网的IP(203.93.236.141/24)转化为局域网的IP(10.0.0.1/24),在NAT表的PREROUTING链上进行该动作。
- MASQUERADE:IP伪装,即常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP动态分配的,如果主机的IP地址是静态固定的,就要使用SNAT。
- LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错。
规则设定语法
1 | iptables [-t 表名] <-A|I|D|R> 链名[规则编号] [-i|o 网卡名称] [-p 协议类型] [-s 源IP地址|源子网] [--sport 源端口号] [-d 目标IP地址|目标子网] [--dport 目标端口号] <-j 动作> |
以上语法标准最好牢记
例如,我要设定,本机的12345端口,只能由34.70.66.9访问,拒绝其他主机访问。
1 | iptables -A INPUT -p tcp -s 34.70.66.9 --dport 12345 -j ACCEPT |
我们来看一下这个命令:
- 没有指定
-t
表名,这代表使用默认的filter表。 - 参数
-A
表示插入(Append)。 - 没有指定
-i/o
(in/out eth)网卡,任意网卡匹配。 -p
指定了传输层协议是tcp。-s
指定了来源IP是34.70.66.9。- 没有指定
--sport
,则表示任意来源端口皆匹配。 -d
没有指定,任意目标匹配?(当然这里INPUT链目标只可能是本机)。--dport
制定了目标端口为12345。-j
,即jump,指定了动作为接受/放行。
然后拒绝其他主机访问
1 | iptables -A INPUT -p tcp --dport 12345 -j DROP |
定义默认策略语法
1 | iptables [-t 表名] <-P> <链名> <动作> |
例如设定filter表(默认表)INPUT链默认策略为丢弃数据报
1 | iptables -P INPUT DROP |
设定nat表PREROUTING链默认策略为接受数据报
1 | iptables -t nat -P PREROUTING ACCEPT |
查看iptables规则语法
1 | iptables [-t 表名] <-L> [链名] |
如果不注明表名,会默认查看filter表
如果不指定链名,会查看该表包含的所有链
清除规则和计数器语法
1 | iptables [-t 表名] <-F | Z> |
保存规则
使用iptables程序建立的规则只会保存在内存中,通常我们在修改了iptables的规则重启 iptables 后,之前修改的规则便会消失。
对于RHEL和CentOS系统
1
service iptables save
修改/etc/sysconfig/iptables-config 将里面的IPTABLES_SAVE_ON_STOP=”no”, 这一句的”no”改为”yes”这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去。
命令示例学习
-A, –append
1
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
新增规则到INPUT规则链中,规则时接到所有目的端口为80的数据包的流入连接,该规则将会成为规则链中的最后一条规则。
-D, –delete
1
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
或
1
iptables -D INPUT 1
可以删除完整规则,或者是指定第几条规则。
-R, –replace
1
iptables -R INPUT 1 -s 192.168.0.1 -j DROP
取代第一条规则,规则取代后并不会改变顺序。
-I, –insert
1
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
在第一条规则前插入一条规则,原本该位置上的规则将会往后移动一个顺位。
-L, –list
1
iptables -L INPUT
列出INPUT规则链中的所有规则。
-F, –flush
1
iptables -F INPUT
删除INPUT规则链中的所有规则。
-Z, –zero
1
iptables -Z INPUT
将INPUT链中的数据包计数器归零。它是计算同一数据包出现次数,过滤阻断式攻击不可少的工具。
-N, –new-chain
1
iptables -X denied
定义新的规则链。
-X, –delete-chain
1
iptables -X denied
删除某个规则链。
-P, –policy
1
iptables -P INPUT DROP
定义默认过滤策略,如果数据包没有找到符合的策略,则根据此预设方式处理。
-E, –rename-chain
1
iptables -E denied disallowed
修改某个自定规则链的名称。
-m multiport –source-port
1
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 -j ACCEPT
用来比对不连续的多个来源端口号,一次最多可以比对 15 个端口,可以使用 ! 运算子进行反向比对。
-m multiport –destination-port
1
iptables -A INPUT -p tcp -m multiport --destination-port 22,53-j ACCEPT
用来比对不连续的多个目的地端口号,设定方式同上。
-m multiport –port
1
iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 -j ACCEPT
这个参数比较特殊,用来比对来源端口号和目的端口号相同的数据包,设定方式同上。注意:在本范例中,如果来源端口号为 80,目的地端口号为 110,这种数据包并不算符合条件。
-m limit –limit
1
iptables -A INPUT -m limit --limit 3/hour
用来比对某段时间内数据包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次3个数据包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行数据包数量的比对外,设定这个参数也会在条件达成时,暂停数据包的比对动作,以避免因洪水攻击法,导致服务被阻断。
-m limit –limit-burst
1
iptables -A INPUT -m limit --limit-burst 5
用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。