目录: 一: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层然后必须经过PREROUTING2.通过PREROUTING后就对这个数据包进行路由,查看其目的地址。3.若为本机地址则会通过INPUT到达上层协议栈(TCP/UDP)然后通过内核到达用户空间的某个进程4.若为其它地址,则需要进行转发至相应网段的网卡接口,(这台机子具有多个网卡和多个不同网段的地址)5.转发需要经过FORWARD,转发后通过POSTROUTING转发出去.这个五个点我们称作iptables的五个链,iptables防火墙模块正是将一个个函数注册至这五个钩子函数中来达到数据包过滤的功能.这五条链的组合构成了一个个功能我们称为表:filter:(完成过滤功能)INPUT OUTPUT FORWARDnat:(地址转换)PREROUTING POSTROUTINGmangle:(报文修改)PREROUTING INPUT OUTPUT FORWARD POSTROUTINGraw:(不对报文做任何修改,用于连接追踪)PREROUTING OUTPUT我们可以这些表中对应的链上设置相应的规则。然后有些链在每一个表中都有,那么规则匹配的时候到底哪个说了算呢,这些表示有优先级的,要按着优先级来匹配:raw-->mangle-->nat-->filteriptables命令的使用:命令格式: 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/somefileiptables-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 ACCEPTiptables -A OUTPUT -s 192.168.227.5 -p tcp --sport 22 -j ACCEPTiptables -P DROP #设置默认规则注意:在设置默认规则的时候 要把上面两条放行SSH协议的规则写好,否则要是先设置默认规则,SSH协议就会断掉无法连接上去对于这种放行方式来说,有一种***无法避免,***者可以在机器内部通过22号端口向外发起连接发送数据对于这种情况者两条规则无法避免.于是就有了一个新的方法基于状态监测来完成.只允许客户端向服务器端发起新连接请求:iptables -A INPUT -d 192.168.227.5 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT -s 192.168.227.5 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPTiptables -P INPUT DROPiptables -P OUTPUT DROPiptables -P FORWARD DROP2.放行web服务iptables -A INPUT -d 192.168.227.5 -p tcp -dport 80 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT -s 192.168.227.5 -p tcp -sport 80 -m state --state ESTABLISHED -j ACCEPTiptables -P INPUT DROPiptables -P OUTPUT DROPiptables -P FORWARD DROP3.禁止ping,允许通过lo接口进出的数据iptables -A INPUT -d 192.168.227.5 -p icmp --icmp-type 8 -j DROPiptables -A OUTPUT -s 192.168.227.5 -p icmp --icmp-type 0 -j DROPiptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPTiptables -P INPUT DROPiptables -P OUTPUT DROPiptables -P FORWARD DROP4.放行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 ACCEPTiptables -A INPUT -d 192.168.227.5 -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -s 192.168.227.5 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPTmodprobe 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 DROPssh连接多于三次的拒绝连接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 MASQUERADEDNAT+端口映射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服务请求