天天看點

iptables總結

iptables總結:

netfilter:有5個鈎子函數

    1、prerouting 路由前

    2、input 輸入隊列

    3、forward 轉發隊列

    4、output 輸出隊列

    5、postrouting 路由後

iptables功能有4個表:

    1、filter表

    2、mangle表

    3、nat表

    4、raw表

iptables有5個内置鍊分别對應與netfilter5個鈎子函數:

但是在iptables裡要大寫:

    PREROUTING

    INPUT

    FORWARD

    OUTPUT

    POSTROUTING

其中,可自定義鍊,但隻有在内置鍊調用自定義鍊時,自定義上的規則才生效;

表和鍊的對應關系:

filter表對應:INPUT, FORWARD, OUTPUT鍊

mangle表對應:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING鍊

nat表對應:PREROUTING, OUTPUT, POSTROUTING,INPUT鍊

raw表對應:PREROUTING, OUTPUT鍊

<a href="http://s5.51cto.com/wyfs02/M00/7F/A5/wKioL1cncoTz-mtGAAogCrEJlfA260.png" target="_blank"></a>

iptables指令的文法格式:

iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

rule-specification = [matches...] [target]

match = -m matchname [per-match-options]

target = -j targetname [per-target-options]

精簡文法格式:

iptables [-t table] SUBCOMMAND chain [matches..] [target]

-t tables:指明表,預設為filter表, 包括raw, mangle, nat表等;

 SUBCOMMAND子指令

鍊管理:

iptables -N CHAIN-NAME 新增一條自定義鍊;

iptables -X CHAIN-NAME 删除自定義的空鍊,先清除規則,才能删除鍊;

iptables -E CHAIN-NAME CHAIN-NEW-NAME 重命名自定義鍊,但要求是未被引用的鍊;

iptables -P {PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING} {DROP| ACCEPT | REJECT} 設定鍊的預設政策;

規則管理:

-A:追加規則,預設追加在最後一個;

-I:插入規則,預設插入為第一個;

-D:删除規則,兩種格式:指定規則或指定規則的序列号;

(1)rule specification

(2)rule number

-R:替換指定的規則;

-F:清空規則表;

-Z:給iptables計數器置0;

    iptables的每條規則,都有兩個計數器:

    (1)有本規則比對到的所有的packets;

    (2)由本規則比對到的所有packets大小之和;

 -S:列出指定表上的規則,預設為所有表的規則,類似于iptables-save,可用于儲存規則;

儲存規則:

centos 6:兩種方式

]# service iptables save

或:]# iptables-save &gt; /etc/sysconfig/iptables

]# iptables-save &gt; /PATH/TO/SOME_RELE_FILE

儲存任意位置,但是系統不會自動加載;會把檔案中原有規則覆寫;

Centos 7:一種方式

]# iptables -S &gt; /PATH/TO/SOME_RELE_FILE

或:]# iptables-save &gt; /PATH/TO/SOME_RELE_FILE

重載預存的規則:]# iptables-restore &lt; /PATH/TO/SOME_RELE_FILE

centos 6專用方式:]# service iptables restart

會自動從/etc/sysconfig/iptables檔案中重載規則;

自動生效規則檔案中的規則:2種方式

(1)把iptables指令放在腳本檔案中,讓腳本檔案開機自動運作

    把iptables指令放在/usr/bin/iptables.sh

    在/etc/rc.d/rc.local寫明:/usr/bin/iptables.sh

(2)用規則檔案儲存規則,開機自動重載指令;

    在/etc/rc.d/rc.local寫明:iptables-restore &lt; /PATH/TO/SOME_RELE_FILE

規則檢視:

-L:列出規則;

-n:以數字格式顯示位址和端口;

-v:顯示詳細資訊;支援-vv,-vvv更詳細資訊;

 -x:顯示精确值;

--line-numbers:顯示鍊上的規則的編号;

組合使用:-nvL,但L要寫在後面;

比對條件:matches

基本比對:netfilter自帶的比對機制;

擴充比對:分為隐式擴充比對和顯式擴充比對;

基本比對:

[!] -s, --source address[/mask][,...]:指明原位址(範圍)比對;歎号表示取反;

