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
寫規則注意事項:
先確定功能(表),確定報文流向(鏈),確定實現的目錄,確定匹配條件 ,處理方法
規則文件:/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