linux运维总结十九:iptables防火墙
一、简介
netfilter/iptables框架可以实现数据包过滤,网络地址转换以及数据包功能。Linux中的防火墙系统包括两部分:netfilte和iptables。netfilter位于内核空间,目前是Linux内核组成部分。具体地说,netfilter是Linux内核内部的一系列钩子,这些钩子允许数据表过滤函数挂载到系统内核中。iptables是用户工具,由于 netfilter在内核空间中,用户通常无法接触内核和修改内核,些时就需要一个像iptables这样的命令工具,使用iptables可以添加 ,删除具体的过滤规则,iptables默认维护着四个表和五个链,所有防火墙策略规则都将被分别写入这些表与链中。Linux防火墙因为已经集成在内核中,所以相对于应用层防火墙产品而言,基于内核的Linux防火墙更加快捷,高效。
iptables有很多可扩展性,也就是说,内核架构与iptables工具都可以添加扩展功能,Centos 6.3系统中防火墙模块存
/lib/modules/2.6.32-358.el6.x86_64/kernel/net/netfilter目录下,当需要某个模块功能时,可以通过modprobe加载该模块功能。
默认iptables规则表有:fileter表(过滤规则表),nat表(地址转换规则表),mangle(修改数据标记位规则 表),raw(跟踪数据表规则表)。每个规则 表中包含多个数据链:INPUT(入站数据过滤),OUTPUT(出站数据过滤),FORWARD(转发数据过滤),PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体数据链中。下图展示了Linux防火墙过滤框架,如果是外部主机发送数据包给防火墙本机,数据将会经过PREROUTING链与INPUT链;如果是防火墙本机发送数据包到外部主机,数据将会经过OUTPUT链与POSTROUTING链;如果防火墙为路由负责转发数据,则数据将经过PREROUTING链,FORWARD链以及POSTROUTING链。

二、iptables防火墙语法格式
管理员需要使用iptables命令添加 ,删除防火墙规则 ,下面我们看看iptables命令具体用法。
命令描述 :netfilter防火墙规则 管理工具
用法 :iptables[-t 表名 ] {-A|-D|-I|-D|-F|-L|-Z|-P}链名 rule-specification
选项:
-t 指定需要维护的防火墙规则表,不用-t 时,则默认操作对象为filter表
-A 追加防火墙规则
-D 删除防火墙规则
-I 插入防火墙规则
-F 清空防火墙规则
-L 列出防火墙规则
-R 替换防火墙规则
-Z 清空防火墙数据表统计信息
-P 设置链默认规则
匹配参数:
[!] -p 匹配协议,!代表取反
[!] -s 匹配源地址
[!] -d 匹配目标地址
[!] -i 匹配入站网卡接口
[!] -o 匹配出站网卡接口
[!] --sport 匹配源端口
[!] --dport 匹配目标端口
[!] --src-range 匹配源地址范围
[!] --dst-range 匹配目标地址范围
[!] --limit 匹配数据表速度
[!] --mac-source 匹配源MAC地址
[!] --sports 匹配源端口
[!] --dports 匹配目标端口
[!] --state 匹配状态(INVALID,ESTABLISHED,NEW,RELATED)
[!] --string 匹配应用层字串
触发动作:
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录syslog日志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向
iptables防火墙规则顺序很重要,内核按顺序检查 这些规则 ,如果发现匹配规则 条目,立即执行相关动作,停止继续向下查找规则条目,如查所有防火墙规则都未能匹配成功,则按默认策略处理。我们使用-A 选项添加 防火墙规则 会将该规则追加到整个链接最后,而使用-I 选项添加 的规则 默认会插入到链中作为第一条规则 。下面通过 实例简单演示iptables命令使用访求
查看filter 表所有规则
[root@puppet ~]# iptables -nL

查看nat表所有规则
[root@puppet ~]# iptables -t nat -nL

清空filter 表中所有 规则
[root@puppet ~]# iptables -F
往filter表添加 一条新入站规则,丢弃192.168.0.1主机发送给防火墙本机的所有数据包
[root@puppet ~]# iptables -A INPUT -s 192.168.0.1 -j DROP

查看filter表中防火墙规则并显示规则编号
[root@puppet ~]# iptables -nL --line-number

往filter 表插入一条新的入站规则,拒绝192.168.0.22 ping 防火墙本机
[root@puppet ~]# iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT

删除filter表中INPUT链的第一条规则
[root@puppet ~]# iptables -D INPUT 1

替换filter 表中INPUT 链的第一条规则,拒绝192.168.0.254之外 的任何主机连接防火墙本机:
[root@puppet ~]# iptables -R INPUT 1 ! -s 192.168.0.254 -j REJECT

修改filter 表中INPUT链默认规则 为接收数据包
[root@puppet ~]# iptables -t filter -P INPUT ACCEPT

将192.168.0.10主机发送给防火墙本机22端口的所有数据包信息记录到messages日志。
[root@puppet ~]# iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG

允许任何订同从eth0网络接品访问防火墙本机的80端口
[root@puppet ~]# iptables -I INPUT -i eth0 -p tcp --dport 80 -j ACCEPT

