一、IPTABLES的简介

iptables 是与 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
 netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
 netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。   
另外,netfilter/iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
IPTABLES的表和链
IPTABLES常用的表和链有三个filter表 nat表 mangle表, 和五个链 INPUT链 OUTPUT链 FORWARE链 POSTROUTING链 PREROUTING链, 下面来介绍下它们的各个功能呢个功能,
1.filter表
filter表主要是过滤数据包的,IPTABLES几乎所有的数据包过滤都在此表中实现的,filter表也是IPTABLES中默认的表,此表中还包含三个链如下
1.1 INPUT链
过滤所有的目标地址是本机的数据包
1.2 OUTPUT链
过滤所有从本机出去的数据包
1.3 FORWORD链
过滤所有从本机路过的数据包
2.nat表
nat表主要是用于做网络地址转换的(NAT) 在IPTABLES中可以做SNAT(源地址转换),DNAT(目标地址转换),PANT(即跟SNAT差不多,不一样的是SNAT的源地址是固定的,而PNAT的源地址是不固定的,当使用ppp 或pppoe的方式连接互联网的时候一般适应这中) 。 nat表中包含两个链如下
2.1 PREROUTING链
在数据包到达防火墙的时候改变目标地址 DNAT应用于此链.
2.2 OUTPUT链
可以改变本地产生的数据包的目标地址
2.3 POSTROUTING链
在数据包离开防火墙的时候改变源地址,SNAT应用于次链
3. mangle表
mangle表主要是修改数据包头部信息的,此表中包含以下5条链
3.1 PREROUTING链,
在数据包进入防火墙之后,也称为路由前,
3.2 POSTROUTING链,
在数据包确定目标地址后,也称为路由后,
3.3 OUTPUT链
从本机出去的时间包路由前
3.4 INPUT链
数据包进入本机后,路由后
3.5 FORWARD链
第一次路由判断之后,最后一次路由判断之前改变数据包
IPABLES的状态
IPTABLES的状态跟踪连接有4种,分别是,NEW,ESTABLISHED,RELATED,INVALID,除了从本机出去的数据包有nat表的OUTPUT链处理外,其他说有的状态跟踪都在nat表中的PREROUTING链中处理,下面来说下4种状态是什么,
1,NEW状态
NEW状态的数据包说明这个数据包是收到的第一个数据包,
2,ESTABLISHED状态,
只要发送并接到应答,一个数据包的状态就从NEW变为ESTABLEISHED,而且该状态会继续匹配这个连接后继数据包,
3,RELATED状态
当一个数据包的状态处于ESTABLSHED状态的连接有关系的时候,就会被认为是RELATED,也就是说一个链接想要是RELATED状态,首先要有一个ESTABLISHED的连接,
4,INVALID状态
不能被识别属于哪个连接状态或没有任何关系的状态,一般这中数据包要被拒绝的
IPTABLES命令的使用详解
iptables在RHEL的系统上默认安装的, IPTABLES的命令选项主要分为这么几大类,规则管理,链管理,默认管理,查看,匹配条件,处理动作,基本应该就这些了吧,下面来一一说名,
1,规则管理类
#iptables -A     添加一条新规则
#iptables -I     插入一条新规则 -I 后面加一数字表示插入到哪行
#iptables -D     删除一条新规则 -D 后面加一数字表示删除哪行
#iptables -R     替换一条新规则 -R 后面加一数字表示替换哪行
2.链管理类
#iptables -F     清空链中的所有规则
#iptables -N     新建一个链
#iptables -X     删除一个自定义链,删除之前要保证次链是空的,而且没有被引用
#iptables -E     重命名链
3.默认管理类
#iptables -P     设置默认策略
4,查看类
#iptables -L     查看规则 -L还有几个子选项如下
#iptables -L -n 以数字的方式显示
#iptables -L -v 显示详细信息
#iptables -L -x 显示精确信息
#iptables -L --line-numbers 显示行号
5,条件匹配类
5.1 基本匹配
条件匹配也可以使用 ! 取反
-s     源地址
-d     目标地址
-p     协议{tcp|udp|icmp}
-i     从哪个网络接口进入,比如 -i eth0
-o     从哪个网络接口出去,比如 -o eth0
5.2扩展匹配
5.2.1隐含扩展匹配
-p {tcp|udp} --sport    指定源端口
-p {tcp|udp} --dport    指定目标端口
5.2.2显示扩展匹配
-m state --state    匹配状态的
-m mutiport --source-port    端口匹配 ,指定一组端口
-m limit --limit 3/minute    每三分种一次
-m limit --limit-burst 5    只匹配5个数据包
-m string --string --algo bm|kmp --string "xxxx" 匹配字符串
-m time --timestart 8:00 --timestop 12:00 表示从哪个时间到哪个时间段
-m time --days     表示那天
-m mac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址
-m layer7 --l7proto qq    表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹配, 
6,处理动作类
-j ACCEPT      允许
-j REJECT      拒绝
-j DROP        拒绝并提示信息
-j SNAT        源地址转换
-j DNAT        目标地址转换
-j REDIRECT    重定向
-j MASQUERAED 地址伪装
-j LOG --log-prefix "说明信息,自己随便定义"       记录日志
企业中防火墙的部署的方式:
一、单宿主堡垒主机
单宿主堡垒主机其实就是单台服务器有防火墙,只为单台服务器防护。
二、双宿主堡垒主机
双宿主堡垒主机是一台装有两块网卡的堡垒主机,一般这台堡垒主机应用在网关,防护局域网跟广域网之间通信等安全
三、宿主堡垒主机
是一台装有三块网卡的堡垒主机,那么他将外网,内网,DMZ 三个区域隔离开来,同时保护内网已经DMZ区域的安全等
四、背靠背方式
实际上前端防火墙是防护外网到DMZ区域以及到内网,后端防火墙是防护内网到DMZ区域的安全
从技术方面实现的防火墙也可分为三种
第一种包过滤型防火墙:这类的防火墙主要是工作在网络层,根据事先设定好的规则进行检查,检查结果根据事先设定好的处理机制进行处理。
第二种应用层防火墙:它是工作在TCP/IP模型中的最高层应用层,相比较来说速度要慢一点。
第三种状态监视器:状态监视做为防火墙其安全性为最佳,但配置比较复杂,且网络速度较慢。
二、重新编译内核
1、合并kernel+layer7补丁
tar -jxvf linux-2.6.25.19.tar.bz2 -C /usr/src/
tar -zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/
cd /usr/src/linux-2.6.25.19/
# patch -p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch
2、配置新内核
[root@localhost ~]# cd /usr/src/linux-2.6.25.19/
[root@localhost linux-2.6.25.19]# cp /boot/config-2.6.18-164.el5 .config
                                               #沿用旧的内核配置