[!] -d, --destination address[/mask][,...]:目标位址比對;

[!] -i, --in-interface name:限制封包流入的接口,隻能用于PREROUTING,INPUT,FORWARD鍊上;用于前半段;

[!] -o, --out-interface name:限制封包流出的接口,隻能用于OUTPUT,FORWARD,POSTROUTING鍊上;用于後半段;

[!] -p{tcp|udp|icmp}:限制協定;

擴充比對:

隐式擴充:無需使用-m指定擴充子產品

[!] -p {tcp|upd|icmp}:限制協定;每個協定都有專用的擴充條件;

tcp:隐含指明了-m tcp,有如下專用選項:

[!] --source-port,--sport port[:port]:比對封包中的tcp首部的源端口,可以是端口範圍;

: port表示為從0開始到指定的端口;

port :表示為從指定端口開始到最大端口;

[!] --destination-port,--dport port[:port]:比對封包中的tcp首部的目标端口,可以是端口範圍;

[!] --tcp-flags mask comp:檢查封包中mask指明的tcp标志位,而要這些标準位comp中必須為1;

例如:

--tcp-flags syn,fin,ack,rst syn 表示檢查tcp第一次握手中的4個标志位,syn必須為1,其它3個必須為0;

--tcp-flags syn,fin,ack,rst ack,fin 表示檢查tcp四次斷開中,請求斷開的封包,4個标志位,ack,fin必須為1,其它2個必須為0;

[!] --syn:相當于--tcp-flags syn,fin,ack,rst syn;tcp三次握手的第一次;

udp:隐含指明了-m udp,有如下專用選項:

[!] --source-port,--sport port[:port]:比對封包中的udp首部的源端口,可以是端口範圍;

[!] --destination-port,--dport port[:port]:比對封包中的udp首部的目标端口,可以是端口範圍;

icmp:隐含指明了-m icmp,有如下專用選項:

[!] --icmp-type {type[/code]|typename}

type/code:

0/0: echo reply 回應答覆

8/0: echo request 表示ping請求

處理動作:target,每個target有自己的選項

-j targetname [per-target-optons]

targetname目标包含:

    ACCEPT,DROP,REJECT:接收,丢棄、拒絕;

    RETURN:傳回調用者;

    REDIRECT:端口重定向;

    LOG:開啟核心關于比對到的封包日志記錄規則;

    MARK:防火牆标記;

    DNAT:目标位址轉換;

    SNAT:原位址轉換;

    MASQERADE:位址僞裝;

LOG:開啟核心關于比對到的封包日志記錄規則;

--log-level level 設定日志級别,可用日志級别:emerg, alert, crit, error, warning, notice, info,debug

--log-prefix prefix 日志行字首,最長29個字母;說明對應的日志資訊,是由誰産生的;

--log-ip-options 記錄在tcp或ip封包首部中有可變長的可選項資訊;

REDIRECT:端口重定向,隻能用在nat表上的prerouting,output鍊上,隻有在入棧封包請求剛到達時,才有用,在其它場景都沒有意義;能實作指明的端口完成映射;

--to-ports port 映射的指定端口;

端口轉換:

REDIRECT能專門實作端口轉換機制,而DNAT完成目标端口轉換,響應封包時能自動進行源端口轉換;

DNAT:修改ip封包中的目标IP位址;僅用在PREROUTING和OUTPUT鍊上;

使用場景:讓本地網絡中的伺服器使用統一的位址向外提供服務,但隐藏了自己的真實位址,還可實作負載均衡;即轉換伺服器端位址,把本地私網主機放在網際網路上當伺服器;

目标位址轉換: 外網使用者通路本地内網中向外提供服務的主機時,本地網關會進行目标位址轉換,把目标位址改為内網的伺服器位址,内網伺服器響應外網使用者時,在本地網關上完成源位址轉換,隻不過響應封包中不需要使用者參與,根據追蹤會話表自動完成源位址轉換;

--to-destination [ipaddr[-ipaddr]][:port[-port]]  指明目标位址、目标端口,也可是範圍;

SNAT:修改ip封包中的源IP位址;隻能用在POSTROUTING和INPUT鍊上;

