防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。
防火墙的类型有两种:1网络层的包过滤防火墙 2应用层防火墙.
网络层的包过滤防火墙是工作在网络层,可以定义特定的规则禁止或允许某些特定的数据包通过,有状态监测和简单包过滤的功能。可以利用封装包的多样属性进行过滤如来源ip,目的ip,来源端口号,目的端口号,通信协议等。
包过滤防火墙一般包含有3个表:
1,filter table:过滤表(默认使用的就是filter表)
   包含三个链:
   INPUT:处理输入数据包
   FORWARD:处理转发数据包
   OUTPUT:处理输出数据包    
2,NAT table:用于网络地址转换
   包含三个链:
   POSTROUTING:处理路由后的数据包
   OUTPUT :处理输出数据包
   PREROUTING:处理路由前的数据包
3,mangle table:矫正表,针对策略路由

应用层防火墙是工作在应用层应用,可以拦截进出某应用程序的所有封包并且封锁其他的封包具有安全性高的特点。例如可以拦截qq,迅雷等。

iptables就是一个防火墙是一种基于包过滤的防火墙,但是可以通过给kernel打补丁使iptables具有应用层防火墙的功能

iptables 被分为两部分,一部分被称为核心空间,另一部分称为用户空间,在核心空间,iptables从底层实现了数据包过滤的各种功能,比如NAT、状态检测以及 高级的数据包的匹配策略等,在用户空间,iptables为用户提供了控制核心空间工作状态的命令集。

