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)