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就会根据该链预先定义的默认策略来处理数据包。

iptables_chains

  1. 外部流量进入主机网卡时会被PREROUTING链处理,PREROUTING链通过判断流量的目的地是本机还是其他主机来决定流量的流向。
  2. 如果PREROUTING判定流量目的地是本机,且被规则放行,数据会流入INPUT链。INPUT链根据规则判断是否接受流量,如果接受,数据便会传递给本地进程。
  3. 如果PREROUTING链判断流量需要转发,数据则会来到FORWARD链。FORWARD如果允许数据转发,就会把数据发给POSTROUOTING链。
  4. 从本机进程发出的流量,会首先进入OUTPUT链,如果规则允许,流量被发送给POSTROUTING链。
  5. 流量最终从POSTROUTING链出口。

iptables的表

表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。

tables

  1. RAW表

    只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。

  2. filter表

    主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),FORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)。在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改

  3. nat表

    主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)。

  4. 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

我们来看一下这个命令:

  1. 没有指定-t表名,这代表使用默认的filter表
  2. 参数-A表示插入(Append)。
  3. 没有指定-i/o(in/out eth)网卡,任意网卡匹配。
  4. -p指定了传输层协议是tcp。
  5. -s指定了来源IP是34.70.66.9。
  6. 没有指定--sport,则表示任意来源端口皆匹配。
  7. -d没有指定,任意目标匹配?(当然这里INPUT链目标只可能是本机)。
  8. --dport制定了目标端口为12345。
  9. -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 这个文件中去。

命令示例学习

  1. -A, –append

    1
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT

    新增规则到INPUT规则链中,规则时接到所有目的端口为80的数据包的流入连接,该规则将会成为规则链中的最后一条规则。

  2. -D, –delete

    1
    iptables -D INPUT -p tcp --dport 80 -j ACCEPT

    1
    iptables -D INPUT 1

    可以删除完整规则,或者是指定第几条规则。

  3. -R, –replace

    1
    iptables -R INPUT 1 -s 192.168.0.1 -j DROP

    取代第一条规则,规则取代后并不会改变顺序。

  4. -I, –insert

    1
    iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

    在第一条规则前插入一条规则,原本该位置上的规则将会往后移动一个顺位。

  5. -L, –list

    1
    iptables -L INPUT

    列出INPUT规则链中的所有规则。

  6. -F, –flush

    1
    iptables -F INPUT

    删除INPUT规则链中的所有规则。

  7. -Z, –zero

    1
    iptables -Z INPUT

    将INPUT链中的数据包计数器归零。它是计算同一数据包出现次数,过滤阻断式攻击不可少的工具。

  8. -N, –new-chain

    1
    iptables -X denied

    定义新的规则链。

  9. -X, –delete-chain

    1
    iptables -X denied

    删除某个规则链。

  10. -P, –policy

    1
    iptables -P INPUT DROP

    定义默认过滤策略,如果数据包没有找到符合的策略,则根据此预设方式处理。

  11. -E, –rename-chain

    1
    iptables -E denied disallowed

    修改某个自定规则链的名称。

  12. -m multiport –source-port

    1
    iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 -j ACCEPT

    用来比对不连续的多个来源端口号,一次最多可以比对 15 个端口,可以使用 ! 运算子进行反向比对。

  13. -m multiport –destination-port

    1
    iptables -A INPUT -p tcp -m multiport --destination-port 22,53-j ACCEPT

    用来比对不连续的多个目的地端口号,设定方式同上。

  14. -m multiport –port

    1
    iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 -j ACCEPT

    这个参数比较特殊,用来比对来源端口号和目的端口号相同的数据包,设定方式同上。注意:在本范例中,如果来源端口号为 80,目的地端口号为 110,这种数据包并不算符合条件。

  15. -m limit –limit

    1
    iptables -A INPUT -m limit --limit 3/hour

    用来比对某段时间内数据包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次3个数据包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行数据包数量的比对外,设定这个参数也会在条件达成时,暂停数据包的比对动作,以避免因洪水攻击法,导致服务被阻断。

  16. -m limit –limit-burst

    1
    iptables -A INPUT -m limit --limit-burst 5

    用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。

参考

超详细地iptables教程文档

Linux防火墙iptables语法详解