首先,当一个包进来的时候,也就是从以太网卡进入防火墙,内核首先根据路由表决 定包的目标.如果目标主机就是本机直接进入INPUT链,再由本地正在等待该包的进程接收,否则,如果从以太网卡进来的包目标不是本机,再看是 否内核允许转发包(可用 echo 1 > /proc/sys/net/ipv4/ip_forward 打开转发功能如果不允许转发,则包被DROP掉,如果允许转发,则送出本机,这当中决不经过INPUT或者OUTPUT链,因为路由后的目标不是本机,只 被转发规则应用,最后,该linux防火墙主机本身能够产生包,这种包只经过OUTPUT链被送出防火墙.

iptables处理优先级:mangle>nat>filter规则是从上到下进行匹配,匹配到了就不在向下继续匹配

iptables的使用方法
例如:iptables –t filter –A INPUT –j ACCEPT
在filter表的INPUT链追加一条规则配置所有访问本地的数据包,匹配后丢弃。

例如:iptables –D INPUT 1
删除filter表的INPUT链的第一条规则

iptables –D INPUT –s 192.168.0.1 –j DROP
删除filter表中INPUT链内容为” –s 192.168.0.1 –j DROP”的规则

例:iptables –R INPUT 3 –j ACCEPT
将原来的第三条规则内容替换成”-j ACCEPT”

例:iptables –I INPUT –j DROP
在filter表的INPUT链插入一条规则,插入成第一条

例:iptables –t flter –F INPUT
清空filter表INPUT链中所有规则

例:iptables -N niubi
在filter表上创建一个自定义链niubi

例:iptables –X niubi
删除自定义的链niubi

例:iptables –P INPUT DROP
设置filter表INPUT链默认规则为DROP(丢弃 是最好的规则)
iptables –P INPUT REJECT (直接拒绝)
iptables –P INPUT ACCEPT  (接受、允许通过)

iptables的查看命令
-L:显示所选表的所有链的所有规则
-n :只显示IP地址,不反解析成FQDN,一般与-L合用
-v:显示详细信息
-x:显示精确值,不进行单位换算 和-v一块用
--line-numbers:显示的时候显示规则的行号
-E 重命名链

-s   表示某ip包的源地址
-s   取反
-d   表示目标IP
-d   取反
-i   流入接口 不能跟output和postrouting
-o   流出接口 不能跟input和prerouting一块用
--sport  指定源端口
--dport  指定目的端口
--tcpflags tcp标记位
例:iptables –P INPUT  DROP
iptables –A INPUT -d 172.16.26.1 -p tcp --dport 80 –j ACCEPT
仅允许任意主机访问本机172.16.26.1的web服务
Iptables -A INPUT -s 172.16.100.200 -d 172.16.100.1 -p tcp --dport 80 -j DROP
拒绝172.16.100.200访问172.16.100.1的web服务:80端口
Iptables -A INPUT -s 172.16.100.200 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
允许172.16.100.200访问172.16.100.1的ssh服务;22端口
iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.33 -p icmp -j DROP
拒绝192.168网段的所有主机ping192.168.0.33主机

-p icmp –icmp-type 8 指定icmp的请求包
-p icmp –icmp-type 0 指定icmp的应答包
Echo-request:8 请求为8
Echo-request:0 响应为0
例:iptables –A INPUT –s 192.168.1.0/24 –d 172.16.26.1 –p icmp –icmp-type 8 –j DROP
禁止192.168.1.0网络的主机ping主机172.16.26.1

-j TARGET     调转到指定的目标进行处理
ACCEPT  直接接受
DROP    直接丢弃
REJECT  指接拒绝
--state state状态
NEW:表示是新建立的连接请求
ESTABLISHED :表示所有已建立的连接
例iptables –A OUTPUT –o eth1 –m state --state NEW –j DROP
禁止本机通过eth1出去的新的连接请求
iptables –P OUTPUT DROP
iptables –A OUTPUT –s 172.16.100.1 –m state --state ESTABLISHED –j ACCEPT
仅允许本机回应状态是已建立连接的请求
iptables –P INPUT DROP
iptables –A INPUT –d 172.16.100.1 –p tcp --dport 80 –m state --state NEW,ESTABLISHED –j ACCPT
允许目标地址是172.16.100.1,目标端口是80,状态是新建和已建立连接的请求进入

例:iptables -P INPUT DROP
iptables -A INPUT -d 172.16.100.1 -p tcp -m mport --destination-ports 80,22,23 ,110,143,25 -m state --state NEW,ESTABLISHED -j ACCEPT
只允许使用tcp协议,目标端口是80,22,23,110,143,25状态是新建和已建立的连接的请求进入连接172.16.100.1

允许192.168.1.9到192.168.1.00范围内的主机访问192.168.0.33主机的web服务
iptables -A INPUT -d 192.168.0.33 -m iprange --src-range 192.168.1.0-192.168.1.100 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
例:iptables -A INPUT -d 172.16.100.1 -m iprange --src-range 192.16.1.9-192.168.1.200 -p tcp --dport 80 -m state --state NEW -j DROP
不允许192.16.1.9到192.168.1.200范围内的主机访问172.16.100.1主机的web服务

iptables -I INPUT 1 -p tcp -d 172.16.100.1 --dport 80 -j ACCEPT
iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
iptables
iptables -R INPUT 1 -d 172.16.100.1 -p tcp --dport 80 -m limit --limit 10/second --limit-burst 30 -j ACCEPT
对进来的数据包接受目标地址是172.16.100.1目标端口是80的请求,每秒只能有10个,最大并发请求量为30个

iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m time --timestart 08:30:00 --timestop 14:30:00 --datestart 2012:02:18 --datestop 2012:02:26 -j ACCEPT
2月18日-26日,每天的8:30到14:30之间能访问web服务

iptables -A OUTPUT -s 172.16.100.1 -p tcp --sport 80 -m --algo kmp --string "web" -j DROP
允许请求中,如果有访问Web的都不允许访问


iptables实现网络地址转换,对nat表进行操作
SNAT:源地址转换,实现代理内网客户端访问互联网的
--to-source
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m iprange -src-range 192.168.10.1-192.168.10.100 -j SNAT --to-source 172.16.26.1
将192.168.10.1-192.168.10.100网段数据包的源地址转换成172.16.26.1来访问外网
MASQUERADE 地址伪装
DNAT:目标地址转换,可以实现多个服务器通过一个公网地址提供服务,并能保证安全性
--to-destination
iptables -t nat -A PREROUTING -d 172.16.26.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.6(:8080)
当有用户访问172.16.26.1主机的80端口时,把请求装换成访问内网主机192.168.100.6的8080端口
 
service iptables save 来保存规则,这样会永久生效,规则会写在/etc/sysconfig/iptables

设定本机对ping请求的响应:
(1)本机仅接受来自于172.16.0.0/16网络的ping请求,且请求频度每秒不能超过10个;
iptables -A INPUT -s 172.16.0.0/16  -p icmp --icmp-type 8 -m limt --limit 6/second --limit-burst 10 -j ACCEPT
(2)本机可以向其它任意主机发起Ping请求;
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

 

最后是一个iptables的小项目
192.168.1.0/24是“狼窝”,在要求为172.16.x.1写规则,满足以下求:
1、filter表所有链接的默认规则为DROP;
2、lo接口上进出的所有数据包均放行;
3、Web和ssh开放给非“狼窝”的主机;
1)ssh仅允许在工作时间(每周一至周五的9:00-18:00)被访问,但172.16.0.0/16网络中的主机可在任意时段访问;
2)web服务全时段可被访问,但每秒种接收的新请求的个数不能超过100个;
4、发往本机的ping请求,每秒只响应两个数据包,且最高每秒只响应3个;拒绝来自“狼窝”的ping请求;本机可向任意主机发送Ping请求;
5、本机出口仅将已经建立的连接放行

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

iptables -i lo -j ACCEPT
iptables -o lo -j ACCEPT

iptables -A INPUT -s 0.0.0.0/0.0.0.0 -j clean_in
iptables -A INPUT -s 192.168.1.0/24 -d 172.16.100.1 -j DROP
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -j ACCEPT
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 22 -m time --timestart 09:00:00 --timestop 18:00:00 --days Mon,Tue,Wed,Thu,Fri -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.100.1 -p ICMP --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
iptables -A INPUT -d 172.16.100.1 -p ICMP --icmp-type 0 -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.1 -p ICMP --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.1 -p ICMP --icmp-type 8 -j ACCEPT

iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP

iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 172.16.100.1 -j RETURN