netfilter/iptables是集成在Linux2.4.X版本内核中的包过滤防火墙系统
netfilter/iptables框架可以实现数据包过滤、网络地址转换以及数据包管理功能
Linux中防火墙系统包括两部分:netfilter和iptables;netfilter位于内核空间,iptables是用户工具
iptables默认维护着四个表和五个链
默认的iptables规则表有:fileter表(过滤规则表)、nat表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)
每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)、POSTROUTING(路由后过滤)
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 重定向
-A选项添加防火墙规则会将该规则追加到整个链的最后,而使用-I选项添加的规则默认会插入到链中作为第一条规则
例子:
[[email protected] /]# iptables -nL //查看filter表的所有规则
[[email protected] /]# iptables -t nat -nL //查看nat表的所有规则
[[email protected] /]# iptables -F //清空filter表中的所有规则
[[email protected] /]# iptables -A INPUT -s 192.168.0.1 -j DROP //往filter表添加一条新的入站规则,丢弃192.168.0.1主机发送给防火墙本身的所有数据包
[[email protected] /]# iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT //往filter表插入一条新的入站规则,拒绝192.168.0.22 ping防火墙本机
[[email protected] /]# iptables -nL --line-number //查看filter表中防火墙规则并显示规则编号
[[email protected] /]# iptables -D INPUT 1 //删除filter表中INPUT链的第一条规则
[[email protected] /]# iptables -R INPUT 2 ! -s 192.168.0.254 -j REJECT //替换filter表中INPUT链的第二条规则,拒绝192.168.0.254之外的任何主机连接防火墙本机
[[email protected] /]# iptsbles -t filter -P INPUT ACCEPT //修改filter表中INPUT链的默认规则为接受数据包
[[email protected] /]# iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG //将192.168.0.10主机发送给防火墙本机22端口的所有数据包信息记录到messages日志
[[email protected] /]# iptables -I INPUT -i eth0 --p tcp --dport 80 -j ACCEPT //允许任何主机从eth0网络接口访问防火墙本机的80端口
iptables防火墙应用案例
案例1:允许任意客户端访问服务器主机提供的日常服务(HTTP、HTTPS、DNS、NTP、SMTP、POP3、SSH),在Linux系统中,/etc/services文件可以帮助我们找到各种服务所对应的标准端口信息。
[[email protected] /]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[[email protected] /]# iptables -A INPUT -p udp --dport 25 -j ACCEPT
[[email protected] /]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
[[email protected] /]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[[email protected] /]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[[email protected] /]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[[email protected] /]# iptables -A INPUT -p tcp --dport 143 -j ACCEPT
[[email protected] /]# iptables -A INPUT -p tcp --dport 123 -j ACCEPT
[[email protected] /]# iptables -P INPUT DROP
[[email protected] /]# iptables -P OUTPUT ACCEPT
案例2:公司拥有一个公有IP,使用防火墙实现局域网中所有的主机通过SNAT共享上网,使用CentOS作为公司软路由,公司内部所有192.168.0.0/24网段内的主机连接外网时,防火墙自动将所有数据包的源地址修改为路由器上的公有IP,最后互联网将信息返回路由后,由路由再转交给真正的后端主机。防火墙源地址转换(SNAT)规则需要被写入到NAT表的POSTROUTING链。
[[email protected] /]# vim /etc/sysctl.conf
net.ipv4.ip_forward =1 //开启路由转发,实现基于Linux的软路由功能
[[email protected] /]# sysctl -p //重新加载内核参数配置文件/etc/sysctl.conf
[[email protected] /]# iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84
案例3:公司对外有一个公有IP,内部有HTTP、MAIL两台核心服务器,通过防火墙实现客户可以从互联网的任意位置访问位于公司内部的两台服务器资源
[[email protected] /]# vim /etc/sysctl.conf
net.ipv4.ip_forward =1 //开启路由转发,实现基于Linux的软路由功能
[[email protected] /]# sysctl -p //重新加载内核参数配置文件/etc/sysctl.conf
[[email protected] /]# iptables -t nat -I PREROUTING -d 124.126.198.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
[[email protected] /]# iptables -t nat -I PREROUTING -d 124.129.198.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
[[email protected] /]# iptables -t nat -I PREROUTING -d 124.126.198.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101
案例4:数据包因为太大无法一次完成数据的传输,此时数据包将被分割为数据片段再发送出去,接收端接收完数据后,将把这些数据片段重新组合成完整的数据包。但问题在于当数据被分割后,只有前面的初始数据片段包含全部的数据头部信息(IP、TCP、UDP、ICMP等),后续的数据片段仅包含数据包头部信息的一部分。这时再去检查后续数据片段的头部信息是不可能的。当然,如果你想匹配第二个及后面被分片的数据,可以使用“-f”选项
丢弃发送至192.168.1.1的所有数据以及分片数据
[[email protected] /]# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
案例5:目前网络上的攻击手法层出不穷,很多攻击会采用发送大量无效的数据包给服务器,造成服务器无法响应正常的请求包,iptables提供了一个limit扩展功能,可以限制单位时间内数据包的个数。下面的规则是当每秒钟数据包个数为500时接受入站连接,否则拒绝连接
[[email protected] /]# iptables -I INPUT -m limit --limit 500/sec -j ACCEPT
[[email protected] /]# iptables -P INPUT DROP
案例6:企业环境中,服务器会面临各种各样的攻击,iptables本身属于三层包过滤防火墙,但也提供了string扩展功能,通过--string也可以根据关键词限制网络连接。将下面两条记录写入基于Linux的软路由服务器规则中,实现拒绝转发包含有关键词/etc/passad 以及qq的数据包,也就是防止将密码文件复制出局域网,并防止内部员工访问QQ网站
[[email protected] /]# iptables -I FORWARD -m string --algo bm --string "/etc/passwd" -j REJECT
[[email protected] /]# iptables -I FORWARD -m string --algo bm --string "qq" -j REJECT
案例7:根据数据连接状态设置防火墙规则,放行所有的出站数据包,拒绝入站的新连接请求与无效连接,放行入站的回应请求
[[email protected] /]# iptables -F
[[email protected] /]# iptables -A INPUT -m state --state NEW -j DROP
[[email protected] /]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[[email protected] /]# iptables -P OUTPUT ACCEPT
案例8:公司采用基于Linux的软路由设备,要求在路由设备上设置防火墙规则,记录192.168.0.1至192.168.0.22地址段内所有的主机发送给路由要求转发的数据包,并允许转发这些数据包
[[email protected] /]# iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j LOG
[[email protected] /]# iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j ACCEPT