Programming Life
相信不能相信的,完成不能完成的。矛盾,就象征进步。
posts - 151,comments - 7,trackbacks - 0
《《原文地址:http://blog.csdn.net/wenbingcai/archive/2009/04/09/4059685.aspx
iptales 在工作中没少用.但一直没有总结一下.都是用时man一下.没有系统性.
现在有时间得总结一下了.

redhat下的iptables,就是防火墙了.

       启动脚本:/etc/rc.d/init.d/iptables  --------> 看过之后就大概了解iptables启动/关闭过程了
       规则文件:/etc/sysconfig/iptables
       配置文件:/etc/sysconfig/iptables-config

iptables规则表从上到下匹配,头一个规则如果匹配了,下一个相关规则无效

iptables命令使用原则:
       链名  必须  大写
       表名  必须  小写
       动作  必须  大写
       匹配  必须  小写

体系:
    它有2个表:filter ---------- 过滤作用
          nat-------------- 做网络地址转换的.network address translator
    4个链:
          INPUT ----------- 位于filter表,匹配目的ip是本机的数据包
          OUPUT ---------- 位于filter表,匹配从本机出去的数据包
          FORWARD --------- 位于filter表,匹配通过本机的数据包,从外部来,通过本机,又转发到外部
          PREROUTING ------ 位于nat表,用于修改目的地址 destination nat
          POSTROUTING ----- 位于nat表,用于修改源地址 source nat
语法:
    如果用iptables命令写好规则后,运行 service iptables save 来保存.否则重启无效
    iptables 的表和链中都规则是从上到下都顺序来匹配的,优先级   上 > 下
             如果规则表里没有匹配的规则,最后采用默认的accept规则,如果你没改的话
             默认的规则用: ??????????????????????
    ( "+" 号无实际作用)
    iptables + [-t 要操作的表]
             + [ 操作命令 ]
             + [ 要操作的链 ]
             + [ 规则号码 ]
             + [ 匹配条件 ]
             + [ -j 匹配后的动作 ]
参数详解:
   
    要操作的表:-------> 就是上述提到的表了,filter  和  nat

    操作命令:--------->
                       -A : append 追加一条规则.放到规则表的最后.
                             如;iptablse -t filter -A INPUT -j DROP
                                           # -j意为匹配后的动作 原意为jump, DROP 即丢弃
                             意为:在filter表里的input链里追加一条规则,(作为本表本链的最后规则)
                                  匹配所有进入本机的数据包,匹配到的数据包都丢弃.
    
                       -I : insert 插入一条规则
                             如: iptables -I INPUT -j DROP
                             意为: 在filter表里的input链中插入一条规则,插入成第一条
                             
                                 iptables -I INPUT 3 -j DROP
                             意为: 在filter表里的input链里插入一条规则,插入成第三条

                            ## -t filter 不写则自动默认成filter表
                               -I INPUT 3 如果不写号码,则自动插入成第一条
                               确保插入的号码数 <= 已经存在的规则数,否则报错

                       -D : delete 删除一条规则
                              安装规则号码删除:
                            如: iptables -D INPUT 2 --------- 删除input链里的第2条规则
                              安装规则内容删除:
                                iptables -D INPUT -s 192.168.1.2 -j DROP
                                    删除input链里的 -s 192.168.1.2 -j DROP的规则

                       -R : replace 替换一条规则
                                iptables -R INPUT 3 -j ACCEPT --> 替换input链里的3号规则为accept
                       
                       -P : policy  设置某个链的默认规则
                                iptables -P INPUT DROP ----> 设置filter表的INPUT链默认规则是drop
                                   # 这个命令  不加 -j   也是唯一不加-j的情况

                       -F : flush   清空规则表
                                iptables -F INPUT ---------> 清空input链的规则
                                iptables -t nat -F PREROUTING -----> 清空net表的prerouting链规则
                            # 如果不写链名,则为全部表.
                              只是清空规则表.重启后已经保存的规则还在

                       -L : list   列出规则
                                iptables -nL  ----------> 列出规则 n表示ip地址和端口号

匹配条件:
    
     流入/流出 -----> -i / -o          #  -i ---> in
                                       #  -o ---> out
     来源/目的 -----> -s / -d          #  -s ---> source
                                       #  -d ---> destination
     协议类型  -----> -p               #  -p ---> protocol

     来源端口/目的端口 ---> -sport / -dport

     按网络接口匹配:
               -i eth0  -------> 匹配从eth0网络接口进来的数据包
               -o ppp0  -------> 匹配从ppp0出去的数据包
     按来源目的地址匹配:
               -s 192.168.1.1 -----> 匹配来自192.168.1.1的数据包
               -s 192.168.1.0/24 --> 匹配来自192.168.1.0/24网络的数据包
               -s 192.168.1.0/16 --> 匹配来自192.168.1.0/16网络的数据包                     

     按目的地址匹配:
              -d < 可以是 ip , net , domain >
              -d 202.22.33.44 -----> 匹配去往 202.22.33.44的数据包
              -d www.hao123.com ---> 匹配去往www.hao123.com的数据包

     按协议匹配:
              -p tcp
              -p udp
              -p icmp
   
     按来源目的端口匹配:
             --sport < 可以是某个端口,也可以是端口范围 >
             --sport 1000
             --sport 1000:3000  ----> 从1000端口到3000端口
             --sport :4000     -----> 4000端口以下的所有端口
             --sport 4000:     -----> 4000端口以上的所有端口

             --dport 用法和 --sport 用法一样的
             # --s/dport 必须和 -p 一起使用

匹配后的动作: 即-j 后的动作
    
      ACCEPT   ----> 通过,允许数据包通过本链.类似cisco的 permit

      DROP     ----> 拒绝, 不允许通过本链 .              deny

      SNAT     ----> -j SNAT --to ip<-ip><:端口-端口>   这是nat表的postrouting链,
                      源地址转换,snat支持转换为单ip和ip池(一组连续的ip地址)
                例如:
                    iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to 1.1.1.1
                       ,将内网10.0.0.0/24的源地址改为1.1.1.1,用于nat

      DNAT    -----> -j DNAT --to ip<-ip><:端口-端口>   这是nat表的prerouting链
                      目的地址转换,dnat支持转换为单一ip和ip池
                例如:
                    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 1.1.1.1
                        将从eth0接口进来的要访问80端口的tcp数据包的目的地址改成1.1.1.1
      MASQUERADE --> -j masquerade
                        动态源地址转换
                 例如: iptables -t nat -A POSTROUTING -s 1.1.1.1 -j MASQUERADE
                         将源地址是 1.1.1.1 的数据包进行地址伪装
                      #没有用过
 
附加模块:
    按包的状态匹配 ---------> state
          -m state --state 状态
                状态分为: new      ---------->  有别于tcp的syn
                          related  ----------> 
                          established ------->  连接态
                          invlid   ---------->  不能识别或者没有任何状态\
           例如:
               iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT   --> 接收处于连接态的包


    按mac地址匹配 ----------> mac
         -m mac --mac-source mac地址
           例如:
               iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP --> 拒绝某mac地址

    按包的速率匹配: --------> limit
         -m limit --limit <匹配速率> <--burst 缓冲数量>
           例如:
               iptables -A FORWARD -d 1.1.1.1 -m limit --limit 30/s -j DROP --> 拒绝速率30/s的包

    按多端口匹配 -----------> multiport     # 必须和 -p 一起用
         -m multiport <--sports|--dports|--ports> 端口1<,端口2,端口3> ----> 一次性匹配多个端口
                 可以区分来源端口,目的端口,或者不指定端口.
           例如:
               iptables -A INPUT -p tcp -m multiport --dports 22,23,80,110 -j ACCEPT
                   接收 22,23,80,110端口进来多tcp数据包

    按来源mac地址匹配 ------> mac
    按包速率匹配 -----------> limit
    按多端口匹配 -----------> multiport
    

#######################################################################################

经验: 牢记语法顺序

#######################################################################################

防止linux出现大量 FIN_WAIT1,提高性能

当连接数多时,经常出现大量FIN_WAIT1,可以修改 /etc/sysctl.conf
修改
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
然后:
/sbin/sysctl -p
使之生效
#######################################################################################
apache服务器的time_wait过多 fin_wait1过多等问题
1。time_wait状态过多。
    通常表现为apache服务器负载高,w命令显示load average可能上百,但是web服务基本没有问题。同时ssh能够登陆,但是反应非常迟钝。
原因:最可能的原因是httpd.conf里面keepalive没有开,导致每次请求都要建立新的tcp连接,请求完成以后关闭,增加了很多 time_wait的状态。另,keepalive可能会增加一部分内存的开销,但是问题不大。也有一些文章讨论到了sysctl里面一些参数的设置可以改善这个问题,但是这就舍本逐末了。
2。fin_wait1状态过多。fin_wait1状态是在server端主动要求关闭tcp连接,并且主动发送fin以后,等待client端回复ack时候的状态。fin_wait1的产生原因有很多,需要结合netstat的状态来分析。
netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n
上面的命令可以帮助分析哪种tcp状态数量异常
netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n
则可以帮助你将请求80服务的client ip按照连接数排序。
回到fin_wait1这个话题,如果发现fin_wait1状态很多,并且client ip分布正常,那可能是有人用肉鸡进行ddos攻击、又或者最近的程序改动引起了问题。一般说来后者可能性更大,应该主动联系程序员解决。
但是如果有某个ip连接数非常多,就值得注意了,可以考虑用iptables直接封了他。

Linux下查看Apache的请求数

在Linux下查看Apache的负载情况,以前也说过,最简单有有效的方式就是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apache Server Status的情况下,或安装的是其他的Web Server,比如Nginx的时候,下面的命令就体现出作用了。
ps -ef|grep httpd|wc -l命令
#ps -ef|grep httpd|wc -l
1388
统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整,我这组服务器中每台的峰值曾达到过2002。
netstat -nat|grep -i “80″|wc -l命令
#netstat -nat|grep -i “80″|wc -l
4341
netstat -an会打印系统当前网络链接状态,而grep -i “80″是用来提取与80端口有关的连接的, wc -l进行连接数统计。
最终返回的数字就是当前所有80端口的请求总数。
netstat -na|grep ESTABLISHED|wc -l命令
#netstat -na|grep ESTABLISHED|wc -l
376
netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。
最终返回的数字就是当前所有80端口的已建立连接的总数。
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’命令
#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
FIN_WAIT_1 286
FIN_WAIT_2 960
SYN_SENT 3
LAST_ACK 32
CLOSING 1
CLOSED 36
SYN_RCVD 144
TIME_WAIT 2520
ESTABLISHED 352
这条语句是在张宴那边看到,据说是从新浪互动社区事业部技术总监王老大那儿获得的,非常不错。返回参数的说明如下:
SYN_RECV表示正在等待处理的请求数;
ESTABLISHED表示正常数据传输状态;
TIME_WAIT表示处理完毕,等待超时结束的请求数。
posted on 2011-02-17 16:14 Prog 阅读(730) 评论(0)  编辑 收藏 引用 网摘 所属分类: LinuxLAMP

只有注册用户登录后才能发表评论。
网站导航: