iptables——实战防火

1、为了更方便,我还是将语法写在这里一遍。如果不想看直接看下边的实例结合上边的语法理解就会舒服很多了。建议还是浏览一遍

iptables  [-t TABLE]  COMMAND  CHAIN  [num]  匹配条件  -j  处理动作

匹配条件
    通用匹配
        -s
        -d
        -p {tcp|udp|icmp}
        -i
        -o
    扩展匹配
        隐含扩展
            -p tcp
              --sport PORT[-PORT]: 源端口
              --dport PORT[-PORT]: 目标端口
              --tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
                    --tcp-flags SYN,FIN,ACK,RST SYN = --syn    #这句就是匹配三次握手的第一次的数据包
              --syn

            -p icmp
                --icmp-type
                    0: echo-reply          #ping命令反回的数据包        
                    8: echo-request       #ping命令发出去的数据包

            -p udp
                --sport
                --dport

            -p tcp --dport
        显式扩展: 使用额外的匹配机制
            -m EXTESTION --spe-opt

            state: 状态扩展
                结合ip_conntrack追踪会话的状态
                    NEW: 新连接请求
                    ESTABLISHED:已建立的连接
                    INVALID:非法连接
                    RELATED:相关联的
                -m state --state NEW,ESTABLISHED -j ACCEPT

                首先要装载ip_conntrack_ftp和ip_nat_ftp模块

                iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

            multiport: 离散的多端口匹配扩展
                --source-ports
                --destination-ports
                --ports

            -m multiport --destination-ports 21,22,80 -j ACCEPT


            -m iprange

                   --src-range

                   --dst-range

          iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100  --dport 22 -m state --state  NEW,ESTABLISHED -j ACCEPT

          

          -m connlimit-above  n


           iptables -A INPUT    -d 172.16.100.7  -p tcp --dport 80 -m connlimit  ! --connlimit-above 3  -j ACCEPT

           连接数在不超过3个的时候允许通过,超过3个时后续的请求被拒绝。这个可以控制多线程下载工具对网络带宽的占用,比如当把这台机器作为上网的控制路由机器时就可以实现这个效果。        


           iptables -A INPUT  -d 172.168.100.7 -p icmp --icmp-type 8 -m limit --limit 5/minute  --limit-burst 6 -j ACCEPT

           可以一次接收6个ping请求,之后按照速率5个/minute 响应(大概20秒就会有1个ping请求被响应)。


          iptables  -I INPUT -d 172.168.100.7 -m string --algo kmp  --string "h7n9"  -j REJECT

          iptables  -A OUTPUT -s 172.168.100.7 -m sting --algo kmp --string "h7n9"  -j  REJECT

         用户的请求包里边包含“h7n9”这种字符串,我们就不允许放行这样的数据包。如果你放到OUTPUT链上就会过滤掉含有h7n9字符串的数据包。



条件取反:!,-s ! 172.16.100.6



命令:
    管理规则
        -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-numbers: 显示规则号码

动作(target):
    ACCEPT:放行
    DROP:丢弃
    REJECT:拒绝
    DNAT:目标地址转换
    SNAT:源地址转换
    REDIRECT:端口重定向
    MASQUERADE:地址伪装
    LOG:日志

    MARK:打标记






2、命令实例集合

iptables -L -n  #不用-t指定表,默认是filter表。查看filter表上所有链的规则

iptables -t filter -L -n #查看filter表上的所有规则。

iptables -t nat  -L -n #nat表所有规则

iptables -t filter -L -n -v -x --line-numbers  #显示filter表中的所有链上的规则。并且是详细的精确地并且有行号的显示规则。具体参数解释参考上边。

iptables -t filter -A INPUT -s 172.168.0.0/16 -j DROP  #在filter表的INPUT链上添加一条规则,指出原地址是172.168.0.0网段的数据包都不允许访问这台主机





##下边两条规则是一组的。我们一定得记住,必须这样成对的写才行。(放行sshd服务22端口)

iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT #表示放行,原地址是  “172.16.0.0网段的并且目标地址是172.16.100.7的并且目标端口是22的”   数据包。

iptables -t filter -A OUTPUT -s 172.16.100.7  -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT #表示放行,原地址是   “172.16.100.7的并且目标地址是172.16.0.0网段的并且源端口是22的 ”    数据包

iptables -L -n -v --line-numbers  #查看下你设置的规则是否有匹配到的包,当然你的用ssh命令远程连接测试才可以。

*****注意在设置默认规则是DROP的时候你必须提前留出后门才行(提前建立好通过的规则),要不你就会把自己也锁在门外进不去了。你就只能在后台重启实例了****

iptables -P INPUT DROP   #设置filter表INPUT链上的默认规则是DROP

iptables -P OUTPUT DROP #设置filter表OUTPUT链上的默认规则是DROP

iptables -P FORWARD DROP #设置filter表FORWARD链上的默认规则是DROP


##这两条规则放行访问httpd的服务(放行httpd服务80端口)

iptables -t filter -I INPUT -d 172.16.100.7 -p tcp --dport 80 -j ACCEPT   #在filter表INPUT链上插入(一般我们会把最容易匹配到数据包的规则放到上边,这样可以提升数据包通过效率。所以用了-I插入)一条规则,表示允许目标地址是172.16.100.7的并且目标端口是80的数据包通过

iptables -t filter -I OUTPUT -s 172.16.100.7 -p  tcp --sport 80 -j ACCEPT  #在filter表OUTPUT链上插入一条规则,表示允许源地址是172.16.100.7的并且源端口是80的数据包通过

iptables -t filter -L -n -v  --line-numbers  #查看下是否已经生效了。你需要启动一个apache服务并且通过浏览器访问这个服务。之后你就会看到规则已经生效了(匹配到了很多数据包)



##放行ping命令。(放行ping命令)

ping 127.0.0.1  #这时你是ping不通自己的。因为你的这些数据包仍然会output链出去再从input链进来(我没说数据包会离开本机,一定要意识到这时数据包是仅仅在内核中转了一圈,一定要意识到这些iptables链是在内核中的)。

iptables  -t  filter -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo  -j ACCEPT  ##在filter表INPUT链上追加一条规则,表示允许原地址是127.0.0.1目标地址是127.0.0.1并且从本地回环地址lo设备进来的数据包通过。注意这时-i就用上了,你现在应该能体会到为什么 -i不能放到OUTPUT链上。

iptables -t filter -A OUTPUT -s 127.0.0.1 -d 127.0.0.1  -o lo  -j ACCEPT

ping 127.0.0.1  ##再次ping一次,就可以了


##下面两条规则就是你能ping别人但别人无法ping你。注意加上上边放行ping 127.0.0.1 的数据包才算完整。(放行ping命令,但是只能你ping别人,别人ping不通你)

iptables -t filter -A OUTPUT -s 172.168.100.7 -p icmp --icmp-type 8 -j ACCEPT   ##在filter表OUTPUT链上添加一条规则,表示原地址是172.168.100.7协议是icmp(ping命令使icmp协议的)并且类型是 8(8这个数字代表你ping别人时数据包的类型)的数据包允许通过

iptables  -A INPUT -d 172.168.100.7 -p icmp --icmp-type 0 -j ACCEPT ##在filter表INPUT链上添加一条规则,表示目标地址是172.168.100.7 协议时icmp的并且icmp-type类型是0(0代表别人响应给你的ping命令的数据包)的数据包允许通过

ping 202.108.22.5  ##测试下,注意你看下你之前是不是能上网,这个是百度的地址。

去另一台机器上运行:ping 172.168.100.7 ##看看是不是别人ping你ping不通了。


##为dns服务器书写防火墙规则:假设我们的默认规则默认都是DROP那如何保证我们的DNS服务器能为我们提供服务。(注意在设置默认规则为DROP前需要给自己留出sshd服务的后门,别把自己锁在外面。怎么设置默认规则是DROP参见上边(注意溜出后门 来,别把自己锁在外面))。DNS服务器怎么配置这里不介绍,有需要的可以查下我是否写了dns服务器安装配置的文章或者去找google。 (注意下边的编号,按照编号顺序添加能够最大限度的减轻我们dns服务器的压力。)