[root@localhost linux-2.6.25.19]#make menuconfig
    //配置内核时,在“Networking ---> Networking Options ---> Network Packet filtering framework (Netfilter) ”处主要注意两个地方:
    1) ---> Core Netfilter Configuration
        //将“Netfilter connection tracking suport (NEW)”选择编译为模块(M),需选取此项才能看到layer7支持的配置。

 //将layer7、string、state、time、IPsec、iprange、connlimit……等编译成模块,根据需要自行选择。

 

 

 

 

   2) ---> IP: Netfilter Configuration

        //将“IPv4 connection tracking support (require for NAT)”编译成模块。

 

      //将“Full NAT”下的“MASQUERADE target support”和“REDIRECT target support”编译成模块。

 

3、编译及安装模块、新内核
shell> make && make modules_install && make install
        #编译安装成后后,重启选择使用新的内核(2.6.25.19)引导系统
三、重新编译iptables
1、卸载原来的iptables
[root@localhost ~]# cd /etc/init.d/
[root@localhost init.d]# cp iptables iptables.bak
[root@localhost ~]# rpm -e iptables –nodeps
2、合并iptables+layer7补丁
tar -jxvf iptables-1.4.2.tar.bz2 -C /usr/src/
# cd /usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward/
#cp libxt_layer7.c libxt_layer7.man /usr/src/iptables-1.4.2/extensions/
3、编译安装
#cd /usr/src/iptables-1.4.2/
./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19
[root@localhost iptables-1.4.2]# make && make install
4、安装l7-protocols模式包
[root@localhost ~]# tar zxvf l7-protocols-2008-10-04.tar.gz -C /etc/
[root@localhost ~]# mv /etc/l7-protocols-2008-10-04 /etc/l7-protocols
[root@localhost ~]# mv /etc/init.d/iptables.bak /etc/init.d/iptables
5、重启iptables服务
[root@localhost ~]# service iptables restart
四、案例
某公司有三个部门, 防火墙部署的方式为三宿主堡垒主机,即一台装有三块网卡的堡垒主机,那么他将外网,内网,DMZ 三个区域隔离开来,同时保护内网已经DMZ区域的安全。
工程部门 192.168.10.11—192.168.10.20
技术部门   192.168.10.21—192.168.10.30
经理办     192.168.10.31—192.168.10.40
公司上班时间 (周一到周五 08:00---20:00)
为了提高员工工作效率,现将公司网络做如下整改:
1、工程部门 上班时间可以访问ftp
不允许 qq聊天和酷狗和http,下班后无限制
2、软件部门 可以访问http   
不允许非法站点sina ,不允许使用迅雷 ,连接数最多3个
不允许聊天 ,下班后无限制
3、经理办公室    可以访问http资源 qq聊天,下班后无限制
4、dmz区域www服务器进行发布
拓扑图

 

