目录:
   一:iptables原理
   二:iptabels的通用匹配
   三:iptables的扩展匹配
   四:iptables filter链应用
   五:iptables nat链应用



一:iptables原理
   iptables只是用户空间的一个工具,用户生成一定的防火墙规则。放置到内核空间中的netfilter框架中的五个钩子函数.
下图是netfilter在内核中的位置:




从上图可以看出,在不改变IP层协议代码的情况下,iptables防火墙模块通过netfilter将防火墙功能引入了IP层,并通过netfilter定义的五个钩子函数。来
实现防火墙功能.
简单说一下工作流程:
1.数据包首先通过网络接口进入到了内核空间的TCP/IP协议栈中,
2.当数据包进入到IP层后需要经过neifilter设置的5个钩子函数
3.用户在用户控空间通过iptables命令生成指定的规则,送至内核空间
4.数据包在经过这5个钩子函数处需要对规则进行匹配才能通过
下面我们来看下这五个钩子函数的位置如下图:



简单说一下数据包是怎么经过这些点的:
1.数据包首先通过网络接口到达IP层然后必须经过PREROUTING
2.通过PREROUTING后就对这个数据包进行路由,查看其目的地址。
3.若为本机地址则会通过INPUT到达上层协议栈(TCP/UDP)然后通过内核到达用户空间的某个进程
4.若为其它地址,则需要进行转发至相应网段的网卡接口,(这台机子具有多个网卡和多个不同网段的地址)
5.转发需要经过FORWARD,转发后通过POSTROUTING转发出去.

这个五个点我们称作iptables的五个链,iptables防火墙模块正是将一个个函数注册至这五个钩子函数中来达到数据包过滤的功能.
这五条链的组合构成了一个个功能我们称为表:

filter:(完成过滤功能)
INPUT OUTPUT FORWARD

nat:(地址转换)
PREROUTING POSTROUTING

mangle:(报文修改)
PREROUTING INPUT OUTPUT FORWARD POSTROUTING

raw:(不对报文做任何修改,用于连接追踪)
PREROUTING OUTPUT

我们可以这些表中对应的链上设置相应的规则。然后有些链在每一个表中都有,那么规则匹配的
时候到底哪个说了算呢,这些表示有优先级的,要按着优先级来匹配:
raw-->mangle-->nat-->filter

iptables命令的使用:

命令格式:
   iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法

COMMAND:
       -A:添加一条规则,添加在链的尾部
       -I CHAIN [num]:插入一条规则,插入为对应的CHAIN上的第num条
       -D CHAIN [num]:删除指定链中第num条规则
       -R CHAIN [num]:替换指定的规则
       -F [CHAIN]: flush 清空指定规则链,如果省略CHAIN,则可以实现删掉对应表中的所有链
       -P CHAIN:设定指定链的默认策略
       -N:自定义一个新的空链
       -X:删除一个自定义的空链
       -Z:置零指定链中所有规则的计数器
       -E:重命名自定义链
       -L:显示指定表中的规则
                   -n:以数字个数显示主机地址和端口号
                   -v:显示详细信息
                   -vv:
                   -x:显示计数器的精确值
                   --line-number:显示规则号码
处理办法:
   ACCEPT
   DROP
   REJECT
   DNAT
   SNAT
   REDIRECT 地址重定向
   MASQUERADS 地址伪装
   LOG 日志
   MARK 打标记
默认可以不用-t指定表名,默认表是filter表,实际工作中用的最多的还是filter表和nat表
iptables服务脚本和命令:
service iptables save 默认保存在/etc/sysconfig/iptables  保存iptables规则
iptables-save > /path/to/somefile
iptables-restore </path/from/somefile
/etc/sysconfig/iptables-config是启动iptables需要指定的配置选项(可以在这里面加载相应的模块)


匹配标准有通用匹配和扩展匹配(有的需要加载相应的扩展模块)两种


二:iptabels的通用匹配
通用匹配:
   1.对报文的源地址和目标地址进行过滤
       -s,--src 指定源地址
       -d,--dst 指定目标地址

   2.对报问使用的协议进行过滤
       -p {tcp|udp|icmp} 指定协议

   3.对报文通过的物理接口进行过滤(ethX,lo等)
       -i INTERFACE 指定数据报文流入的接口
           可用在PREROUTING,INPUT,FORWARD
       -o INTERFACE 指定数据报文流出的接口
           可用在POSTROUTING,OUTPUT,FORWARD