使用場景:讓本地網絡中的主機可使用統一位址與外部通信,進而實作位址僞裝;即轉換用戶端位址,一般代理本地私網主機到網際網路;

原位址轉換:本地内網使用者通路外網伺服器時,在本地網關上進行原位址轉換,把内網使用者請求封包中原位址轉換為網關的公網位址與外界通信,外網伺服器響應内網使用者時,進行目标位址轉換,隻不過響應封包中不需要使用者參與,網關根據追蹤會話表自動完成目标位址轉換,轉發給内網使用者;

--to-source [ipaddr[-paddr]] 指明原位址、源端口(但源端口一般為随機端口),可指定位址範圍;

--random 随機配置設定端口;

注意:

centos6系統上,nat表隻包含3個鍊:OUTPUT、PREROUTING、POSTROUTING;

而在centos7系統上,nat表包含4個鍊:INPUT、OUTPUT、PREROUTING、POSTROUTING;

MASQUERADE:位址僞裝,僅用在POSTROUTING鍊上;

  使用場景:隻用于動态撥号擷取ip位址場景中,替換(就無需使用)snat;事實上靜态位址時,一樣可以使用;

比對條件:

    顯示擴充:明确指定擴充,使用-m指明擴充子產品;

multiport:多端口比對,以離散方式定義多端口比對,最多可以指定15個端口;

 [!] --source-ports,--sports-port[,port|,port:port]...

 [!] --destination-ports,--dports-port[,port|,port:port]...

 [!] --ports port[,port|,port:port]...

iprange:指明一段連續的ip位址範圍作為原位址或目标位址比對;

 [!] --src-range from[-to]:原位址範圍;

 [!] --dst-range from[-to]:目标位址範圍;

string:對封包中的應用層資料做字元串比對檢測;對核心版本要大于2.6.14

 --algo {bm|kmp}:算法

 [!] --string pattern:給定要檢查的字元串模式;

 [!] --hex-string pattern:給定要檢查的字元串模式,十六進制;

time:根據收到封包的時間/日期與指定的時間/日期範圍進行比對;

 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間;

 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間;

 --timestart hh:mm[:ss]:起始時間;

 --timestop hh:mm[:ss]:結束時間;

 [!] --monthdays day[,day...]:比對一個月中的哪些天;

 [!] --weekdays day[,day...]:比對一個周中的哪些天;

connlimit:根據每用戶端做并發連接配接數限制,即每用戶端最多發起的連接配接數量;

 --connlimit-upto n:連接配接數量小于等于n,則比對;

 --connlimit-abvoe n:連接配接數量大于n則比對;

limit:基于令牌桶算法對封包的速率進行比對;

 --limit rate[/second|/minute|/hour|/day] 設定用戶端每秒、分鐘、小時、天發送的資料包速率;

 --limit-burst number 設定一次突發的大小;預設為5;

state:是conntrack的子集,用于實作對封包的狀态做連接配接追蹤;

 [!] --state state,狀态有如下5種:

   INVALID:無法識别的連接配接;

   ESTABLISHED:連接配接追蹤模闆當中存在的記錄的連接配接;

   NEW:連接配接追蹤模闆當中不存在的連接配接請求;

   RELATED:相關聯的連接配接;

   UNTRACKED:未追蹤的連接配接;

注意:手動追蹤related狀态,要安裝nf_conntrack_ftp子產品;

已經追蹤到的并記錄下來的連接配接存放在:/proc/net/nf_conntrack

連接配接追蹤功能所能夠記錄最大連接配接數量(可調整):/proc/sys/net/nf_conntrack_max

當模闆滿載時,後續的新連接配接有可能會逾時,解決辦法:

(1)加大nf_conntrack_max的值;

(2)降低nf_conntrack條目的逾時時長;不同協定的連接配接追蹤時長定義在:/proc/sys/net/netfilter/有很多timeout檔案中定義;

  mangle表:會在後面lvs内容中做詳細介紹;

  raw表:使用不多,不做介紹;

