iptables命令应用实例

iptables  
优化规则:尽量减少规则条目,彼此不相关的匹配,用较多放在上面,属于同一功能匹配规则更严格的放在上面    
一、netfilter:    
    四个表:raw,mangle,nat,filter    
    五链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING    
    分别在那些链上使用    
        filter:INPUT,FORWARD,OUTPUT    
        nat:PREROUTING(DNAT),POSTROUTING(SNAT),OUT(SNAT)    
        mangle: PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING    
        raw:POSTROUTING,OUTPUT    

    wKioL1P3mjqC-8P2AAEKtg72A4k485.jpg    写规则注意事项:    
        先确定功能(表),确定报文流向(链),确定实现的目录,确定匹配条件 ,处理方法    
    规则文件:/etc/sysconfig/iptables    
        保存启用中的规则于规则文件中    
                1、#iptables-save > /etc/sysconfig/iptables    
                2、#service ipitables save    
        生效规则文件中的规则:    
                1、#iptables-restore < /etc/sysconfig/iptables    
                2、#service iptables save    
                    执行的操作:清空现有规则,读取并生效规则文件中的规则。    
        at任务计划,重新载入 原有保存的规则链(因为设置iptables 是立即生效的,为了保险期间,,操作错误。定义个计划任务恢复是有必要的。一次性)    
                    # at now +30min    
                    at> iptables-restore < /etc/sysconfig/iptables    
                    ctrl+d(保存计划任务)    
                atq:查看任务作业在队列中的任务    
                at -l 看任务作业在队列中的任务    
                at -d 删除任务作业    
                atrm 删除任务作业    
二、    
    规则的基本语法(我们下面的实例都是白名单)    
        设置规则:    
            iptables -t 表 -P 链 处理方法    
                实例:设置白名单(全部关掉)    
                #iptables -t filter -P INPUT DROP    
                #iptables -t filter -P OUTOUT DROP    
                #iptables -t filter -P FORWARD DROP    
        查询规则:    
            #iptables -L -n -v    
            #watch -n 1 'iptables -L -n -v --line-numbers'时时查看    
            查询序列号的命令    
            #iptables -L -n --line-numbers

        添加链:  
            iptables -t 表 -A 链  实现的目标 匹配条件 处理方法    
            实例:开启ssh功能(只能172.16.3.0网段可以登入172.16.3.30)    
                #iptables -t filter -A INPUT -s 172.16.3.0/16 -d 172.16.3.30 -p tcp --dport 22 -j ACCEPT    
                #iptables -t fileter -A OUTPUT -s 172.16.3.30 -d 172.16.3.0/16 -p tcp --sport22 -j ACCEPT    
        删除链:    
            iptables -t 表 -D 链 序列号    
            实例:删除ssh链    
                #iptables -D INPUT 1(默认表为filter)    
        插入链:(不指明插入链的位置默认是插入第一链)    
            iptables -t 表 -I 链 链的位置 实现的目标 匹配条件 处理方法    
            实例:开启httpd访问(只允许172.16.3.0网段的主机可以访问172.16.3.30WEB服务器)    
                #iptables -I INPUT 3 -i eth0 -s 172.16.3.0/16 -d 172.16.3.30 -p tcp --dport 80 -j ACCEPT    
                #iptables -I OUTPUT 3 -s 172.16.3.30 -d 172.16.3.0/16 -o eht0 -p tcp --sport 80 -j ACCEPT    
        修改链:(先添加后减少)    
            iptables -t 表 -R 链 链的位置 实现的目标 匹配条件 处理方法    
            实例:修改INPUT第3条链,允许访问地址具体到172.16.3.1访问服务器    
                #iptables -R INOUT 3 -i eth0 -s 172.16.3.1 -d 172.16.3.30 -p tcp --dport 80 -j ACCEPT    
三、扩展匹配

隐式扩展:当使用-p{tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项   
    tcp标志位:    
        --tcp-flages 要检查标志位列表的 匹配的生效的必须为1标志位。    
            用法:--tcp-flages syn,ack,rst,fin syn    
                  --syn 相当于--tcp-flages syn,ack,rst,fin syn    
                #iptables -I INPUT -p tcp --tcp-flages all all -j DROP(全部为1的不允许)都是不正常的访问连接有可能是木马    
                #iptables -I INPUT -p tcp --tcp-flages all none -j DROP(全部为0的也不允许)    
            实例:允许TCP协议的应用系统可以通过tcp握手的第一个请求    
                iptables -I INPUT -p tcp --tcp-flages syn,ack,rst,fin syn -j ACCEPT    
                或者    
                iptables -I INPUT -p tcp --syn -j ACCEPT    
    udp:    
        -p udp [-m udp]:    
                --sprt PORT[-PORT]:指定源端口[范围]    
                --dport PORT[-PORT]:指定目标端口    
            实例:dns服务器    
                #iptables -A OUTPUT    -s 172.16.3.30 -p udp --dprot 53 -j ACCEPT出去    
                #iptables -A INPUT -d 172.16.3.30 -p udp  --sprot 53 -j ACCEPT进入    
    icmp    
        -p icmp [-m icmp]:    
                --icmp-type    
                    8:ping请求   
                    0:ping应答    
            实例:允许其他机器能ping通172.16.3.30    
                #iptables -I INPUT -d 172.16.3.30 -p icmp -j ACCEPT    
                #iptables -I INPUT -s 172.16.3.30 -p icmp -j ACCEPT    
                具体设置下:    
                iptables -A INPUT -d 172.16.3.30 -p icmp --icmp-type 0 -j ACCEPT 进入    
                iptables -A OUTPUT -s 172.16.3.30 -p icmp --icmp-type 8 -j ACCEPT 出去   
显示扩展:调用netfilter额外模块实现特殊检查机制,要使用-m选项来指定调用那个模块    
    (使用相关功能,要使用iptables命令的-m选来加载相关模块)                
    1、multiport:多端口匹配(一次最多指定15个以内的端口)    
        可用于匹配非连续或连续端口;    
            专用选项    
                --source-ports,--sports port[,port,port:port]    
                --destination-ports,--dports    
                --ports    
            实例:开启22,和80端口    
                iptables -I INPUT -d 172.16.3.30 -p tcp -m multiport --dports 22,80 -j ACCEPT    
                iptables -I OUTPUT -s 172.16.3.30 -p tcp -m multiport --dports 22,80 -j ACCEPT   
    2、iprange:匹配指定范围内的地址:    
        匹配一段连续的地址而非整个网络时有用    
            专用选项    
                --src-range IP [-IP]    
                --dst-range    
                可以取反    
                !--src-ragne IP [-IP]    
                !--dst-range    
            实例:允许3.100--3.200网段的主机可以使用3.30,vsftpd    
                iptables -A INPUT -d 172.16.3.30 -P tcp --dport 21 -m iprange --src-range 172.16.3.100-172.16.3.200 -j ACCEPT    
                iptables -A OUTPUT -s 172.16.3.30 -P tcp --sport 21 -m iprange --dst-range 172.16.3.100-172.16.3.200 -j ACCEPT

    3、string:字符串匹配,能够检测报文应用层中的字符串。  
                    字符匹配检查高效算法    
                        kmp,bm    
                    专用选项:    
                        --algo {kmp|bm}    
                        --string "STRING"    
                        --hex-string "HEX_STRING":STRING    
                    实例:这里我们限制web服务器,网站中的内容进行限制,如果内容中出现ning的网站不给予送出    
                        iptables -I OUTPUT -m string --algo kmp --string "ning" -j DROP    
    4、time:基于时间做访问控制    
        专用选项:    
            --datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]    
            --datestop    
            --timestart hh:mm[:ss]    
            --timestop hh:mm[:ss]    
            --weekdays day[,day]    
            Mon, Tue,    
        实例:设置3.30服务器上网站只有在,每周一、二、四、五的早上8点20到下午的18:40允许访问    
        # iptables -I INPUT -d 172.16.3.30 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT    
    5、connlimit:连接数限制,对每个IP所能够发起并发连接数做限制;    
        专用选项:    
            [!]--connlimit-above N (要是白名单,大于N则DROP)    
        实例:限制ssh登入172.16.3.30最大连接数(注意,如果你想测试,超过限定数将被丢弃)    
            iptables -A INPUT -d 172.16.3.30 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP    (超过两个则DROP)    
    6、limit:速率限制:    
        专用选项:    
            --limit n[/second|/minute|/hour|/day] 每多少时间发几个    
            --limit-burst n 空闲了多少个    
        实例:限制ping 172.16.3.30每5秒一个    
            iptables A INPUT -d 172.16.3.30 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j    ACCEPT(每3秒钟一个)    
            iptables A OUTPUT -s 172.16.3.30 -p icmp --icmp-type 0 ACCEPT           
    7、state:状态检查    
        专用选项    
        --state    
        连接追踪中的状态:(上限/proc/sys/net/nv_conntrack_max)(访问量很大网站不能使用,追踪不能开启)    
            NEW: 新建立一个会话    
            ESTABLISHED:已建立的连接established    
            RELATED:有关联关系的连接    
            INVALID:无法识别的连接           
        调整连接追踪功能所能容纳的连接的最大数目;    
            /proc/sys/net/nv_conntrack_max    
            当前追踪所有连接    
                /proc/net/nf_conntrack    
            不同协议或连接类型追踪时的属性:    
                /proc/sys/net/netfilter目录:    
            放行被动模式下的FTP服务器:    
                1、装载模块/lib/modules/k    
                    模块:nf_conntrack_ftp(lsmod | less)(想永久加载这个模块,编辑配置文件/etc/sysconfig/iptables-config并在里面添加IPTABLES_MODULES="nf_conntrack_ftp")    
                    modprobe nf_conntrack_ftp    
                2、放行请求报文    
                    (1)放行NEW状态对21端口请求的报文    
                    (2)放行ESTABLISHE以及RALATED状态的报文    
                    iptables -A INPUT -d 172.16.3.30 -p tcp -m multiport --dports 22,80,21 -m state --state NEW  -j ACCEPT    
                    iptables -I INPUT -d 172.16.3.30 -p tcp -m state --state ESTABLISHE,RELATED -j ACCEPT    
                3、放行响应报文:    
                    (1)放行ESTALISHED以及RALATED状态的报文    
                    iptables -A OUTPUT -s 172.16.3.30 -p tcp -m state --state ESTABLISHE,RELATED -j ACCEPT    
防火墙的分类:    
    简单包过滤防火墙    
    带状态检测的包过滤防火墙       
四:自定义链:只有被调用时才使用    
        RETURN(return):在自定义中无法匹配的将会返回主链。

        创建自定义链:  
            格式:iptables -t 表  -N 链的名称    
                  iptables -A 链的名称 .......    
            实例:创建自定义链httpd服务的控制    
                #iptables -t filter -N http_in(创建自定义链)    
                允许172.16.3.100-172.16.3.200的主机可以访问172.16.3.30    
                iptables -A http_in -d 172.16.3.1 -p tcp --dport 80 -m iprange --src-range 172.16.3.100-172.16.3.200 -j ACCEPT    
            把所创建的链实施调整    
                #iptables -A INPUT -d 172.16.3.1 -p tcp --dport 80 -j http_in    
                #iptables -A http_in -j RETURN ------------------自动调整到主链    
            备份写过的链,以备以后使用,可以输出重定向一个你想保存的为位置       
                #iptables-save > /root/iptables_20140809备份一个位置    
                #iptables-restore < /root/iptables_20140809恢复当前列表。    
            删除自定义链:    
                #iptables -F http_in清空自定义链    
                #iptables -X http_in (删除自定义且0引用的空链)    
    重命名自定义链:    
                格式:iptables -E old_name new_name    
                      #iptables -E http_in httpd_in    
五、网络防火墙:

转发器FORWARD(网络防火墙的控制要在FORWARD上写)  
        查看是否开启路由转发功能    
        #cat /proc/sys/net/ipv4/ip_forward    
        0    
        # echo 1 >>/proc/sys/net/ipv4/ip_forward-----临时修改ip_forward    
        # cat /proc/sys/net/ipv4/ip_forward    
        1    
        永久修改ip_forward    
        #vim /etc/sysctl.conf    
        net.ipv4.ip_forward = 1    
        #sysctl -p    
        实例:限制局域用户周一、二、四、五,禁止上网    
            #iptables -A FORWARD -s 192.168.3.0/24 -m time --weekdays  Mon,Tue,Thu,Fri -j DROP

NAT:地址转换       
        MASQUERADE:地址伪装(拨号时使用,使用动态地址上网时)伪装更换源地址    
        格式    
            SNAT源地址转换:(用途:局域网内主机访问外网时使用)    
                            iptables -t nat -A POSTROUTING -s 需要转换的地址 -j SNAT --to-source 转换为那个地址    
                            #iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 172.16.3.1    
            DNAT目标地址转换:(用途:外网访问局域网内的主机,主机在局域网内的网络中,没有划分vlan情况)    
                            iptables -t nat -A PREROUTING -d 需要转换的地址 [-p tcp --dport 80] -j DNAT --to-destination 转换为的地址:端口号       
                            #iptables -t nat -A PREROUTING -d 172.16.3.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.20:8080    
            PNAT源和目标地址都转换:(用途:外网访问局域网内的主机,主机在局域网内的网络中并且网络划分了vlan)    
                            #iptables -t nat -A PREROUTING -d 172.16.3.1 -p tcp --dport 80 -j DNAT --to-destionation 192.168.3.30    
                            #iptables -t nat -A POSTROUTING -s 172.16.3.20  -j SNAT --to-source 192.168.3.1

            如果是拨号上网怎么源地址转换呢?(用途:局域网内的主机访问外网主机,外网IP为动态IP时)  
                iptables -t nat -A POSTROUTING -s 需要转换的地址 [-p tcp --dport 80] -j MASQUERADE

        2、查看网络防火墙规则  
            #iptables -t nat -L -n -v    
        3、删除防火墙规则    
            #iptables -t nat -D POSTROUTING 2    
                实例:WEB服务器    
                      防火墙有两个网卡:一个公网IP 172.16.3.1 一个内网地址IP 192.168.3.1    
                      外网主机:IP 172.16.3.20    
                      内网主机:IP 192.168.3.1    
                     (1)内网访问外网    
                            #iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 172.16.3.1    
                     (2)外网访问内网    
                            #iptables -t nat -A PREROUTING -d 172.16.3.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.20:8080

你可能感兴趣的:(filter,iptables)