三、iptables 防火墙应用案例
案例1:允许任意客户访问服务器主机提供的日常服务(HTTP,HTTPS,DNS,NTP,SMTP,POP3,SSH)在linux 系统 中,/etc/services 文件可以帮助我们找到各种服务所对应的标准端口信息。
[root@agent ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@agent ~]# iptables -A INPUT -p udp --dport 25 -j ACCEPT
[root@agent ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
[root@agent ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[root@agent ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@agent ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@agent ~]# iptables -A INPUT -p tcp --dport 143 -j ACCEPT
[root@agent ~]# iptables -A INPUT -p tcp --dport 123 -j ACCEPT
[root@agent ~]# iptables -P INPUT DROP
[root@agent ~]# iptables -P OUTPUT ACCEPT
案例2、公司拥有一个仅有IP,使用防火墙实现 局域网中所有 主机通过 SNAT共享上网,拓扑如下图,我们使用CentOS 6.3作为公司软路由,公司内部所有 192.168.0.0/24网段内的主机连接 外网时,防火墙自动将所有 数据包的源地址修改为路由器上的的公有IP,最后互联网将信息返回路由后,由路由再转交给真正的后端 主机。 防火墙源地址转换(SNAT)规则需要被写入NAT表的POSTROUTING链。

[root@agent ~]# vi /etc/sysctl.conf
开启路由转发,实现 基于linux软路由功能

[root@agent ~]# sysctl -p #重新加载内核参数配置文件/etc/sysctl.conf

[root@agent ~]# iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84

案例3 :公司对外有一个公有IP,内部有HTTP,MAIL两台核心服务器,通过 防火墙现客户可以从互联网的任意位置访问位于公司内部的两台服务器资源,拓扑结构类似下图,只是连接的方向发生了改变。案例2是源地址转换(SNAT),本例是目标地址转换(DNAT)

[root@agent ~]# vi /etc/sysctl.conf
开启路由转发,实现 基于linux软路由功能

[root@agent ~]# sysctl -p #重新加载内核参数配置文件/etc/sysctl.conf

[root@agent ~]# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
[root@agent ~]# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
[root@agent ~]# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101

案例4:数据包因为太大无法一次完成数据的传输,此时 数据包将被分割为数据片段再发送出去。接收端接收完数据后,将把这些数据片段重新组合成完整的数据包。但问题在于当数据被 分割后,只有前面 的初始数据片段包含全部数据头部信息(IP,TCP,UDP,ICMP等),后续 数据片段仅包含数据包关总信息的一部分。这时再去检查 后续数据片段的头部信息是不可能的。当然,如果你想匹配第二个及后面被分片的数据,可以使用"-f"选项。
丢弃发送至192.168.1.1的所有数据以及分片数据:
[root@agent ~]# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
案例5:目前网络上的攻击手法层出不穷,很多攻击会采用发送大量无效数据包给服务器,造成服务器无法响应正常为请求包,iptables 提供了一个limit扩展功能,可以限制单位时间内数据包的个数。下面规则 是当每秒钟数据包个数为500时接受入站连接,否则拒绝连接 。
[root@agent ~]# iptables -I INPUT -m limit --limit 500/sec -j ACCEPT
[root@agent ~]# iptables -P INPUT DROP

案例6:企业环境中,服务器会面临各种各样的攻击,iptables 本身属于三层包过滤防火墙,但也提供了string扩展功能,通过 --string也可以根据关键词限制网络连接。将下面两条记录写入基于linux 软路由服务器防火墙规则 中,实现拒绝转发包含关键词的/etc/passwd以及qq 的数据包,也就是防止密码文件复制出局域网,并防止内部员工访问QQ网站。
[root@agent ~]# iptables -I FORWARD -m string --algo bm --string "/etc/passwd" -j REJECT
[root@agent ~]# iptables -I FORWARD -m string --algo bm --string "qq" -j REJECT
案例7:根据数据连接状态设置防火墙规则,旅行所有 的出站数据包。拒绝入站的新连接请求与无效连接请求与无效连接,放行入站的回应请求。
[root@agent ~]# iptables -F

[root@agent ~]#iptables -A INPUT -m state --state NEW -j DROP
[root@agent ~]#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@agent ~]#iptables -P OUTPUT ACCEPT
案例8:公司采用基于linux软路由设备 ,要求在路由设备上设置防火墙规则 ,记录192.168.0.1至192.168.0.22地址段内所有主机发送给路由要求转发的数据包,并允许转发这些数据包。
[root@agent ~]# iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j LOG
[root@agent ~]# iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j ACCEPT

四、防火墙备份与还原
默认iptables 防火墙规则 会立刻生效,但如果不保存,录计算机重启后所有 规则 都将丢失,所以对防火墙规则 进行及时保存的操作时非常必要的。iptables 软件包提供了两个非常有用的工具,我们可以使用工具处理大量的防火墙规则 。这两个工具分别 是iptables-save 和 iptables-restore ,使用该工具实现 防火墙规则 的保存与还原。这两个工具的最大优势是处理庞大的规则集时速度非常快。CentOS 6.3系统防火墙规则默认保存/etc/sysconfig/iptables 文件中,使用iptables-save 将规则 保存至该文件中可以实现 保存防火墙规则 的作用,计算机重启后会自动加载该文件中的规则 。如果使用iptables-save 将规则 保存至其他位置,可以实现 备份防火墙规则 的作用。当防火墙规则 需要做还原操作时, 可以使用iptables-restore 将备份文件直接导入当前防火墙规则 。
[root@agent ~]# iptables-save > /etc/sysconfig/iptables
[root@agent ~]# iptables-save > /tmp/firewall.bak
[root@agent ~]# iptables-restore < /tmp/firewall.bak

浙公网安备 33010602011771号