六、实验步骤
[root@localhost ~]# vim /etc/sysctl.conf  
7 net.ipv4.ip_forward = 1                   #开启路由转发功能
[root@localhost ~]# sysctl –p                #使之生效
工程部
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to 192.168.101.234                  #为局域网做SNAT
[root@localhost ~]# modprobe ip_nat_ftp  #加上ftp模块
修改为iptablse默认拒绝所有,增加安全性能
允许本机使用ssh方式连接到redhat
[root@localhost ~]# iptables -A INPUT -s 192.168.10.15 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -d 192.168.10.15 -p tcp --sport 22 -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT DROP
[root@localhost ~]# iptables -P FORWARD DROP
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.10.11-192.168.10.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
[root@localhost ~]# iptables -t filter -A FORWARD -p tcp --sport 21 -j ACCEPT
[root@localhost ~]# iptables -t filter -A FORWARD -p tcp --sport 20 -j ACCEPT
[root@localhost ~]# iptables -t filter -A FORWARD -p tcp --dport 20 -j ACCEPT
或者采用基于状态的访问方式,记录数据流出的轨迹,自动返回
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.10.11-192.168.10.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
[root@localhost ~]# iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
上班时间工程部可以访问ftp

 

上班时间不可以访问http资源

 

不可以使用酷狗

[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.11-192.168.10.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto kugoo -j DROP

下班无限制
[root@localhost ~]# iptables -t filter -A FORWARD -s 192.168.10.0/24 -m time --timestart 20:01 --timestop 07:59 -o eth1 -j ACCEPT

 

技术部
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.10.21-192.168.10.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT
允许技术部使用DNS
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.10.21-192.168.10.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p udp --dport 53 -j ACCEPT
可以访问http的资源

 

不允许访问有关新浪的所有网站
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.10.21-192.168.10.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m string --string "sina" --algo bm -j DROP

  

不允许使用qq聊天
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.21-192.168.10.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto qq -j DROP
不允许使用迅雷下载
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.21-192.168.10.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto xunlei -j DROP
不允许使用MSN聊天工具
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.21-192.168.10.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto msnmessenger -j DROP
连接数目不超过三个
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.21-192.168.10.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 -j DROP
当连接数目超过三个的时候,无法正常访问http资源

 

经理办公室
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.31-192.168.10.40 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p udp --dport 53 -j ACCEPT
#放行任何主机访问31——40主机上的TCP协议的53端口上的DNS传输
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.31-192.168.10.40 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT
#放行任何主机访问31——40主机上的TCP协议的80端口上的已经建立的传输
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.31-192.168.10.40 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto qq -j ACCEPT
#允许QQ在工作时间的使用
[root@localhost ~]# iptables -I FORWARD 2 -m iprange --src-range 192.168.10.31-192.168.10.40 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto xunlei -j ACCEPT 
                                        #允许迅雷在工作时间的使用
可以使用迅雷下载

可以qq聊天

 

经理办在上班时间可以浏览新浪站点

 

上班时间不可以访问FTP

 

七、DMZ区域的服务器发布
[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.101.234 -p tcp --dport 80 -i eth1 -j DNAT --to 192.168.2.100
#将外网的web访问请求(80端口)通过DNAT转发至内网web服务器192.168.2.100
[root@localhost ~]# iptables -t filter -A FORWARD -d 192.168.2.100 -p tcp --dport 80 -j ACCEPT
访问外网卡地址,即可访问到DMZ区域的内部192.168.2.100的web页面,实现了内部服务器的发布,同时提高了服务器的安全性能。

 

注:由于以上封闭内容较多,部分软件客户端没有安装,所以没有办法进行一一测试,希望大家谅解!