注意:我们自己的dns服务器可能需要为我们进行递归查询 “域名《=》IP”。并且dns服务器既监听在udp 53端口、又监听在tcp 53端口。所以我们需要写8条规则才能保证我们的dns服务器正常运行并且安全。(注意我这里说的是你可以使用TCP协议的53端口进行域名解析查询。因为有些人在配置dns的时候不允许用TCP协议进行域名解析查询。所以他写的规则可能就只有udp的了——也就是说他可能只需要写4条规则。但是我们写8条规则也没有错误,顶多就是用tcp协议查询域名解析的时候不成功。)

1、iptables -t filter -A INPUT -d 172.168.100.7 -p udp --dport 53 -j ACCEPT       ##在filter表INPUT链上追加一条规则,表示允许目标ip是172.168.100.7并且协议是udp并且目标端口是53的数据包允许通过。(说白了就是公司内部员工所有的dns服务请求数据包都允许进来--udp方式请求的)

2、iptables -t filter -A OUTPUT  -s 172.168.100.7 -p udp --sport 53  -j ACCEPT   ##在filter表OUTPUT链上追加一条规则,表示允许源ip是172.168.100.7并且协议是udp并且源端口是53的数据包允许通过。(说白了就是公司内部员工所有的dns服务请求响应数据包都允许出去--udp方式请求的)

5、iptables -t filter -A INPUT -d 172.168.100.7 -p tcp --dport 53 -j ACCEPT ##在filter表INPUT链上追加一条规则,表示允许目标ip是172.168.100.7并且协议是tcp并且目标端口是53的数据包允许通过。(说白了就是公司内部员工所有的dns服务请求数据包都允许进来--tcp方式请求的)

6、iptables -t filter -A OUTPUT  -s 172.168.100.7 -p tcp --sport 53 -j ACCEPT  ##在filter表OUTPUT链上追加一条规则,表示允许源ip是172.168.100.7并且协议是tcp并且源端口是53的数据包允许通过。(说白了就是公司内部员工所有的dns服务请求响应数据包都允许出去--tcp方式请求的)


3、iptables -t filter -A OUTPUT  -s 172.168.100.7 -p udp --dport 53 -j ACCEPT ##在filter表OUTPUT链上追加一条规则,表示允许源ip是172.168.100.7并且协议是udp并且目标端口是53的数据包允许通过。(说白了就是dns服务器,帮我们递归的所有的dns服务请求的数据包,都允许出去--udp方式请求的)

4、iptables -t filter -A INPUT -d 172.168.100.7 -p udp --sport 53 -j ACCEPT  ##在filter表INPUT链上追加一条规则,表示允许目标ip是172.168.100.7并且协议是udp并且源端口是53的数据包允许通过。(说白了就是dns服务器,帮我们递归的所有的dns服务请求的响应数据包,都允许进来--udp方式请求的)

7、iptables -t filter -A OUTPUT -s 172.168.100.7 -p tcp --dport 53 -j ACCEPT ##在filter表OUTPUT链上追加一条规则,表示允许源ip是172.168.100.7并且协议是tcp并且目标端口是53的数据包允许通过。(说白了就是dns服务器,帮我们递归的所有的dns服务请求的数据包,都允许出去--tcp方式请求的)

8、iptables -t filter -A INPUT -d 172.168.100.7 -p tcp --sport 53 -j ACCEPT ##在filter表INPUT链上追加一条规则,表示允许目标ip是172.168.100.7并且协议是tcp并且源端口是53的数据包允许通过。(说白了就是dns服务器,帮我们递归的所有的dns服务请求的响应数据包,都允许进来--tcp方式请求的)





###状态追踪规则的书写。各种类型的数据包都可以追踪。做运维的可以在这里查看下网络情况。

