iptables 是 Linux 中比较底层的网络服务,它控制了 Linux 系统中的网络操做,在 CentOS 中的 firewalld 和 Ubuntu 中的 ufw 都是在 iptables 之上构建的,只为了简化 iptables 的操做,所以,对于学习了解 iptables 对咱们了解 firewalld 和 ufw 的工做机制都是颇有益处,固然,这里提一句,firewalld 和 ufw 不只仅是对 iptables 上层封装那么简单,还有 ipv6 支持等功能。同时,iptables 不只仅是防火墙这么简单,它基本上能实现你在 linux 上对于网络的全部需求,例如我曾经就使用过 iptables 构建过一个简单的 ap,用到的原理就是 iptables 的转发功能,更多关于 iptables 的功能让我在下面给你介绍。html
在描述 iptables 的各类功能以前,先看一张 iptables 的网络图:node
能够发现,iptables 在网络流中有四个 table,分别是:nat
、filter
、raw
和 mangle
此外,还有五条链,分别是:INPUT
、OUTPUT
、FORWARD
、PREROUTING
以及 POSTROUTING
linux
数据流走向git
规则、表和链github
规则(rules)web
规则(rules)其实就是网络管理员预约义的条件,规则通常的定义为“若是数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间 的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据 包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防 火墙的主要工做就是添加、修改和删除这些规则。ubuntu
链(chains)centos
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中能够有一条或数条规则。当一个数据包到达一个链 时,iptables就会从链中第一条规则开始检查,看该数据包是否知足规则所定义的条件。若是知足,系统就会根据该条规则所定义的方法处理该数据包;否 则iptables将继续检查下一条规则,若是该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。服务器
表(tables)网络
表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。
RAW表 只使用在PREROUTING链和OUTPUT链上,由于优先级最高,从而能够对收到的数据包在链接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即再也不作地址转换和数据包的连接跟踪处理了.
filter表 主要用于过滤数据包,该表根据系统管理员预约义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的 过滤。Filter表是默认的表,若是没有指定哪一个表,iptables 就默认使用filter表来执行全部命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT 链(处理本地生成的数据包)在filter表中只能容许对数据包进行接受,丢弃的操做,而没法对数据包进行更改
nat表 主要用于网络地址转换NAT,该表能够实现一对一,一对多,多对多等NAT 工做,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即 将出去的数据包),OUTPUT链(修改路由以前本地生成的数据包)
mangle表 主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据 包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)
规则表之间的优先顺序
Raw——mangle——nat——filter
规则链之间的优先顺序
第一种状况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),以后会进行路由选择(判断该数据包应该发往何处),若是 数据包 的目标主机是防火墙本机(好比说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否容许通 过等),经过之后再交给系统上层的应用程序(好比Apache服务器)进行响应。
第二冲状况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,以后会进行路由选择,若是数据包的目标地址是其它外部地址(好比局域网用户 经过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),而后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
第三种状况:出站数据流向
防火墙本机向外部地址发送的数据包(好比在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,以后进行路由选择,而后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
iptables的命令格式较为复杂,通常的格式以下:
1 |
iptables [-t 表] -命令 匹配 操做
|
说明
-t 表
表选项用于指定命令应用于哪一个iptables内置表。
命令
命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,以下表所示
-P --policy <链名> 定义默认策略 -L --list <链名> 查看iptables规则列表 -A --append <链名> 在规则列表的最后增长1条规则 -I --insert <链名> 在指定的位置插入1条规则 -D --delete <链名> 从规则列表中删除1条规则 -R --replace <链名> 替换规则列表中的某条规则 -F --flush <链名> 删除表中全部规则 -Z --zero <链名> 将表中数据包计数器和流量计数器归零 -X --delete-chain <链名> 删除自定义链 -v --verbose <链名> 与-L他命令一块儿使用显示更多更详细的信息
匹配规则
匹配选项指定数据包与规则匹配所具备的特征,包括源地址,目的地址,传输协议和端口号,以下表所示
-i --in-interface 网络接口名> 指定数据包从哪一个网络接口进入, -o --out-interface 网络接口名> 指定数据包从哪一个网络接口输出 -p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等 -s --source 源地址或子网> 指定数据包匹配的源地址 --sport 源端口号> 指定数据包匹配的源端口号 --dport 目的端口号> 指定数据包匹配的目的端口号 -m --match 匹配的模块 指定数据包规则所使用的过滤模块
动做
前面咱们说过iptables处理动做除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 之外,还多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK等。咱们只说明其中最经常使用的动做:
REJECT 拦阻该数据包,并返回数据包通知对方,能够返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动做后,将再也不比对其它规则,直接中断过滤程序。 范例以下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
DROP 丢弃数据包不予处理,进行完此处理动做后,将再也不比对其它规则,直接中断过滤程序。
REDIRECT 将封包从新导向到另外一个端口(PNAT),进行完此处理动做后,将会继续比对其它规则。这个功能能够用来实做透明代理 或用来保护web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
MASQUERADE 改写封包来源IP为防火墙的IP,能够指定port 对应的范围,进行完此处理动做后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不一样,当进行IP 假装时,不需指定要假装成哪一个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 一般是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。范例以下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
LOG 将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动做后,将会继续比对其它规则。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,能够指定 port 对应的范围,进行完此处理动做后,将直接跳往下一个规则炼(mangle:postrouting)。范例以下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT 改写数据包包目的地 IP 为某特定 IP 或 IP 范围,能够指定 port 对应的范围,进行完此处理动做后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例以下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR 镜像数据包,也就是未来源 IP与目的地IP对调后,将数据包返回,进行完此处理动做后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,能够进行其它应用,例如:计算联机费用.......等。
RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,若是把自订规则炼当作是一个子程序,那么这个动做,就至关于提前结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供做为后续过滤的条件判断依据,进行完此处理动做后,将会继续比对其它规则。范例以下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
查看防火墙的状态
# iptables -L -n -v --line-numbers
启动/中止/重启防火墙
# service iptables stop # service iptables start # service iptables restart
删除一条规则
# iptables -L INPUT -n --line-numbers # iptables -L OUTPUT -n --line-numbers # iptables -L OUTPUT -n --line-numbers | less # iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
插入一条规则
# iptables -I INPUT 2 -s 202.54.1.2 -j DROP
保存防火墙规则
# service iptables save
加载防火墙规则
# iptables-restore < /root/my.active.firewall.rules
删除公共接口上的私有地址
# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
屏蔽 ip 地址
# iptables -A INPUT -s 1.2.3.4 -j DROP # iptables -A INPUT -s 192.168.0.0/24 -j DROP
屏蔽入站端口
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
屏蔽出站ip
# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
记录并删除包
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: " # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
经过 mac 地址过滤数据
# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP ## *only accept traffic for TCP port # 8080 from mac 00:0F:EA:91:04:07 * ## # iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
过滤 ICMP ping 请求
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
开启范围端口
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
开启范围 ip
iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT