iptables 是 Linux 中比较底层的网络服务,它控制了 Linux 系统中的网络操作,CentOS 中的 firewalld 和 Ubuntu 中的 ufw 都是在 iptables 之上构建的,只为了简化 iptables 的操作。同时,iptables 不仅仅是防火墙这么简单,它基本上能实现你在 linux 上对于网络的所有需求,最常用的就是数据转发、网络地址转换等,例如 LVS 可以利用 Iptables 实现SNAT模式。
1、iptables介绍
1.1)iptables的发展:
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用;现在又叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
netfilter是什么?
从ipchains开始,允许在用户空间中定义各种规则,ipchains、iptables是用来定义这些规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter(网络过滤器),它是Linux内核中实现包过滤的内部结构,真正的防火墙。
1.2)iptables工作机制:
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。
- PREROUTING:路由前
- INPUT:数据包流入口
- FORWARD:转发管卡
- OUTPUT:数据包出口
- POSTROUTING:路由后
- 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。
- 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。
- 本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。
- 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达POSTROUTING链输出。
1.3)规则、表、链:
1)规则(rules):
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
2)链(chains):
每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
说明:除了INPUT、OUTPUT、FORWARD、PREROUTING 以及 POSTROUTING这几个预先设置的chain之外,还可以自定义chain
3)表(tables):
表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。
- RAW表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING
- mangle表:主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)等,应用并不广泛。在内核版本2.4.18 后的linux版本中该表包含的链为INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)
- nat表:主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)
- filter表:主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改
规则表之间的优先顺序:Raw>>>>mangle>>>>nat>>>>filter
2、iptables命令
iptables命令的一般格式:iptables [commands] [options]
2.1)commands:
1)规则相关:
- -P --policy <链名> 定义默认策略
- --list -L [chain [rulenum]]: 查看chain的规则信息
- --append -A chain:在指定chain的规则列表最后增加1条规则
- --insert -I chain [rulenum]:在指定chain的规则列表中,指定位置插入1条规则,默认rulenum位置是1
- --delete -D chain:在指定chain的规则列表中,删除指定位置或匹配的规则
- --flush -F [chain]:Delete all rules in chain or all chains
2)chain相关:
- --new -N chain :Create a new user-defined chain
- --delete-chain -X [chain] :Delete a user-defined chain
- -N --new <链名> 创建自定义链
- -X --delete-chain <链名> 删除自定义链
2.2)options:
- –-line-number:显示规则的序列号,这个参数在删除或修改规则时会用到
- -v:verbose mode 详细模式
- -n:输出数字形式的地址和端口
- --table -t table:要操作的表,默认是filter表
- --jump -j target:指定规则的动作(见2.4)
- --protocol -p proto:指定protocol by number or name, eg. `tcp'
- --source -s address[/mask][...]:原ip地址设置
- --destination -d address[/mask][...]:目的ip地址
2.3)其他:
规则中有很多动作,例如:
1)ACCEPT、DROP、LOG:
- ACCEPT:允许数据包通过
- DROP:丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
2)REJECT:
拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。范例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
3)SNAT:
在路由之后,做源地址转换,局域网中的主机访问外网通常使用该技术。
例如:A--->B--->C (比如我们想要访问百度,淘宝等网站)
1.企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机B;
说明:B机:作为NAT转换机,两个网卡都有。IP:172.17.123.224 192.168.199.138,
需要在A机器上添加路由记录,route add default gw 192.168.199.138(B机器的外网ip)
2.B收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给C;
说明:
需要在B机器上开启转发功能:echo 1 > /proc/sys/net/ipv4/ip_forward
在B机器防火墙的postrouting chain上设置转换源地址策略,
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
3.C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B;
4.B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。
4)DNAT:
在路由之前,做目的地地址转换。当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部。
此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
例如:C--->B--->A (比如对外发布web网站)
1.互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,
2.C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。
说明:在在NAT转换机上:iptables -t nat -I PREROUTING 1 -d 172.17.123.224 -j DNAT --to-destination 192.168.199.142 转换目标地址
3.A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。
5)REDIRECT:
在路由之后,将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护 web 服务器。DNAT和REDIRECT的区别在于,DNAT可以将其数据包发送到除本机以外的其他主机和端口,而REDIRECT则可以将收到的数据包转发到本机的其他端口,所以我理解就是DNAT的策略一般都制定在专门的NAT服务器上,而REDIRECT的策略一般制定在目标主机上当然也可以用来代替DNAT
iptables -t nat -A PREROUTING -d 192.168.199.143 -p tcp --dport 80 -j REDIRECT --to-ports 8080
6)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
7)RETURN :
结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
8)MARK:
将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
9)MIRROR:
镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。
2.3)示例:
1)查看规则信息:
#查看所有链的规则信息
$iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 19799 packets, 713K bytes)
num pkts bytes target prot opt in out source destination
1 11 3497 ACCEPT udp -- eth1 * 0.0.0.0/0 0.0.0.0/0 udp spt:30010
2 658K 65M ACCEPT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp spt:389
3 0 0 ACCEPT all -- * * 172.27.3.212 0.0.0.0/0
4 0 0 ACCEPT all -- * * 10.53.195.24 0.0.0.0/0 Chain ETH1_TCP (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * * 21.0.0.0/8 0.0.0.0/0
2 2966K 163M ACCEPT all -- * * 9.0.0.0/8 0.0.0.0/0
3 333K 16M ACCEPT all -- * * 10.0.0.0/8 0.0.0.0/0
4 481K 25M ACCEPT all -- * * 11.0.0.0/8 0.0.0.0/0
5 9497 1099K ACCEPT all -- * * 30.0.0.0/8 0.0.0.0/0 #查看某一个链的规则信息
$iptables -L ETH1_TCP -nv --line-numbers
Chain ETH1_TCP (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * * 21.0.0.0/8 0.0.0.0/0
2 2966K 163M ACCEPT all -- * * 9.0.0.0/8 0.0.0.0/0
3 333K 16M ACCEPT all -- * * 10.0.0.0/8 0.0.0.0/0
4 481K 25M ACCEPT all -- * * 11.0.0.0/8 0.0.0.0/0
5 9497 1099K ACCEPT all -- * * 30.0.0.0/8 0.0.0.0/0
2)添加规则:
#在INPUT chain上默认的filter表中第一位插入规则,指定原ip地址
iptables -I INPUT 1 -s 21.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 20.0.0.0/8 -j DROP
3)删除规则:
#在INPUT chain上默认的filter表中删除第4条规则iptables -D INPUT 4
4)其他:
#永久生效
service iptables save
service iptables restart