(计算机中经常有这样的木马,它运行的时候会检测到你的机器上开放的服务,比如httpd服务。那么它就会利用这个端口来主动连接外边的服务器从而将这台机器上的数据拷贝走。这时你会发现你的防火墙规则并没有起作用——因为并没有违背你的规则,你是放行80端口的数据包出去的。这样的话你的数据就被窃取了。很残酷吧。这种病毒就叫反弹式病毒。) 为了解决这个问题,状态追踪就有用了。它可以识别出主动去连接外部服务器的数据包,这样的话这种病毒就没机会了。

注意状态追踪这种规则最好不要在非常繁忙的服务器上使用。{因为再启动状态追踪的时候,服务器要将所有的链接信息记录到

/proc/net/ip_contrack文件中(这个在redhat系统上是这样的,我查看了下我的机器并没有这个文件。主要是记录下可以参考)。

这个文件是在内存中保留的,因此必须限定它对内存的使用。这个限定就在/proc/sys/net/ipv4/ip_conntrack_max(这个文件也不存在,redhat上存在)文件中。这个数值默认是32768,也就意味着只能最多记录32768个链接,当然你可以加大这个数值并且减小追踪记录链接时间。这些内核参数都可以在 /etc/sysctl.conf文件中修改。}  当你启动这个状态追踪功能的时候(比如你写了些状态追踪的规则或者用过iptables -t nat -L -n命令时都会自动加载启动这个功能模块--ip_contrack。),这你就倒霉了,因为你的服务器这时有几百万的链接,这一下子就被这个功能模块给丢弃了好多好多。那么你的业务也就没法进行了。你必须卸载这个模块才能恢复正常链接数。


yum install iptstate -y ##安装个好玩的工具

iptstate   ##看看你电脑上当前有多少个连接。


例子:对sshd服务进行状态追踪,只允许新连接或者已经建立连接的数据包通过。不允许本机主动连接的数据包出去。

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

在filter表INPUT链上添加一条规则,表示目标ip是172.168.100.7的并且协议是tcp的 目标端口是22的并且状态是NEW或者ESTABLISHED的数据包允许通过

iptables -A OUTPUT -s 172.168.100.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

在filter表OUTPUT链上追加一条规则,表示源ip地址是172.168.100.7的并且协议是tcp的并且源端口是22的并且状态是ESTABBLISHED的数据包允许通过。


对httpd做状态追踪

iptables -t filter -A INPUT -d 172.168.100.7 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

在filter表INPUT链上添加一条规则,表示目标ip是172.168.100.7的并且协议是tcp的 目标端口是80的并且状态是NEW或者ESTABLISHED的数据包允许通过

iptables -t filter -A OUTPUT  -s 172.168.100.7 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

在filter表OUTPUT链上追加一条规则,表示源ip地址是172.168.100.7的并且协议是tcp的并且源端口是80的并且状态是ESTABBLISHED的数据包允许通过。

这样就会使得那种反弹式病毒无法利用我们开通的80和22端口窃取我们服务器上的资源。


对ping命令做状态追踪。

iptables  -t   filter   -A  INPUT  -d 172.168.100.7  -p  icmp  --icmp-type  8   -m  state  --state  NEW,ESTABLISHED -j  ACCEPT

目标ip是172.168.100.7的协议时icmp的并且是别人ping我的并且状态是NEW或者ESTABLISHED的数据包允许通过

iptables  -t   filter   -A  OUTPUT  -s 172.168.100.7 -p icmp  --icmp-type  0  -m  state --state  ESTABLISHED  -j  ACCEPT

源ip地址是172.168.100.7 并且协议时icmp的并且是我对别人ping命令回复的并且状态是ESTABLISHED的数据包允许通过







###对ftp服务进行状态追踪

vim /etc/sysconfig/iptables-config   ##先修改配置文件将模块加载进去,必须修改,否则ftp服务数据包没办法通过。

IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

添加三条规则。

iptables -t filter -A INPUT  -d 172.168.100.7 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT  ##在filter表INPUT链上添加一条规则,目标ip地址是172.168.100.7的并且协议是tcp的并且目标端口是21的并且状态是NEW或者ESTABLISHED的数据包允许通过。21号端口建立连接时用的规则

