iptables

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
  
15.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

26.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
相關文章
相關標籤/搜索