iptables示例:

]# iptables -nL 檢視防火牆設定;預設檢視filter表在3個鍊上INPUT,FORWARD,OUTPUT的規則設定;其中policy ACCEPT叫預設政策;

]# iptables -t nat -nL 檢視nat表,可出現在4個鍊上PREROUTING,INPUT,OUTPUT,POSTROUTING;注意:在centos6系統上,nat表不能在INPUT上;

]# iptables -t mangle -nL 檢視mangle表

]# iptables -t raw -nL 檢視raw表

]# iptables -N mychain 建立自定義鍊,鍊名稱為mychain;

]# iptables -E mychain inchain 重命名自定義鍊為inchain;

]# iptables -X mychain 删除空鍊;注意,此鍊上如果有規則,要先清空後,才能删除;

]# iptables -t filter -P FORWARD DROP 設定FORWARD預設政策為丢棄,-t filter可省略;

]# iptables -P INPUT DROP 設定INPUT預設政策;

]# iptables -P OUTPUT DROP 設定OUTPUT預設政策;

]# iptables -nL INPUT 檢視指定某個鍊上的規則;

]# iptables -nvL 檢視詳細資訊;

]# iptables -nvxL 檢視詳細資訊,且顯示機關為位元組;

]# iptables -nvxL --line-number 顯示規則編号;

]# iptables -nvvxL --line-number 顯示更詳細資訊;

]# iptables -nvvvxL --line-number 顯示更多更詳細資訊;

]# iptables -S 顯示添加的規則指令;

]# iptables -S INPUT 顯示在input鍊上添加的規則指令;

]# iptables -F 清空規則;

設定僅172.18.11.112能連接配接本機;

]# iptables -A INPUT -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT 設定入棧放行;

]# iptables -A OUTPUT -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT 設定出棧放行;

此時,隻有172.18.11.112能ping同本地主機;

設定處理除了172.18.11.112不能連接配接本機,其它主機均可連接配接;

]# iptables -A INPUT ! -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT 

]# iptables -A OUTPUT ! -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT 

此時,隻有172.18.11.112不能連接配接本地主機;

設定僅允許172.18網段的tcp連接配接本機

]# iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -j ACCEPT

此時,在172.18.11.111主機不能ping通本機,但可以ssl本機;

放行本地主機ssh服務,任意主機可遠端登入本機;

]# iptables -A INPUT -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j ACCEPT 入棧規則,-s 0/0可省略預設為所有位址;

]# iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p tcp --sport 22 -j ACCEPT 出棧規則;

]# iptables -P INPUT DROP 預設政策設為禁止通路;所有服務禁止通路本機;

浏覽器不能通路172.18.11.114網頁

開放本機80端口

]# iptables -A INPUT -d 172.18.11.114 -p tcp --dport 80 -j ACCEPT 入棧規則;

]# iptables -A OUTPUT -s 172.18.11.114 -p tcp --sport 80 -j ACCEPT 出棧規則;

浏覽器可通路172.18.11.114網頁;

允許自己png别人,禁止别人ping自己:

]# iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT 出棧設定

]# iptables -A INPUT -s 0/0 -d 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT 入棧設定

開放别人可ping自己:

]# iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -j ACCEPT 入棧設定

]# iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT 出棧設定

]# iptables -D INPUT 2 删入棧的22端口規則;

]# iptables -D OUTPUT 2 删出棧的22端口規則;

允許172.18網段通路,本機的telnet,ssh,web服務

]# iptables -F 清空規則,預設均為拒絕通路

]# iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT

]# iptables -A OUTPUT -d 172.18.0.0/16 -s 172.18.11.114 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEPT

開放ping請求,讓别人能ping進來

]# iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT

]# iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

合并規則盡量寫為一條

]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

]# iptables -A INPUT -d 172.18.11.114 -p tcp -m multiport --dports 22,23,80 -m state --state NEW -j ACCEPT

]# iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

放行被動的ftp服務

]# modprobe nf_conntrack_ftp 手動裝載子產品

]# iptables -A INPUT -d 172.18.11.114 -p tcp --dport 21 -m state --state NEW -j ACCEPT

]# iptables -R INPUT 1 -d 172.18.11.114 -m state --state ESTABLISHED,RELATED -j ACCEPT

儲存規則

]# iptables -S

]# iptables-save &gt; /etc/sysconfig/iptables.v1

]# cat /etc/sysconfig/iptables.v1

加載檔案預存的規則

]# iptables-restore &lt; /etc/sysconfig/iptables.v1

]# tcpdump -i eno16777736 -nn icpm 抓icmp的ping包

打開防火牆的核心轉發

]# echo 1 &gt; /proc/sys/net/ipv4/ip_forward

在防火牆主機隻添加一條放進來外網ping包的規則;

]# iptables -A FORWARD -s 0/0 -d 10.0.1.0/24 -p icmp --icmp-type 0 -j ACCEPT

使用基于狀态追蹤設定規則時,如果隻允許内網ping出去,就可把之前設定的兩條規則合并;

]# iptables -F

]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

]# iptables -A FORWARD -s 10.0.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

當外網主機為web、vsftp伺服器時,要允許内網主機通路外網的伺服器;

在防火牆主機設定規則:

]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT 僅放行出去的請求;

]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEP 此時,放行的是vsftp的指令連接配接,響應通過上面的ESTABLISHED也沒問題,但資料連接配接在被動模式下,沒有放行隻有在related狀态放行才行;資料連接配接隻有第一次請求是related的,而且要識别related而不是new要先裝載iptables的子產品,即ftp連接配接追蹤的子產品;

裝載iptables的追蹤ftp的連接配接追蹤子產品

]# modprobe nf_conntrack_ftp

在被動模式下,伺服器發請求,第一次請求為related的,是以是從外網到内網的為related;

替換第一條規則:

]# iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

添加日志字首:

]# iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,22,23,21 -m state --state NEW -j LOG --log-prefix "new connctions: "

]# iptables -N web 建立自定義鍊

]# iptables -vnL

]# iptables -A web -s 10.0.1.0/24 -p tcp --dport 80 -j ACCEPT 添加web鍊規則,允許本地主機通路web服務;

]# iptables -I web 1 -m string --algo kmp --string "old" -j REJECT 插入第1條web鍊,包含了old字元串的頁面禁止通路;

隻要狀态是ESTABLISHED應放行;

]# iptables -I web 2 -p tcp -m state --state ESTABLISHED -j ACCEPT 插入web鍊第2條,放行狀态是ESTABLISHED;

再放行ssh服務:

]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -m state --state NEW -j ACCEPT 由内而外放行請求的封包,雖然沒有放行響應的封包,但是在web自定義鍊上的規則已經放行了;

顯式指明傳回調用者:

]# iptables -A web -j RETURN 表示web鍊比對不到就傳回調用者;

在web伺服器上添加規則:端口映射(位址轉換--&gt;端口轉換)

]# iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 80

]# iptables -t nat -D PREROUTING 1

]# iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 8080

為内網使用者通路外網在防火牆設定SNAT:

]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114

如果防火牆有多個外網位址可設為位址範圍;如下:

]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114-172.18.11.117

要禁止内網使用者通路ssh服務,22端口:

在網關防火牆設定規則:

]# iptables -t filter -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -j REJECT

如果内網1.22為向外提供服務,外網11.111為用戶端要通路1.22:

先確定網關防火牆沒有監聽80端口;但可向外宣稱提供80服務,實際是由内網1.22提供服務;

]# ss -tnl

]# iptables -t nat -F POSTROUTING 指明清除nat表上的postrouting鍊上的規則;

]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22

表示隻有目标位址11.114、目标端口為80時,轉換目标位址為10.0.1.22目的端口沒改

内網主機提供的服務端口跟網關防火牆聲稱的提供服務的端口不一樣時:做端口映射

]# iptables -t nat -F

]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8090

抓包tcp協定的8090端口

]# tcpdump -i eth0 -nn tcp port 8090

]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22

此時,在外網主機11.111上通路網關防火牆11.114的ssh服務,被轉給了内網10.22主機;

]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 0 -j DNAT --to-destination 10.0.1.22

此時,把目的端口設為0,外網11.111再通路11.114的web服務或ssh服務都被拒絕;在特殊場景中不會是此效果,例如,用到負載均衡器的lvs場景時,會把11.114上的所有端口,統統轉到内網主機伺服器上;

本文轉自 crystaleone 51CTO部落格,原文連結:http://blog.51cto.com/linsj/1769563,如需轉載請自行聯系原作者

繼續閱讀