iptables -t filter -A OUTPUT -s 172.168.100.7 -p tcp  -m state --state RELATED,ESTABLISHED -j ACCEPT  ##在filter表OUTPUT链上添加一条规则,表示源IP地址是172.168.100.7的并且协议是tcp的并且状态是TELATED或者ESTABLISHED的数据包允许通过。 发送数据时随机端口用的规则

iptables -t filter -A INPUT  -d 172.168.100.7 -p tcp  -m state --state RELATED,ESTABLISHED -j ACCEPT   ##在filter表INPUT链上添加一条规则,表示目标地址是172.168.100.7的并且协议是tcp的并且状态是RELATED或者ESTABLISHED的数据包允许通过。发送数据时随机端口用的规则

保存规则

service iptables save

重启iptables

service iptables restart

找个别的客户端执行 ftp登录

ftp 192.168.100.7    #账号anonymous  密码随意,测试之前比别告诉我ftp还没装,怎么安装ftp和ftp服务器我就不写了。


################ftp状态追踪结束##############################


##日志记录功能。日志会被记录到系统日志里边/var/log/messages 。注意使用的时候最好添加速率,要不然日志量会很大(磁盘io会很大),导致系统性能下降。结合iptables的recent模块(rencent模块怎么使用请自己在本文中查找)可以控制用户连接n次(n次输入密码错误就惩罚或者加入黑名单永不录用)。

iptables -I INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -j LOG --log-prefix "---firewall  log  for  icmp---"    ##在filter表,INPUT链上添加一条规则,表示目的ip是172.16.100.7的并且协议是icmp的并且是别人ping我的数据包。我要把它的信息记录到我的日志里边(里边可是有对方电脑mac地址的,很容易就能追踪到对方的电脑)




###recent模块使用。一定要注意下边三条规则要按照顺序放到链中,最好它们的前面没有drop和reject的规则,否则下边的规则就会没有效果。

防止黑客攻击我们的22号端口服务(这个最好不要给80服务加上,要不然一个页面的链接数就使用户没法再访问你的web服务了)。下面3条规则就可以防止黑客对我们的sshd服务的暴力破解攻击(如果你的密码设置的足够复杂--密码带有数字、字母、下划线、特殊字符、位数在15位以上。即便用世界运行最快的计算机破解都没戏,估计得花个千八百年才能破解)。

1、iptables  -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

##在filter表INPUT链上添加一条规则,表示只有协议是tcp的,并且端口是22号的,并且状态是NEW的,并且是最近访问我们的,数据包的ip和时间 。会被我们记录到内存中的一个叫做SSH的缓存中。 -m recent :表示用这个功能记录最近访问我们的数据包的ip。   --set:表示记录ip  。   --name:表示指定记录ip的内存缓存文件的名称。

2、iptables  -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 4 -j LOG  --log-prefix  "-----SSH  Attack-----------"

##如果我们先前记录的ip地址又一次的 访问我们的sshd服务,我们就将这个ip在SSH缓存中的记录更新一次。他如果在5分钟内尝试访问我们的次数超过4次我就要把他记录到我的系统日志中去。 --update 我会更新SSH缓存中的相同的ip记录  。  --second 300 表示300秒内 。  --hitcount 4  表示允许的次数为4次    。   --log-prefix 表示日志会加上我们定义的字符串内容,方便我们在/var/log/message 里边查到这样的记录。 

3、iptables  -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300  --hitcount 4 --name SSH -j DROP

##如果我们先前记录的ip地址又一次的 访问我们的sshd服务,我们就将这个ip在SSH缓存中的记录更新一次。他如果在5分钟内尝试访问我们的次数超过4次我就要把他加入黑名单5分钟。5分钟之内不允许再次链接我的sshd服务(5分钟过后可以连接)。









给出几个写的精良的规则体会下,怎么合并规则的。体会下合并的方法。很好的优化手段。

