iptables 與apache雜記

來源:互聯網
上載者:User

  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,提高效能Written by xkou on November 25th, 2007

當串連數多時,經常出現大量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表示處理完畢,等待逾時結束的請求數。

Tag: 調優, 效能, 最佳化

kimi at 2008-09-01 03:01:08 in Apache, Linux

 

解決linux下大量的time_wait問題

vi /etc/sysctl.conf
編輯/etc/sysctl.conf檔案,增加三行:

引用

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1

說明:
net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP串連,預設為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP串連中TIME-WAIT sockets的快速回收,預設為0,表示關閉。
再執行以下命令,讓修改結果立即生效:

 

引用
/sbin/sysctl -p

用以下語句看了一下伺服器的TCP狀態:

引用
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回結果如下:
ESTABLISHED 1423
FIN_WAIT1 1
FIN_WAIT2 262
SYN_SENT 1
TIME_WAIT 962
效果:處於TIME_WAIT狀態的sockets從原來的10000多減少到1000左右。處於SYN_RECV等待處理狀態的sockets為0,原來的為50~300。

通過上面的設定以後,你可能會發現一個新的問題,就是netstat時可能會出現這樣的警告:

引用
warning, got duplicate tcp line
這正是上面允許tcp複用產生的警告,不過這不算是什麼問題,總比不允許複用而給伺服器帶來很大的負載合算的多

儘管如此,還是有解決辦法的:
1、 安裝rpm包:
[root@root2 opt]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm
Preparing...                ########################################### [100%]
   1:net-tools              ########################################### [100%]
[root@root2 opt]#

對於下載的是源碼的rpm則需要使用以下方法安裝:

 

2、 安裝rpm源碼包方法:
a)         安裝src.rpm:
# [root@root1 opt]# rpm -i net-tools-1.60-62.1.src.rpm
……
b)        製作rpm安裝包:
[root@root1 opt]# cd /usr/src/redhat/SPECS/
[root@root1 SPECS]# rpmbuild -bb net-tools.spec
c)        rpm包的升級安裝:
[root@root1 SPECS]# pwd
/usr/src/redhat/SPECS
[root@root1 SPECS]# cd ../RPMS/x86_64/
[root@root1 x86_64]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm

3、 再使用netstat來檢查時系統正常:
說明:
  net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;
  net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP串連,預設為0,表示關閉;
  net.ipv4.tcp_tw_recycle = 1 表示開啟TCP串連中TIME-WAIT sockets的快速回收,預設為0,表示關閉。
  net.ipv4.tcp_fin_timeout = 30 表示如果通訊端由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
  net.ipv4.tcp_keepalive_time = 1200 表示當keepalive起用的時候,TCP發送keepalive訊息的頻度。預設是2小時,改為20分鐘。
  net.ipv4.ip_local_port_range = 1024    65000 表示用於向外串連的連接埠範圍。預設情況下很小:32768到61000,改為1024到65000。
  net.ipv4.tcp_max_syn_backlog = 8192 表示SYN隊列的長度,預設為1024,加大隊列長度為8192,可以容納更多等待串連的網路連接數。
  net.ipv4.tcp_max_tw_buckets = 5000 表示系統同時保持TIME_WAIT通訊端的最大數量,如果超過這個數字,TIME_WAIT通訊端將立刻被清除並列印警告資訊。預設為180000,改為5000。對於Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT通訊端數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT通訊端的最大數量,避免Squid伺服器被大量的TIME_WAIT通訊端拖死。
   net.ipv4.route.gc_timeout = 100  路由緩衝重新整理頻率, 當一個路由失敗後多長時間跳到另一個
預設是300
   net.ipv4.tcp_syn_retries = 1  對於一個建立串連,核心要發送多少個 SYN 串連請求才決定放棄。不應該大於255,預設值是5,對應於180秒左右。
 
 
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
串連狀態數量統計
文章出處:DIY部落(http://www.diybl.com/course/6_system/linux/linuxjq/20090307/159515.html)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.