三:iptables的扩展匹配
   扩展匹配:
           隐含扩展:不用特别指定由哪个模块进行的扩展,此时使用-p(tcp|udp|imcp)
               -p tcp
                   对报文传输的源端口和目的端口进行过滤
                       --sport
                       --dport
                   对tcp报文的标志位进行过滤(SYN,FIN,ACK,RST,SYN)
                       --tcp-flags mask comp 只检查mask指定的标志位,是逗号分隔的标志位列表 comp:此列表中出现的标记位必须为1,comp中没出现,而mask出现的必须为0
                               example:--tcp-flags SYN,FIN,ACK,RST SYN 这个例子的意思就是TCP报文的SYN=1 FIN=0 ACK=0 RST=0 很显然这是一个请求报文
               -p icmp
                       --icmp-type(icmp有很多类型 网上可以查到这些类型的作用,ping就是使用的ICMP协议)
                           0:echo-reply (ping的回复)
                           8:echo-request(ping的发送请求)
                       example:iptables -A INPUT -s 192.168.0.x -p icmp --icmp-type 8 -j DROP
                                       iptables -A INPUT -d 192.168.0.x -p icmp --icmp-type 0 -j DROP
                       上面这个例子表示来自于192.168.0.x的所有ping请求包丢弃


           显式扩展:必须指明由哪个模块进行的扩展,iptables中使用-m选项指定
               -m    EXTESTION  --spe-opt
               state:状态扩展
                       结合ip_contrack追踪会话的状态
                       NEW:发起的新的请求
                       ESTABLISH:已建立的连接
                       INVALID:非法连接
                       RELATED:相关联的
                   example: -m state --state NEW -j accept
           multiport:离散的多端口的扩展
                   --source-ports
                   --destination-ports
                   --ports
           iprange:多IP地址
                   --src-range
                   --dst-range
           connlimit:连接数限制
                   ! --connlimit-above NUMBERS
                   example:iptables -A INPUT -d 192.168.227.3 -p tcp --dport 80 -m connlimit ! --connlimit-above 3 -j ACCEPT
           limit: 连接速率的限制
                   --limit RATE
                   --limit-burst    NUMBERS
           string:字符串过滤
                   --algo bm|kmp
                   --string pattern



四:iptables filter链应用
1.对SSH服务放行
iptables -A INPUT -d 192.168.227.5 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 192.168.227.5 -p tcp --sport 22 -j ACCEPT
iptables -P DROP  #设置默认规则
注意:在设置默认规则的时候 要把上面两条放行SSH协议的规则写好,否则要是先设置默认规则,SSH协议就会断掉无法连接上去
对于这种放行方式来说,有一种***无法避免,***者可以在机器内部通过22号端口向外发起连接发送数据
对于这种情况者两条规则无法避免.于是就有了一个新的方法基于状态监测来完成.
只允许客户端向服务器端发起新连接请求:
iptables -A INPUT -d 192.168.227.5 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.227.5 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

2.放行web服务
iptables -A INPUT -d 192.168.227.5 -p tcp -dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.227.5 -p tcp -sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

3.禁止ping,允许通过lo接口进出的数据
iptables -A INPUT -d 192.168.227.5 -p icmp --icmp-type 8 -j DROP
iptables -A OUTPUT -s 192.168.227.5 -p icmp --icmp-type 0 -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

4.放行vsftpd服务
先了解下vsftpd服务的运行原理
vsftpd使用21号端口进行持久连接传输命令,
使用20号端口进行数据传输,数据传输有两种模式:
一:主动模式(服务器端口号20)
服务器端使用20号端口主动连接客户端的一个空闲端口
二:被动模式(服务器端口号随机)
服务端通过命令连接告诉客户端自己讲在服务器端随机开启一个端口,
客户端得到这个端口号就会主动去连接服务器端进行数据传输

然后当服务器端处于被动模式下我们就不好基于端口来进行过滤了,此时可以使用基于状态的过滤
通过使用RELATED状态来实现:
iptables -A INPUT -d 192.168.227.5 -p tcp --dport 21 -j ACCEPT #开放命令连接
iptables -A OUTPUT -s 192.128.227.5 -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -d 192.168.227.5 -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.227.5 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
modprobe ip_conntrack_ftp (加载这个模块 默认没有加载 需要这个模块来跟踪ftp协议的连接信息)


5.实现SSH连接数的限制
iptables -A INPUT -d 192.168.227.5 -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT(靠默认策略拒绝)
或者
iptables -A INPUT -d 192.168.227.5 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
ssh连接多于三次的拒绝连接


6.实现连接速率的限制
iptables -A INPUT -d 192.168.227.5 -m limit --limit-rate 3/minute --limit-burst 10 -j DROP
--limit-burst  10 这个代表在空闲的时候一下可以接受10个连接请求此后按照指速率接受请求

7.实现文本内容的过滤
iptables -A OUTPUT -s 192.168.227.5 -p tcp --sport 80 -m string --algo kmp --string "love" -j DROP
注意:注意这里你要区分是对用户请求的内容进行过滤还是对用户提交的内容进行过滤,如果是提交的内容过滤就是INPUT链,否则就是OUTPUT链

8.使用recent模块防DDOS***
   ssh: 远程连接,
       iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
       iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
       iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

       1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;    
       2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。

下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用

3.iptables的记录:/proc/net/ipt_recent/SSH

也可以使用下面的这句记录日志:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"


五:iptables nat链应用
先看下什么是SNAT,以及SNAT的工作方式见下图:

iptables实现内部私有地址上网:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j SNAT --to-source 123.2.3.2
-o ppp0 这个是针对通过宽带拨号上网的用户
--to-source指定通过宽带拨号上网活动的公网地址

#对于每次宽带拨号都获得的是不同的公网地址可以使用下面这个iptables命令替换上面的
#MASQUERADE选项可以实现地址伪装
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE


DNAT+端口映射
iptables -t  nat -A PREROUTING -d 本机公网地址 -p tcp --dport 80 -j DNAT --to-destinaion 192.168.0.2:8080
将用户对本机公网地址的web 80端口访问都重定向到内部web服务器192.168.0.2的8080端口上的web服务请求