iptables -I INPUT 2 -d 172.168.100.7 -p tcp -m multiport --destination-ports 21,22,80 -m state  --state NEW -j ACCEPT   ##在filter表INPUT链第二个位置插入一条规则,表示目标IP地址是172.168.100.7并且协议是tcp的并且目的端口是21或者22或者80的并且状态是NEW(新连接)的数据包可以通过。注意多个端口同时指定的模块用法。

iptables -I INPUT 1  -d 172.168.100.7 -p tcp -m multiport --destination-ports 21,22,80  -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables  -t   filter   -I  OUTPUT   -s  172.168.100.7 -m state --state ESTABLISHED  -j ACCEPT


##自定义链。自定义链必须被主链调用,并且在没有任何规则匹配到的时候返回到调用位置继续被处理。下方是自定义链的实例,可参考换成你的自定义链。自定义链都会放到某个主链上。

iptables  -N clean_in  ##创建一条自定义连

iptables -A clean_in  -s 172.168.100.9  -j ACCEPT  ##随便添加一些处理规则,这里用好了可以提升很高的数据包处理速度

iptables -A clean_in  -s 172.168.100.10  -j ACCEPT##随便添加一些处理规则,这里用好了可以提升很高的数据包处理速度

iptables -A clean_in  -d 172.168.100.7 -j RETURN  ##没有匹配到任何规则的数据包要被返回到主链中继续被处理。

iptables -I INPUT -j clean_in ##把刚才定义好的链放到主链中,这样才会被调用。可以用些匹配条件,条件成立的拉进这条自定义链中进行处理


删除自定义规则链:iptables -X clean_in   ##注意删除自定义规则链之前请先删除链上的所有规则(iptables -D clean 1 运行多次知道所有规则清除),之后还要清除 调用这个自定义链的规则 (我这里是 iptables -D INPUT 1。因为我把调用clean链规则放到了INPUT链上了)。清理完毕后就可以清除自定义链了






######、附加内容。实用的命令

cat /etc/sysconfig/iptables ##看看我们机器上保存的iptables规则。

service iptables  save ##我们辛辛苦苦写了好多规则,我们得保存下。因为iptables在每次重启的时候都会重新从/etc/sysconfig/iptables 文件中重新读取规则并生效。你不保存是没有这个文件的。

service iptables restart  ##看到规则还在

 iptables-save > /etc/sysconfig/iptables.20170317  ##这个命令也可以存储规则,是从定向到别的文件。我们可能会用到

iptables-restore < /etc/sysconfig/iptables.20170317  ##加载规则文件,因为默认iptables是从/etc/sysconfig/iptables文件加载的。


条件取反:!,-s ! 172.16.100.6

iptables -A INPUT -s !172.168.100.7  -j ACCEPT  ##匹配标准都可以取反的,表示出了哪些数据包其余的都可以通过。自行测试。

iptables  -t   filter   -D   OUTPUT    2     ##删除filter表OUTPUT链上的第二条规则。



iptables不是服务,但有服务脚本;服务脚本的主要作用在于管理保存的规则
 装载或移除iptables/netfilter相关的内核模块;模块如下所示,这些模块就如同驱动一样,只有有了驱动内核才能有这样的能力(过滤,nat或者追踪等等)。
iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack    #可以用   命令: lsmod | grep ip       查看这些功能模块是否存在。从而确定iptables是否开启





########iptables功能强大而灵活,已经能够满足我们的大部分需求。但是它本身不能对应用层协议的数据包进行处理。(比如qq、微信、msn)

其实我们对7层协议数据包的处理很少使用,并且一般来说7层协议的过滤会消耗更多的系统资源,一般来说很少使用。但是为了内容的全面,我们给出使用iptables进行

7层协议数据包的处理方法。(你可以过滤qq、微信、暴风影音数据包)。要完成这一步你需要对内核编译的常识有所了解(我以后会下内核编译的文档,可以看看了解下)。

具体步骤如下:

layer7 -- l7
应用:xunlei, qq, netfilter<--patch
-m layer7 --l7proto xunlei -j DROP


1、给内核打补丁,并重新编译内核
2、给iptables源码打补丁,并重新编译iptables
3、安装l7proto

