Iptables名詞和術語node
四表:filter(INPUT,FORWARD,OUTPUT),NAT(OUTPUT,PREROUTING,POSTROUTING)MANGLE RAW
五鏈:(chains):INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING 容器: 包含或被包含的關係 Policy(規則)-->Chain(鏈)-->Table(表)--netfilter/iptables
採用的是數據包過濾的機制,會對請求的數據包的包頭數據進行分析,按照規則從上到下匹配 iptables主要工做在OSI七層的2、3、四層, iptables也能夠工做在七層上(squid +iptables) |
||
Filter表 | 默認表,主要和主機自身相關,真正負責防火牆功能的(過濾流入主機的數據包) | |
INPUT | 負責過濾全部進入主機的數據包(最主要) | |
OUTPUT | 處理全部源地址都是本機地址的數據包(過濾流出主機的數據包) | |
FORWARD | 負責流經主機的數據包 net.ipv4.ip_forward | |
Nat表 | 主要負責網絡地址之間的轉換,即來源和目的ip和port的轉換。能夠作企業網關,DMZ,端口映射等 | |
OUTPUT | 和從主機發出去的數據包有關,改變數據包的目的地址 | |
PREROUTING | 在數據包到達防火牆時進行路由判斷以前的的規則,做用是改變數據包的目的地址,目的端口等,用於企業路由(zebra)或網關(iptables),端口映射等 | |
POSTROUTING | 離開防火牆時進行路由判斷以後執行的規則,用來改變數據包的源地址和源端口,出網時,源地址改爲了公網地址,即共享上網 | |
Mangle表 | 主要負責修改數據包中特殊的路由標記,如TTL,TOS,MARK等 | |
INPUT/ OUTPUT/ FORWARD/ PREROUTING POSTROUTING |
iptables --helpmysql
[root@node85 ~]# iptables --help iptables v1.4.7 Usage: iptables -[ACD] chain rule-specification [options] iptables -I chain [rulenum] rule-specification [options] iptables -R chain rulenum rule-specification [options] iptables -D chain rulenum [options] iptables -[LS] [chain [rulenum]] [options] iptables -[FZ] [chain] [options] iptables -[NX] chain iptables -E old-chain-name new-chain-name iptables -P chain target [options] iptables -h (print this help information) Commands: Either long or short options are allowed. --append -A chain Append to chain --check -C chain Check for the existence of a rule --delete -D chain Delete matching rule from chain --delete -D chain rulenum Delete rule rulenum (1 = first) from chain --insert -I chain [rulenum] Insert in chain as rulenum (default 1=first) --replace -R chain rulenum Replace rule rulenum (1 = first) in chain --list -L [chain [rulenum]] List the rules in a chain or all chains --list-rules -S [chain [rulenum]] Print the rules in a chain or all chains --flush -F [chain] Delete all rules in chain or all chains 清除全部規則 --zero -Z [chain [rulenum]] Zero counters in chain or all chains 計數器清0 --new -N chain Create a new user-defined chain --delete-chain -X [chain] Delete a user-defined chain 刪除用戶自定義鏈 --policy -P chain target Change policy on chain to target --rename-chain -E old-chain new-chain Change chain name, (moving any references) Options:(centos5 非加在後面) [!] --proto -p proto protocol: by number or name, eg. `tcp' [!] --source -s address[/mask][...] source specification [!] --destination -d address[/mask][...] destination specification [!] --in-interface -i input name[+] network interface name ([+] for wildcard) --jump -j target target for rule (may load target extension) --goto -g chain jump to chain with no return --match -m match extended match (may load extension) --numeric -n numeric output of addresses and ports [!] --out-interface -o output name[+] network interface name ([+] for wildcard) --table -t table table to manipulate (default: `filter') --verbose -v verbose mode --line-numbers print line numbers when listing --exact -x expand numbers (display exact values) [!] --fragment -f match second or further fragments only --modprobe=<command> try to insert modules using this command --set-counters PKTS BYTES set the counter during insert/append [!] --version -V print package version.
iptables默認加載的是內核的模塊 [root@node85 ~]# lsmod |egrep "nat|filter|ipt" ipt_REJECT 2351 2 iptable_filter 2793 1 ip_tables 17831 1 iptable_filter [root@node85 ~]# lsmod | grep ip ipv6 335589 266 ipt_REJECT 2351 2 nf_conntrack_ipv4 9154 2 nf_defrag_ipv4 1483 1 nf_conntrack_ipv4 nf_conntrack 79206 2 nf_conntrack_ipv4,xt_state iptable_filter 2793 1 ip_tables 17831 1 iptable_filter
可加載模塊 modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state
實踐案例:禁止ssh 22端口ios
語法: iptables -t [table] -[AD] chain rule-specification [options]
#iptables -t filter -A INPUT -p tcp --dport 22 -j DROP 禁止ssh 22端口遠程登陸 #iptables -A INPUT -p tcp --dport 22 -j DROP (同上等價,默認filter表)
#iptables -L -n --line-number -t filter 顯示規則序號
-t 指定表
-A 追加
-p 指定協議
--dport 指定目的端口
-j 採起的方式
ACCEPT 容許數據包經過
DROP 直接丟棄數據包,不給任何迴應信息.iptables -t filter -A INPUT -p tcp --dport 80 -j DROP 會形成找不到網頁,不會形成404
REJECT 拒絕數據包經過,必要時會給數據發送端一個響應的信息。
SNAT 源地址轉換。在進入路由層面的route以前,改寫源地址,目標地址不變,並在本機創建NAT表項,當數據返回時,根據NAT表將目的地址數據改寫爲數據發送出去時候的源地址,併發送給主機。解決NAT上網問題
MASQUERADE 是SNAT的一種特殊形式,適用於像adsl這種臨時會變的ip上
DNAT 目標地址轉換。和SNAT相反,IP包通過route以後、出本地的網絡棧以前,從新修改目標地址,源地址不變,在本機創建NAT表項,當數據返回時,根據NAT表將源地址修改成數據發送過來時的目標地址,併發給遠程主機。能夠隱藏後端服務器的真實地址。
REDIRECT 是DNAT的一種特殊形式,將網絡包轉發到本地host上(無論IP頭部指定的目標地址是啥),方便在本機作端口轉發。
LOG 在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則
解決辦法(誤設禁止ssh規則)
①進到虛擬機 iptables -F 清除全部的規則
②本身有遠程管理卡清理
③機房人員幫忙清理
④定時任務 ,定時清理配置防火牆的時候每5分鐘執行一次
⑤登陸tty清除
⑥iptables -t filter -D INPUT -p tcp --dport 22 -j DROP
⑦/etc/init.d/iptabales stop
刪除規則方法
一、service iptables restart
二、iptables -F
三、iptables -D INPUT -p tcp --dport 80 -j drop
四、iptables -D INPUT rulenumber (--line-number)
實踐案例:封IPnginx
# iptables -I INPUT -i eth0 -s 192.168.0.11 -p tcp --dport 80 -j DROP
-i 指定接口
-s 指定源地址 (也能夠指定網段 -s 192.168.0.0/24)
-p tcp 指定協議
--dport 端口
# iptables -L -n --line-number -t filter Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 192.168.0.11 0.0.0.0/0 tcp dpt:80
實踐案例:禁pingweb
# iptables -t filter -I INPUT -p icmp --icmp-type 8(或any) -i eth0 -s 192.168.0.103 -j DROP #不容許192.168.0.103 ping
案例學習sql
匹配協議 #iptables -A INPUT -p tcp -s 192.168.0.103 -j DROP #指定地址 #iptables -A INPUT ! -p tcp -s 192.168.0.103 -j DROP #指定地址
匹配主機源IP #iptables -A INPUT -s 192.168.0.103
#iptables -A INPUT ! -s 192.168.0.103
匹配網段 #iptables -A INPUT -s 10.0.0.0/24
#iptables -A INPUT -s ! 10.0.0.0/24
匹配3306端口 #iptables -A INPUT -p tcp --dport 3306
匹配單一端口封源端口DNS封堵 #iptables -A INPUT -p tcp --sport 53 #iptables -A INPUT -p udp --dport 53 冒號隔開封範圍 #iptables -A INPUT -p tcp --sport 22:80
#iptables -I INPUT -p tcp --dport 21,22,23,24 ===>錯誤語法
#iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24
#iptables -I INPUT -p tcp --dport 3306:8809
匹配指定的網絡接口
#iptables -A INPUT -i eth0
#iptables -A FORWARD -o eth0
經常使用服務的iptables設置
##nagios監控
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 5666 -j ACCEPT
##mysql
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 3306 -j ACCEPT
##snmp
iptables -A INPUT -s 192.168.0.0/24 -p UDP --dport 161 -j ACCEPT
##rsync
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 873 -j ACCEPT
##nfs2049,portmap 111
iptables -A INPUT -s 192.168.0.0/24 -p udp -m multiport --dport 111,892,2049 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m multiport --dport 111,892,2049 -j ACCEPT
##icmp
iptables -A INPUT -s 192.168.0.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
匹配網絡狀態後端
匹配網絡狀態 (FTP服務是特殊的,須要配狀態鏈接,21端口鏈接,20端口傳數據) -m state --state NEW: 已經或將啓動新的鏈接 ESTABLISHED: 已創建的鏈接 RELATED: 正在啓動新鏈接 INVALID: 非法或沒法識別的 容許關聯的狀態包經過(web服務不要使用) #容許關聯的狀態包 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 比喻:看電影出去WC或者接個電話,回來也得容許進去
控制包的速率設置時間段和併發
-m limit 限制指定時間包的容許經過數量及併發數 --limit n/{second/minute/hour}:指定時間內的請求速率"n"爲速率,後面爲時間分別爲:秒、分、時
--limit-burst [n]:在同一時間內容許經過的請求"n"爲數字,不指定默認爲5
本機地址:172.16.14.1,容許172.16.0.0/16網絡ping本機,但限制每分鐘請求不能超過20,每次併發不能超過6個 #iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT #iptables -A OUTPUT -s 172.16.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
完整定義一個防火牆案例centos
1、清空以前的部署。 iptables -F iptables -X iptables -Z
2、讓本身的SSH 的端口經過(源地址)鏈接CRT的ifconfig的地址便可、 iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT ADSL撥號的網操做如下命令 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 3、設置本機lo的通信規則 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT 4、設置默認的防火牆禁止和容許 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP 5、開啓信任的IP網段(內部的網段) #容許IDC LAN /WAN和辦公網IP的訪問,及對外合做機構的訪問 iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEP ←辦公室固定的IP段 iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT ←IDC機房的內網網段 iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT ←其餘機房的內網網段 iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT ←IDC機房的外網網段 iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT ←其餘IDC機房的外網網段
6、WEB服務容許業務服務端口對外訪問(容許http服務無條件經過) #web server iptables -A INPUT -p tcp --dport 80 -j ACCEPT
7、容許icmp類型協議經過 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #對外容許ping iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT #看需求 若是對內開啓,對外不開就用下面的形式。 iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT #對內用戶能ping通 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #容許外面的人ping通能夠不設定 8、容許關聯的狀態包經過 (web服務不要使用ftp服務。)有的話添加如下內容、 #others RELATED FTP 協議 #容許關聯數據包 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 容許關聯的包進入 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 容許關聯的包出去
保存配置
#/etc/init.d/iptables save
或 #iptables-save >/etc/sysconfig/iptables
防止DoS攻擊(http://seanlook.com/2014/02/26/iptables-example/)服務器
SYN洪水是攻擊者發送海量的SYN請求到目標服務器上的一種DoS攻擊方法,下面的腳本用於預防輕量級的DoS攻擊: iptables -N syn-flood (若是您的防火牆默認配置有「 :syn-flood - [0:0] 」則不準要該項,由於重複了) iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 2/s --limit-burst 5 -j RETURN iptables -A syn-flood -j REJECT # 防止DOS太多鏈接進來,能夠容許外網網卡每一個IP最多15個初始鏈接,超過的丟棄 # 須要iptables v1.4.19以上版本:iptables -V iptables -A INPUT -p tcp --syn -i eth0 --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
#用Iptables抵禦DDOS (參數與上相同) iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT iptables -A FORWARD -p icmp -m limit --limit 2/s --limit-burst 10 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -s ! 172.29.73.0/24 -j DROP
部署企業及IDC機房上網配置網關 局域網共享的兩條命令方法: 方法1:適合於有固定外網地址的: iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 10.0.0.7 (1)-s 192.168.0.0/24 辦公室或IDC內網網段。 (2)-o eth0 爲網關的外網卡接口。 (3)-j SNAT --to-source 10.0.0.19 是網關外網卡IP地址。 方法2:適合變化外網地址(ADSL): iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE 假裝。 實戰企業上網的網關服務器 1)網關服務器A,首先是能上網,而後setup添加一塊網卡,設置內網10.0.0.7 2)客戶服務器B,setup配置IP爲10.0.0.8 網關爲10.0.0.7,還須要配置DNS3) 3)關服務器上編輯文件/etc/sysctl.conf將設置成:net.ipv4.ip_forward = 1 4)將默認的防火牆轉發規則開啓:iptables -P FORWARD ACCEPT 5)加載內核模塊並查看:lsmod |egrep ^ip modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state 查看:lsmod | grep ^ip 6)在網關服務器上配置: iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to-source 192.168.1.129 【iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE假裝(ADSL)】 7)/etc/init.d/iptables save 8)訪問外網映射到內網的服務器上 iptables -t nat -A PREROUTING -d 內IP -p tcp --dport 80 -j DNAT --to-destination 內IP:端口 iptables的生產經常使用場景: 1)實現服務器自己防火牆功能,使用filter表。 iptables -A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j ACCEPT 2)實現局域網上網網關,使用nat表,(POSTROUTING)網關上也能夠同時用filter表作防火牆。 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7 3)實現NAT功能,如:由外部IP映射到內部服務器IP(包括端口),使用nat表,PREROUTING的鏈。 iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.8:9000 4)其餘。。。略。 企業應用場景: 1) 把訪問外網IP及端口的請求映射到內網某個服務器及端口(企業內部)。 2) 硬件防火牆,把訪問LVS/nginx外網VIP及80端口的請求映射到IDC 負載均衡服務器內部IP及端口上(IDC機房的操做) 映射多個外網ip上網: iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j SNAT 124.42.60.11 -124.42.60.16
iptables 的內核優化 dmesg裏面顯示 ip_conntrack: table full, dropping packet.的錯誤提示.如何解決。 C64: net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 優化經常出現如下的錯誤: http://oldboy.blog.51cto.com/2561410/1336488 1、5.8版本上 error: "net.ipv4.ip_conntrack_max"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_max"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_established"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait"is an unknown key 這個錯誤多是你的防火牆沒有開啓或者自動處理可載入的模塊ip_conntrack沒有自動載入,解決辦法有二,一是開啓防火牆,二是自動處理開載入的模塊ip_conntrack 解決辦法: modprobe ip_conntrack echo "modprobe ip_conntrack">> /etc/rc.local
2、6.4版本上 error: "net.nf_conntrack_max"isan unknown key error: "net.netfilter.nf_conntrack_max"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_established"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_time_wait"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_close_wait"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_fin_wait"isan unknown key 這個錯誤多是你的防火牆沒有開啓或者自動處理可載入的模塊ip_conntrack沒有自動載入,解決辦法有二,一是開啓防火牆,二是自動處理開載入的模塊ip_conntrack 解決辦法: modprobe nf_conntrack echo "modprobe nf_conntrack">> /etc/rc.local
6.4版本上 error: "net.bridge.bridge-nf-call-ip6tables"isan unknown key error: "net.bridge.bridge-nf-call-iptables"isan unknown key error: "net.bridge.bridge-nf-call-arptables"isan unknown key 這個錯誤是因爲自動處理可載入的模塊bridge沒有自動載入,解決辦法是自動處理開載入的模塊ip_conntrack 解決辦法: modprobe bridge echo "modprobe bridge">> /etc/rc.local