目录
一、什么是iptables?
1.1 iptables介绍
iptables 是与Linux 内核集成的 IP 信息包过滤系统。iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对精确的访问控制功能。
它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter(网络过滤器)。
netfilter / iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 共同组成。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 组件是一种工具,本身并不算是防火墙,只是定义规则的工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。 虽然我们使用service iptables start 可以启动iptables"服务",但准确来说,因为iptables并没有一个守护进程daemon,所以并不能算是真正意义上的服务,而是属于内核提供的功能。
netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains 等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。
状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后, RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。
netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。
另外,netfilter/iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
二、iptables的四表五链
2.1 四张表
Iptables 是用来设置、维护和检查Linux内核的IP包过滤规则的工具。可以定义不同的表,每个表都包含几个内部的链(也可以理解为关卡),也能包含用户自定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。
- 所有的规则都存在于下列4张表中,当这4张表处于同一条链时,执行的优先级为:raw--> mangle -->nat --> filter:
- raw表:关闭nat表上启用的连接追踪机制。内核模块:iptable_raw
- mangle表:拆解报文,修改报文,并重新封装。内核模块:iptable_mangles
- nat表:Network Address Translation,网络地址转换功能。内核模块:iptables_nat
- filter表:包过滤,用于防火墙rules规则。内核模块:iptables_filter
2.2 五条链
- 5条链为:
- INPUT链:处理进入系统的数据包
- OUTPUT链:处理流出系统的数据包
- PORWARD链:处理需要转发的数据包
- PREROUTING链:用于目标地址转换(DNAT,外网访问内网)
- POSTOUTING链:用于源地址转换(SNAT,内网访问外网)
2.3 表与链的对应关系
- 表与链的对应关系为:
- raw表中的规则可以使用的链:PREROUTING、OUTPUT
- mangle表中的规则可以使用的链:PREROUTING、POSTROUTING、INPUT、FORWARD、OUTPUT
- nat表中的规则可以使用的链:PREROUTING、POSTROUTING、OUTPUT(CentOS7版本以后还有INPUT)
- filter表中的规则可以使用的链:INPUT、FORWARD、OUTPUT
2.4 处理动作target
防火墙的规则指定所检查包的特征,和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定,该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过],DROP[删除],QUEUE[排队],或者 RETURN[返回]。
ACCEPT 表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配,到前一个链的规则重新开始。如果到达了一个内建的链(的末端),或者遇到内建链的规则是RETURN,包的命运将由链准则指定的target目标决定。
- 处理动作 "target"
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包,不回复任何信息
- REJECT:拒绝数据包通过,必要时向客户端发送一个响应信息
- SNAT:源地址转换,内网访问外网时使用同一个合法公网ip
- MASQUERADE:属于SNAT的一种特殊形式,适用于动态的、临时的、会发生改变的ip上
- DNAT:目标地址转换,外网访问内网时,指定目标服务器
- REDIRECT:在本机做端口映射
- LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则,也就是除了记录日志以外不对数据包做任何其他操作。
三、 使用iptabes
3.1 iptables基本使用
- /sbin/iptables -t 表名 <-A/I/D/R> 链名 [规则序号] <-i/o 网卡名> -p 协议名 <-s 源IP> --sport 源端口 <-d 目标IP> --dport 目标端口 -j 动作
- 示例:iptables -t filter -A INPUT 2 -p icmp -j REJECT
- 注意事项:
- 可以不指定表,默认为 filter 表
- 可以不指定链,默认对应表的所有链
- 如果没有匹配的规则,则使用防火墙的默认规则
- 选项/链名/目标操作必须用大写字母,其余都时小写
- 常用的选项及匹配条件
- -t:指定要使用的表
- -A:向规则链尾添加条目
- -D:删除链内指定内容(或者序号)的一条规则 //iptables -D INPUT 3
- -I:向规则链的开头(或指定序号)插入条目
- -R:替换规则链中的条目
- -L:显示规则链中所有的条目
- -n:以数字形式显示地址,端口等信息
- -v:显示详细信息 //iptables -nvL
- --line-numbers:查看规则时,显示规则的序号 // iptables -L OUTPUT -n -v --line-numbers
- -F:清除规则链中所有的条目 //iptables -t filter -F
- -Z:清空规则链中的数据包计算器和字节计数器
- -N:创建新的用户自定义规则链
- -P:定义规则链中的默认目标规则 //iptables -t filter -P INPUT DROP
- -h:显示帮助信息
- -p:指定要匹配的数据包协议类型
- -s:指定要匹配的数据包源ip地址
- -j<目标操作>:指定要跳转的目标
- -i<网络接口>:指定数据包进入本机的网络接口
- -o<网络接口>:指定数据包要离开本机所使用的网络接口
- --sport:源端口
- --dport:目标端口
- --icmp-type:ICMP类型 //iptables -p icmp --help 查看可用的ICMP类型
- 需要取反时,用叹号 !
3.2 filter过滤规则示例
- 主机防护,针对入站访问的源地址
- iptables -A INPUT -s 192.168.1.0/24 -j REJECT
- 网络防护,针对转发访问的源地址
- iptables -A FORWARD -s 192.168.1.0/24 DROP
- 保护特定网络服务,限制对指定服务端口的访问
- iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -p tcp --dport 22 -j DROP
- 禁PING相关规则,但是禁止其他主机ping本机
- iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
- iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
- iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT
- iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
- iptables -A OUTPUT -p icmp ! --icmp-type echo-request -j DROP
3.3 防火墙扩展规则
- iptables在基本过滤条件的基础上还扩展了很多其他条件,在使用时需要使用-m参数来启动这些扩展功能,语法如下:
- iptables 选项 链名称 -m 扩展模块 --具体扩展条件 -j 动作
- 常见的扩展条件类型如下表:
类别 | 选项 | 用法 |
扩展匹配 | MAC地址匹配 | -m mac --mac-source <mac地址> |
多端口匹配 | -m multiport --sports <源端口列表> | |
-m multiport --dports <目标端口列表> | ||
IP范围匹配 | -m iprange --src-range <源ip1-ip2> | |
-m iprange --dst-range <目标ip1-ip2> |
3.3.1 根据MAC地址过滤
- 根据IP过滤的规则,当对方修改IP后,防火墙会失效,根据MAC地址过滤,可以防止这种情况的发生
- iptables -I INPUT -s 192.168.1.100 -p tcp --dport 22 -j DROP
- iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 52:54:00:00:00:0b -j DROP
3.3.2 基于多端口设置过滤规则
- 一次需要过滤或放行很多端口时会比较方便
- 多端口还可以限制多个源端口,但因为源端口不固定,一般不会使用,限制多个源端口的参数是--sports
- iptables -A INPUT -p tcp -m multiport --dports 20:22,25,80,110,143,16501:16800 -j ACCEPT
3.3.3 根据IP地址范围设置规则
- 允许或者禁止从某个地址段登录
- 这里也可以限制多个目标IP的范围,参数是--dst-range,用法与--src-range一致
- iptables -A INPUT -p tcp --dport 22 -m iprange --src-range192.168.4.10-192.168.4.20 -j ACCEPT
- iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
3.4 SNAT与DNAT
3.4.1 配置SNAT源地址转换
- 原理:在路由器后(POSTROUTING)将内网的ip地址修改为外网网卡的ip地址
- 应用场景:共享内部主机上网
- 设置SNAT:网关主机进行设置
- 编写规则:
iptables -t nat -I POSTROUTING -o 外网网卡 -s 内网网段 -j SNAT --to-source 外网ip地址 //适用于外网ip地址固定场景
iptables -t nat -I POSTROUTING -o 外网网卡 -s 内网网段 -j MASQUERADE //适用于共享动态ip地址上网(如adsl拨号,dhcp获取外网ip)
- 这里,我们设定192.168.2.0/24网络为外部网络,192.168.4.0/24为内部网络。
- 现在,在外部网络中有一台web服务器192.168.2.100,因为设置了网关,client已经可以访问此web服务器了。但,如果查看web1的日志就会发现,日志里记录的是192.168.4.100在访问网页。
- 我们需要实现的是client可以访问web服务器,但要伪装为192.168.2.5后再访问web服务器(模拟所有位于公司内部的电脑都使用的是私有IP,希望访问外网,就需要伪装为公司的外网IP后才可以)。
- 内外网示例案例环境:
主机名 | 网卡、ip地址及网关 |
Client | eth0:192.168.4.100 |
网关:192.168.4.5 | |
proxy | eth0:192.168.4.5 |
eth1:192.168.2.5 | |
web1 | eth1:192.168.2.100 |
网关:192.168.2.5 |
- 确保proxy主机开启了路由转发功能
- echo 1 > /proc/sys/net/ipv4/ip_forward
- 设置防火墙规则,实现SNAT源地址转换
- iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.2.5
- 查看web主机日志 tail /var/log/httpd/access_log,通过日志会发现,客户端是先伪装为了192.168.2.5之后再访问的web服务器
- 192.168.2.5 - - [12/Aug/2018:17:57:10 +0800] "GET / HTTP/1.1" 200 27 "-" "Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1)"
3.4.2 MASQUERADE
- 对于proxy外网IP不固定的情况可以执行下面的地址伪装,动态伪装IP
- iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j MASQUERADE
3.4.3 DNAT 目标地址转换
- 原理:在路由前(PREROUTING)将来自外网访问网关公网ip及对应端口的目的ip及端口修改为内部服务器的ip及端口,实现发布内部服务器。
- 应用场景:发布内部主机服务。
- 设置DNAT:网关主机上设置。
- 编写防火墙规则:iptables -t nat -I PREROUTING -i 外网网卡 -d 外网ip tcp --dport 发布的端口 -j DNAT --to-destination 内网服务ip:端口
- iptables -t nat -A PREROUTING -d 116.1.228.126 -p tcp --dport 8081 -j DNAT --to-destination 192.168.2.4:80
四、iptables保存与恢复
- 规则备份iptables-save //iptables-save >/etc/sysconfig/iptables.bak
- 恢复规则iptables-restore //iptables-restore >/etc/sysconfig/iptables.bak
- 保存规则 //service iptables save
- CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替。service命令只保留下了极少部分使用,大部分命令都要改用systemctl使用。在RHEL 7 / CentOS 7中,firewalld被引入来管理iptables。
#service iptables save
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
- 如果要在7版本及以上系统中使用service iptables save,需要做如下操作:
- 停止firewalld服务 systemctl stop firewalld、systemctl mask firewalld
- 安装iptables-services yum -y install iptables-services
- 设置开机自启动 systemctl enable iptables
- 保存防火墙规则配置 service iptables save