kernel, patch

iptables, patch



Kernel Patch
# tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src
# tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src
# cd /usr/src
# ln –s  linux-2.6.28.10  linux
# cd /usr/src/linux/
# patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch

# cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config
# make  menuconfig


Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration
<M>  Netfilter connection tracking support
<M>  “layer7” match support
<M>  “string” match support
<M>  “time”  match support
<M>  “iprange”  match support
<M>  “connlimit”  match support
<M>  “state”  match support
<M>  “conntrack”  connection  match support
<M>  “mac”  address  match support
<M>   "multiport" Multiple port match support


Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
<M> IPv4 connection tracking support (required for NAT)
<M>   Full NAT
    <M>     MASQUERADE target support                                                                                   
    <M>     NETMAP target support                                                                               
    <M>     REDIRECT target support


# make
# make modules_install
# make install


Compiles iptables :

# cp /etc/init.d/iptables ~/iptables
# cp /etc/sysconfig/iptables-config ~/
# rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps
# tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src
# cd /usr/src/iptables-1.4.6
# cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*   ./extensions/


# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
# make
# make install




# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install

# mv ~/iptables  /etc/rc.d/init.d/

# service iptables start


l7-filter uses the standard iptables extension syntax
# iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]


例子:下面的两条规则放在你的提供路由功能的机器上。(就是公司控制用户上网的那台充当路由器的linux机器)。192.168.10.0/24 指的是公司内网网段,172.16.100.7指的是ADSL获取的公网ip(当然你有固定的公网ip更好)。如果ADSL获取的ip变化的话,直接 -j MASQUERADE  替换 -j  SNAT --to-source 172.16.100.7 就行了。

iptables -t nat -A POSTROUTING  -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7  ##允许公司内部员工正常上网。

iptabels -A FORWARD -s 192.168.10.0/24  -m layer7 --l7proto  qq -j REJECT     ##拒绝qq协议数据包通过

值得注意的是,你测试qq的时候应该先退出之后再链接,之前连接的qq客户端(没断开过)下边的规则可能不会生效



###iptables基于时间段的对数据包的控制。这个很好玩的。(比如你不允许上午9-12点上网,不允许下午1-5:30上网。其余时间都允许上网)。想到路由器里边那个家长控制孩子上网的设置了吗。这个就是最本质的东西,你所填写的那些内容最终就是生成了这里的规则加到路由器的防火墙里边的,只不过他们给用户提供了web页面进行图形界面的操作。   详细的使用规则请:man iptables

-m time

     --datestart    --datestop

     --timestart    --timestop

例子:不允许上午9-12点上网,不允许下午1-5:30上网。其余时间都允许上网

        iptables -t nat -A POSTROUTING  -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7  ##允许公司内部员工正常上网。

        iptables  -A FORWARD -s 192.168.10.0/24  -m time --timestart  09:00:00   --timestop  12:00:00  -j DROP

        iptables  -A FORWARD -s 192.168.10.0/24  -m time --timestart  13:00:00   --timestop   17:30:00 -j DROP




##自己试试写成shell脚本管理防火墙吧。这种写脚本的方式是很实用的。自己想想怎么写更好。给个例子:

#!bin/bash

#

ipt=/usr/sbin/iptables

ointerface=eth1

iinterface=eth0


oip=172.168.100.7  #公网ip

iip=192.168.10.6  #内网ip


$ipt -t nat -F

$ipt -t filter -F

$ipt -t mangle -F


$ipt -N clean   #创建新链

$ipt -A clean -d $iip -p icmp -j DROP

$ipt -A clean -j RETURN    #最终返回主链

$ipt -A INPUT -j clean  #主链调用



######网络入侵检测系统。额外补充,有兴趣可以研究下。

IDS: 入侵检测系统分为网络入侵检测系统(nids)和主机入侵检测系统(hids)

        nids: snort + iptables =NIPS  ##snort结合iptables可以建议动态的检测出入侵数据包,并及时通知管理员而且还可以临时生成规则阻挡该类型报文的攻击

        hids:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值