iptables是組成Linux平臺下的包過濾防火牆,與大多數的Linux軟件同樣,這個包過濾防火牆是免費的,它能夠代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。在平常Linux運維工做中,常常會設置iptables防火牆規則,用來加固服務安全。如下對iptables的規則使用作了總結性梳理:前端
iptables首先須要瞭解的:
1)規則概念
規則(rules)其實就是網絡管理員預約義的條件,規則通常的定義爲「若是數據包頭符合這樣的條件,就這樣處理這個數據包」。規則存儲在內核空間的信息 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。
當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept),拒絕(reject)和丟棄(drop)等。配置防火牆的主要工做是添加,修改和刪除等規則。
其中:
匹配(match):符合指定的條件,好比指定的 IP 地址和端口。
丟棄(drop):當一個包到達時,簡單地丟棄,不作其它任何處理。
接受(accept):和丟棄相反,接受這個包,讓這個包經過。
拒絕(reject):和丟棄類似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息能夠指定,也能夠自動產生。
目標(target):指定的動做,說明如何處理一個包,好比:丟棄,接受,或拒絕。
跳轉(jump):和目標相似,不過它指定的不是一個具體的動做,而是另外一個鏈,表示要跳轉到那個鏈上。
規則(rule):一個或多個匹配及其對應的目標。node
2)iptables和netfilter的關係:
Iptables和netfilter的關係是一個很容易讓人搞不清的問題。不少的知道iptables殊不知道 netfilter。其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。mysql
3)iptables的規則表和鏈
表(tables):提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網絡地址轉換、包重構(修改)和數據跟蹤處理。
鏈(chains):是數據包傳播的路徑,每一條鏈其實就是衆多規則中的一個檢查清單,每一條鏈中能夠有一 條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否知足規則所定義的條件。若是知足,系統就會根據 該條規則所定義的方法處理該數據包;不然iptables將繼續檢查下一條規則,若是該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理數據包。linux
Iptables採用「表」和「鏈」的分層結構,在Linux中如今是四張表五個鏈。下面羅列一下這四張表和五個鏈(注意必定要明白這些表和鏈的關係及做用)。web
規則表:
1)filter表——三個鏈:INPUT、FORWARD、OUTPUT
做用:過濾數據包 內核模塊:iptables_filter.
2)Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
做用:用於網絡地址轉換(IP、端口) 內核模塊:iptable_nat
3)Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
做用:修改數據包的服務類型、TTL、而且能夠配置路由實現QOS內核模塊:iptable_mangle(別看這個表這麼麻煩,我們設置策略時幾乎都不會用到它)
4)Raw表——兩個鏈:OUTPUT、PREROUTING
做用:決定數據包是否被狀態跟蹤機制處理 內核模塊:iptable_rawsql
規則鏈:
1)INPUT——進來的數據包應用此規則鏈中的策略
2)OUTPUT——外出的數據包應用此規則鏈中的策略
3)FORWARD——轉發數據包時應用此規則鏈中的策略
4)PREROUTING——對數據包做路由選擇前應用此鏈中的規則
(記住!全部的數據包進來的時侯都先由這個鏈處理)
5)POSTROUTING——對數據包做路由選擇後應用此鏈中的規則
(全部的數據包出來的時侯都先由這個鏈處理)安全
管理和設置iptables規則:服務器
4)iptables傳輸數據包的過程網絡
1)當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否須要轉送出去。
2)若是數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序能夠發送數據包,這些數據包會通過OUTPUT鏈,而後到達POSTROUTING鏈輸出。
3)若是數據包是要轉發出去的,且內核容許轉發,數據包就會如圖所示向右移動,通過FORWARD鏈,而後到達POSTROUTING鏈輸出。app
若是仍是不清楚數據包通過iptables的基本流程,再看下面更具體的流程圖:
從圖中可將iptables數據包報文的處理過程分爲三種類型:
1)目的爲本機的報文
報文以本機爲目的地址時,其通過iptables的過程爲:
1.數據包從network到網卡
2.網卡接收到數據包後,進入raw表的PREROUTING鏈。這個鏈的做用是在鏈接跟蹤以前處理報文,可以設置一條鏈接不被鏈接跟蹤處理。(注:不要在raw表上添加其餘規則)
3.若是設置了鏈接跟蹤,則在這條鏈接上處理。
4.通過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設置特殊的MARK。(注:一般mangle表以給報文設置MARK爲主,在這個表裏面,千萬不要作過濾/NAT/假裝這類的事情)
5.進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裏面作過濾,不然可能形成有些報文會漏掉。(注:它只用來完成源/目的地址的轉換)
6.進入路由決定數據包的處理。例如決定報文是上本機仍是轉發或者其餘地方。(注:此處假設報文交給本機處理)
7.進入mangle表的 INPUT 鏈。在把報文實際送給本機前,路由以後,咱們能夠再次修改報文。
8.進入filter表的 INPUT 鏈。在這兒咱們對全部送往本機的報文進行過濾,要注意全部收到的而且目的地址爲本機的報文都會通過這個鏈,而無論哪一個接口進來的或者它往哪兒去。
9. 進過規則過濾,報文交由本地進程或者應用程序處理,例如服務器或者客戶端程序。
2)本地主機發出報文
數據包由本機發出時,其通過iptables的過程爲:
1.本地進程或者應用程序(例如服務器或者客戶端程序)發出數據包。
2.路由選擇,用哪一個源地址以及從哪一個接口上出去,固然還有其餘一些必要的信息。
3.進入raw表的OUTPUT鏈。這裏是可以在鏈接跟蹤生效前處理報文的點,在這能夠標記某個鏈接不被鏈接跟蹤處理。
4.鏈接跟蹤對本地的數據包進行處理。
5.進入 mangle 表的 OUTPUT 鏈,在這裏咱們能夠修改數據包,但不要作過濾(以免反作用)。
6.進入 nat 表的 OUTPUT 鏈,能夠對防火牆本身發出的數據作目的NAT(DNAT) 。
7.進入 filter 表的 OUTPUT 鏈,能夠對本地出去的數據包進行過濾。
8.再次進行路由決定,由於前面的 mangle 和 nat 表可能修改了報文的路由信息。
9.進入 mangle 表的 POSTROUTING 鏈。這條鏈可能被兩種報文遍歷,一種是轉發的報文,另外就是本機產生的報文。
10.進入 nat 表的 POSTROUTING 鏈。在這咱們作源 NAT(SNAT),建議你不要在這作報文過濾,由於有反作用。即便你設置了默認策略,一些報文也有可能溜過去。
11.進入出去的網絡接口。
3)轉發報文
報文通過iptables進入轉發的過程爲:
1.數據包從network到網卡
2.網卡接收到數據包後,進入raw表的PREROUTING鏈。這個鏈的做用是在鏈接跟蹤以前處理報文,可以設置一條鏈接不被鏈接跟蹤處理。(注:不要在raw表上添加其餘規則)
3.若是設置了鏈接跟蹤,則在這條鏈接上處理。
4.通過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設置特殊的MARK。(注:一般mangle表以給報文設置MARK爲主,在這個表裏面,千萬不要作過濾/NAT/假裝這類的事情)
5.進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裏面作過濾,不然可能形成有些報文會漏掉。(注:它只用來完成源/目的地址的轉換)
6.進入路由決定數據包的處理。例如決定報文是上本機仍是轉發或者其餘地方。(注:此處假設報文進行轉發)
7.進入 mangle 表的 FORWARD 鏈,這裏也比較特殊,這是在第一次路由決定以後,在進行最後的路由決定以前,咱們仍然能夠對數據包進行某些修改。
8.進入 filter 表的 FORWARD 鏈,在這裏咱們能夠對全部轉發的數據包進行過濾。須要注意的是:通過這裏的數據包是轉發的,方向是雙向的。
9.進入 mangle 表的 POSTROUTING 鏈,到這裏已經作完了全部的路由決定,但數據包仍然在本地主機,咱們還能夠進行某些修改。
10.進入 nat 表的 POSTROUTING 鏈,在這裏通常都是用來作 SNAT ,不要在這裏進行過濾。
11.進入出去的網絡接口。
接下來講下iptables規則設置用法
1)iptables的基本語法格式
iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動做或跳轉]
說明:
表名、鏈名:用於指定iptables命令所操做的表和鏈;
命令選項:用於指定管理iptables規則的方式(好比:插入、增長、刪除、查看等;
條件匹配:用於指定對符合什麼樣 條件的數據包進行處理;
目標動做或跳轉:用於指定數據包的處理方式(好比容許經過、拒絕、丟棄、跳轉(Jump)給其它鏈處理。
2)iptables命令的管理控制選項
-A 在指定鏈的末尾添加(append)一條新的規則
-D 刪除(delete)指定鏈中的某一條規則,能夠按規則序號和內容刪除
-I 在指定鏈中插入(insert)一條新的規則,默認在第一行添加
-R 修改、替換(replace)指定鏈中的某一條規則,能夠按規則序號和內容替換
-L 列出(list)指定鏈中全部的規則進行查看(默認是filter表,若是列出nat表的規則須要添加-t,即iptables -t nat -L)
-E 重命名用戶定義的鏈,不改變鏈自己
-F 清空(flush)
-N 新建(new-chain)一條用戶本身定義的規則鏈
-X 刪除指定表中用戶自定義的規則鏈(delete-chain)
-P 設置指定鏈的默認策略(policy)
-Z 將全部表的全部鏈的字節和數據包計數器清零
-n 使用數字形式(numeric)顯示輸出結果
-v 查看規則表詳細信息(verbose)的信息
-V 查看版本(version)
-h 獲取幫助(help)
3)防火牆處理數據包的四種方式ACCEPT 容許數據包經過
DROP 直接丟棄數據包,不給任何迴應信息
REJECT 拒絕數據包經過,必要時會給數據發送端一個響應的信息。
LOG在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則
4)iptables防火牆規則的保存與恢復
iptables-save把規則保存到文件中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來保存規則。
通常用:
iptables-save > /etc/sysconfig/iptables
生成保存規則的文件/etc/sysconfig/iptables,
也能夠用:
service iptables save
它能把規則自動保存在/etc/sysconfig/iptables中。
當計算機啓動時,rc.d下的腳本將用命令iptables-restore調用這個文件,從而就自動恢復了規則。
5)iptables防火牆經常使用的策略梳理
設置默認鏈策略
ptables的filter表中有三種鏈:INPUT, FORWARD和OUTPUT。
默認的鏈策略是ACCEPT,能夠將它們設置成DROP,以下命令就將全部包都拒絕了:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
---------------------------------------------------------------------------------------------------------------------------
其實,在運維工做中最經常使用的兩個規則就是白名單規則和NAT轉發規則:
1)白名單規則
在linux終端命令行裏操做時,若是不是默認的filter表時,須要指定表;
若是在/etc/sysconfig/iptables文件裏設置,就在對應表的配置區域內設置;
上面兩種方式設置效果是同樣的!
好比開通本機的22端口,容許192.168.1.0網段的服務器訪問(-t filter表配置能夠省略,默認就是這種表的配置)
[root@linux-node1 ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
或者
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
開通本機的80端口,只容許192.168.1.150機器訪問(32位掩碼錶示單機,單機指定時能夠不加掩碼)
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
而後保存規則,重啓iptables
[root@linux-node1 ~]# service iptables save
[root@linux-node1 ~]# service iptables restart
或者在/etc/sysconfig/iptables文件裏設置以下(其實上面在終端命令行裏設置並save和restart防火牆後,就會自動保存規則到/etc/sysconfig/iptables這個文件中的):
[root@bastion-IDC ~]# cat /etc/sysconfig/iptables
......
*filter
:INPUT ACCEPT [442620:173026884]
:FORWARD ACCEPT [118911:23993940]
:OUTPUT ACCEPT [8215384:539509656]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
[root@bastion-IDC ~]# service iptables restart
2)NAT轉發設置
好比訪問本機(192.168.1.7)的8088端口轉發到192.168.1.160的80端口;訪問本機的33066端口轉發到192.168.1.161的3306端口
準備工做:
本機打開ip_forword路由轉發功能;192.168.1.160/161的內網網關要和本機網關一致!若是沒有內網網關,就將網關設置成本機內網ip,而且關閉防火牆(防火牆要是打開了,就設置對應端口容許本機訪問)
[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80
[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7
[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7
[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT
[root@kvm-server conf]# service iptables save
[root@kvm-server conf]# service iptables restart
或者在/etc/sysconfig/iptables文件裏設置以下
[root@bastion-IDC ~]# cat /etc/sysconfig/iptables
......
*nat
:PREROUTING ACCEPT [60:4250]
:INPUT ACCEPT [31:1973]
:OUTPUT ACCEPT [3:220]
:POSTROUTING ACCEPT [3:220]
-A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80 //PREROUTING規則都放在上面
-A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
-A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7 //POSTROUTING規則都放在下面
-A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7
.....
*filter
:INPUT ACCEPT [16:7159]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [715:147195]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT
.....
[root@bastion-IDC ~]# service iptables restart
[root@bastion-IDC ~]# iptables -L //列出設置的規則,默認列出的是filter表下的規則
[root@bastion-IDC ~]# iptables -L -t nat //若是列出nat表下規則,就加-t參數
--------------------------------------------------------------------------------------------------------------------------
刪除INPUT鏈的第一條規則
iptables -D INPUT 1
拒絕進入防火牆的全部ICMP協議數據包
iptables -I INPUT -p icmp -j REJECT
容許防火牆轉發除ICMP協議之外的全部數據包
iptables -A FORWARD -p ! icmp -j ACCEPT
說明:使用「!」能夠將條件取反
拒絕轉發來自192.168.1.10主機的數據,容許轉發來自192.168.0.0/24網段的數據
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
說明:注意必定要把拒絕的放在前面否則就不起做用了!
丟棄從外網接口(eth1)進入防火牆本機的源地址爲私網地址的數據包
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
封堵網段(192.168.1.0/24),兩小時後解封
# iptables -I INPUT -s 10.20.30.0/24 -j DROP
# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
# at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1
說明:這個策略能夠藉助crond計劃任務來完成,就再好不過了
只容許管理員從202.13.0.0/16網段使用SSH遠程登陸防火牆主機
iptables -A INPUT -s 202.13.0.0/16 -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT
說明:這個用法比較適合對設備進行遠程管理時使用,好比位於分公司中的SQL服務器須要被總公司的管理員管理時
一般在服務器上會對某一服務端口的訪問作白名單限制,好比(其餘端口設置和下面一致):
運行本機的3306端口(mysql服務)被訪問
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT
或者只運行本機的3306端口被192.168.1.0/24網段機器訪問
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT
容許本機開放從TCP端口20-1024提供的應用服務
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 20:1024 -j ACCEPT
容許轉發來自192.168.0.0/24局域網段的DNS解析請求數據包
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
屏蔽指定的IP地址
如下規則將屏蔽BLOCK_THIS_IP所指定的IP地址訪問本地主機:
BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
(或者僅屏蔽來自該IP的TCP數據包)
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
屏蔽環回(loopback)訪問
iptables -A INPUT -i lo -j DROP
iptables -A OUTPUT -o lo -j DROP
屏蔽來自外部的ping,即禁止外部機器ping本機
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
屏蔽從本機ping外部主機,禁止本機ping外部機器
iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP
禁止其餘主機ping本機,可是容許本機ping其餘主機(禁止別人ping本機,也可使用echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all)
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
禁止轉發來自MAC地址爲00:0C:29:27:55:3F的和主機的數據包
iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
說明:iptables中使用「-m 模塊關鍵字」的形式調用顯示匹配。我們這裏用「-m mac –mac-source」來表示數據包的源MAC地址
容許防火牆本機對外開放TCP端口20、2一、2五、110以及被動模式FTP端口1250-1280
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
注意:這裏用「-m multiport --dport」來指定多個目的端口
iptables -A INPUT -p tcp -m tcp -m multiport --dports 22,80,443,1250-1280 -m state --state NEW -j ACCEPT
也能夠將這幾個端口分開設置多行:
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 1250:1280 -j ACCEPT
禁止轉發源IP地址爲192.168.1.20-192.168.1.99的TCP數據包
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
說明:
此處用「-m iprange --src-range」指定IP範圍
1)過濾源地址範圍:
iptables -A INPUT -m iprange --src-range 192.168.1.2-192.168.1.7 -j DROP
2)過濾目標地址範圍:
iptables -A INPUT -m iprange --dst-range 192.168.1.2-192.168.1.7 -j DROP
3)針對端口訪問的過濾。下面表示除了192.168.1.5-192.168.1.10之間的ip能訪問192.168.1.67機器的80端口之外,其餘ip都不能夠訪問!
iptables -A INPUT -d 192.168.1.67 -p tcp --dport 80 -m iprange --src-range 192.168.1.5-192.168.1.10 -j ACCEPT
禁止轉發與正常TCP鏈接無關的非--syn請求數據包
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
說明:「-m state」表示數據包的鏈接狀態,「NEW」表示與任何鏈接無關的
拒絕訪問防火牆的新數據包,但容許響應鏈接或與已有鏈接相關的數據包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
說明:「ESTABLISHED」表示已經響應請求或者已經創建鏈接的數據包,「RELATED」表示與已創建的鏈接有相關性的,好比FTP數據鏈接等
防止DoS攻擊
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
-m limit: 啓用limit擴展,限制速度。
--limit 25/minute: 容許最多每分鐘25個鏈接
--limit-burst 100: 當達到100個鏈接後,才啓用上述25/minute限制
--icmp-type 8 表示 Echo request——回顯請求(Ping請求)。下面表示本機ping主機192.168.1.109時候的限速設置:
iptables -I INPUT -d 192.168.1.109 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
容許路由
若是本地主機有兩塊網卡,一塊鏈接內網(eth0),一塊鏈接外網(eth1),那麼可使用下面的規則將eth0的數據路由到eht1:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
IPtables中能夠靈活的作各類網絡地址轉換(NAT)
網絡地址轉換主要有兩種:SNAT和DNAT
1)SNAT是source network address translation的縮寫,即源地址目標轉換。
好比,多個PC機使用ADSL路由器共享上網,每一個PC機都配置了內網IP。PC機訪問外部網絡的時候,路由器將數據包的報頭中的源地址替換成路由器的ip,當外部網絡的服務器好比網站web服務器接到訪問請求的時候,它的日誌記錄下來的是路由器的ip地址,而不是pc機的內網ip,這是由於,這個服務器收到的數據包的報頭裏邊的「源地址」,已經被替換了。因此叫作SNAT,基於源地址的地址轉換
2)DNAT是destination network address translation的縮寫,即目標網絡地址轉換。
典型的應用是,有個web服務器放在內網中,配置了內網ip,前端有個防火牆配置公網ip,互聯網上的訪問者使用公網ip來訪問這個網站。
當訪問的時候,客戶端發出一個數據包,這個數據包的報頭裏邊,目標地址寫的是防火牆的公網ip,防火牆會把這個數據包的報頭改寫一次,將目標地址改寫成web服務器的內網ip,而後再把這個數據包發送到內網的web服務器上。這樣,數據包就穿透了防火牆,並從公網ip變成了一個對內網地址的訪問了。即DNAT,基於目標的網絡地址轉換
如下規則將會把本機192.168.1.17來自422端口的流量轉發到22端口,這意味着來自422端口的SSH鏈接請求與來自22端口的請求等效。
1)啓用DNAT轉發
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.17 --dport 422 -j DNAT --to-destination 192.168.1.17:22
2)容許鏈接到422端口的請求
iptables -t filter -A INPUT -p tcp -m tcp -m state --state NEW --dport 422 -j ACCEPT
3)保存規則
# service iptables save
# service iptables restart
假設如今本機外網網關是58.68.250.1,那麼把HTTP請求轉發到內部的一臺服務器192.168.1.20的8888端口上,規則以下:
iptables -t nat -A PREROUTING -p tcp -i eth0 -d 58.68.250.1 --dport 8888 -j DNAT --to 192.168.1.20:80
iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
service iptables save
service iptables restart
或者或本機內網ip是192.168.1.10,那麼把HTTP請求轉發到內部的一臺服務器192.168.1.20的8888端口上,規則以下:
準備工做:本機打開ip_forword路由轉發功能;192.168.1.20的內網網關要和本機網關保持一致!若是沒有內網網關,就將網關地址設置成本機內網ip,而且關閉防火牆(防火牆要是打開了,就設置對應端口容許本機訪問)
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20022 -j DNAT --to-destination 192.168.1.150:22
iptables -t nat -A POSTROUTING -d 192.168.1.150/32 -p tcp -m tcp --sport 22 -j SNAT --to-source 192.168.1.8
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT
service iptables save
service iptables restart
MASQUERADE,地址假裝,在iptables中有着和SNAT相近的效果,但也有一些區別:
1)使用SNAT的時候,出口ip的地址範圍能夠是一個,也能夠是多個,例如:
1)以下命令表示把全部10.8.0.0網段的數據包SNAT成192.168.5.3的ip而後發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
2)以下命令表示把全部10.8.0.0網段的數據包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等幾個ip而後發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
這就是SNAT的使用方法,便可以NAT成一個地址,也能夠NAT成多個地址。可是,對於SNAT,不論是幾個地址,必須明確的指定要SNAT的ip!
假如當前系統用的是ADSL動態撥號方式,那麼每次撥號,出口ip192.168.5.3都會改變,並且改變的幅度很大,不必定是192.168.5.3到192.168.5.5範圍內的地址。這個時候若是按照如今的方式來配置iptables就會出現問題了,由於每次撥號後,服務器地址都會變化,而iptables規則內的ip是不會隨着自動變化的,每次地址變化後都必須手工修改一次iptables,把規則裏邊的固定ip改爲新的ip,這樣是很是很差用的!
2)MASQUERADE就是針對上述場景而設計的,它的做用是,從服務器的網卡上,自動獲取當前ip地址來作NAT。
好比下邊的命令:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的話,不用指定SNAT的目標ip了。
無論如今eth0的出口得到了怎樣的動態ip,MASQUERADE會自動讀取eth0如今的ip地址而後作SNAT出去
這樣就實現了很好的動態SNAT地址轉換
再看看幾個運維實例設置:
1)限制本機的web服務器在週一不容許訪問;
新請求的速率不能超過100個每秒;
web服務器包含了admin字符串的頁面不容許訪問:
web 服務器僅容許響應報文離開本機;
設置以下:
週一不容許訪問
iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays Mon -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
新請求速率不能超過100個每秒
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT
web包含admin字符串的頁面不容許訪問,源端口:dport
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'admin' -j REJECT
web服務器僅容許響應報文離開主機,放行端口(目標端口):sport
iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
2)在工做時間,即週一到週五的8:30-18:00,開放本機的ftp服務給 192.168.1.0網絡中的主機訪問;
數據下載請求的次數每分鐘不得超過 5 個;
設置以下:
iptables -A INPUT -p tcp --dport 21 -s 192.168.1.0/24 -m time ! --weekdays 6,7 -m time --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-above 5 -j ACCET
3)開放本機的ssh服務給192.168.1.1-192.168.1.100 中的主機;
新請求創建的速率一分鐘不得超過2個;
僅容許響應報文經過其服務端口離開本機;
設置以下:
iptables -A INPUT -p tcp --dport 22 -m iprange --src-rang 192.168.1.1-192.168.1.100 -m limit --limit 2/m -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m iprange --dst-rang 192.168.1.1-192.168.1.100 -m state --state ESTABLISHED -j ACCEPT
4)拒絕 TCP 標誌位所有爲 1 及所有爲 0 的報文訪問本機;
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
5)容許本機 ping 別的主機;但不開放別的主機 ping 本機;
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
或者下面禁ping操做:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all