1. 程式人生 > >linux之iptables應用詳解

linux之iptables應用詳解

iptables應用主要包括主機防火牆和網路防火牆

主機防火牆詳解(服務範圍當前主機):

        iptables其規則主要作用在“匹配條件”上,具體為各種模組

icmp模組

--icmp-type
    8:echo-request
    0:echo-reply
例子:兩個主機 in和out,允許in ping out 不允許out ping in 
做法:首先在in上拒絕所有ping請求,先生成一個白名單再在in上寫規則
 

[[email protected]
~]# iptables -A INPUT -p icmp -j REJECT [[email protected] ~]# iptables -A OUTPUT -p icmp -j REJECT [[email protected] ~]# iptables -I OUTPUT 1 -p icmp --icmp-type 8 -j ACCEPT [[email protected] ~]# iptables -I INPUT 1 -p icmp --icmp-type 0 -j ACCEPT

multiport模組

iptables的多埠匹配
Linux系統上配置iptables放開相應的80、21、22、23、53的埠訪問:


[[email protected] ~]# iptables -R INPUT 1 -p tcp -m multiport --dport 21:23,80,53 -j ACCEPT

iprange模組

匹配連讀的地址訪問:
允許192.168.0.1-192.168.0.50的地址訪問到192.168.0.81的80埠:

[[email protected] ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 80 -m iprange --src-range 192.168.0.1-192.168.0.50 -j ACCEPT

ipset模組

允許非連續的地址訪問

[[email protected] ~]# ipset create httplist hash:net maxelem 10000
[[email protected] ~]# ipset add httplist 192.168.153.101
[[email protected] ~]# ipset add httplist 192.168.153.102
[[email protected] ~]# iptables -I INPUT 1 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT
[[email protected] ~]# iptables -I OUTPUT 1 -p tcp --sport 80 -m set --match-set httplist dst -j ACCEPT

string&time模組

拒絕在週一和週四的上午九點到下午六點訪問本機的80埠中帶有game字串的報文

[[email protected] ~]# iptables -R INPUT 1 -m time --timestart 9:00 --timestop 18:00 --weekdays Mon,Thu -m string --algo bm --string "game" -j REJECT

connlimit模組

對匹配的地址做併發連線數限制,限制指定IP的22埠的併發數為3

[[email protected] ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT

limit模組

基於收發報文做速率限制,限制icmp報文的收發速率:

[[email protected] ~]# iptables -I INPUT -d 192.168.0.81 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 5 -j ACCEPT

連線追蹤CONNTRACK

原理分析:

      連線跟蹤(CONNTRACK),顧名思義,就是跟蹤並且記錄連線狀態。Linux為每一個經過網路堆疊的資料包,生成一個新的連線記錄項 (Connection entry)。此後,所有屬於此連線的資料包都被唯一地分配給這個連線,並標識連線的狀態。連線跟蹤是防火牆模組的狀態檢測的基礎,同時也是地址轉換中實 現SNAT和DNAT的前提。那麼Netfilter又是如何生成連線記錄項的呢?每一個數據,都有“來源”與“目的”主機,發起連線的主機稱為“來源”,響應“來源”的請求的主機即為目的,所謂生成記錄項,就是對每一個這樣的連線的產生、傳輸及終止進行跟蹤記錄。由所有記錄項產生的表,即稱為連線跟蹤表。

      在 Linux 核心中,連線記錄由ip_conntrack結構表示。在該結構中,包含一個nf_conntrack型別的結構,其記錄了連線記錄被公開應用的計數,也方便其他地方對連線跟蹤的引用。每個連線記錄都對應一個指向連線超時的函式指標,當較長時間內未使用該連線,將呼叫該指標所指向的函式。如果針對某種協議的連線跟蹤需要擴充套件模組的輔助,則在連線記錄中會有一指向ip_conntrack_helper 結構體的指標。連線記錄中的結構體ip_conntrack_tuple_hash實際記錄了連線所跟蹤的地址資訊(源和目的地址)和協議的特定資訊(埠)。所有連線記錄的ip_conntrack_tuple_hash以雜湊形式儲存在連線跟蹤表中(ip_conntrack記錄存放在堆裡面)。

       對於資料包,首先檢查它的tuple是否存在於hash表中,若存在就能找到對應的連線記錄,若不存在就新建一個連線記錄,將對應的兩個tuple都加入到hash表中去。

iptables 包括一個模組,它允許管理員使用“連線跟蹤”(connection tracking)方法來檢查和限制到內部網路中可用服務的連線。連線跟蹤把所有連線都儲存在一個表格內,它令管理員能夠根據以下連線狀態來允許或拒絕連線:

NEW — 請求新連線的分組,如 HTTP 請求。

ESTABLISHED — 屬於當前連線的一部分的分組。

RELATED — 請求新連線的分組,但是它也是當前連線的一部分。

INVALID — 不屬於連線跟蹤表內任何連線的分組。

報文狀態匹配及連線狀態追蹤,僅匹配放開會話狀態為ESTABLISHTED且埠為21的連線:

[[email protected] ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

對ftp服務作會話追蹤:

裝載ftp連線追蹤的專用模組
[[email protected] ~]# modprobe  nf_conntrack_ftp  
#放開命令連結
[[email protected] ~]# iptables -I INPUT -d 192.168.0.81 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[[email protected] ~]# iptables -I OUTPUT -s 192.168.0.81 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
#放開資料連線
[[email protected] ~]# iptables -I INPUT -d 192.168.0.81 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[[email protected] ~]# iptables -I OUTPUT -s 192.168.0.81 -m state --state ESTABLISHED -j ACCEPT
#檢視已經追蹤並記錄下來的連結
[email protected] ~]# cat /proc/net/nf_conntrack
......
ipv4     2 tcp      6 431997 ESTABLISHED src=192.168.0.85 dst=192.168.0.81 sport=52070 dport=21 src=192.168.0.81 dst=192.168.0.85 sport=21 dport=52070 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=3
ipv4     2 tcp      6 428774 ESTABLISHED src=192.168.0.38 dst=192.168.0.81 sport=51061 dport=22 src=192.168.0.81 dst=192.168.0.38 sport=22 dport=51061 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

網路防火牆(服務範圍為區域網):

做一個只需內網ping外網而不允許外網ping內網的實驗:

三臺機器:

inside       ip:192.168.153.7   
outside     ip:10.10.10.7

firewalld   ip:192.168.153.1

1:在firewalld上開啟ip轉發

[[email protected] ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1

在inside上

[[email protected] ~]# route add default gw 192.168.153.7

在outside上

[[email protected] ~]# route add default gw 10.10.10.7

方法一:類似icmp模組

[[email protected] ~]# iptables -A FORWARD -j REJECT
[[email protected] ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp --icmp-type 8 -j ACCEPT
[[email protected] ~]# iptables -I FORWARD -d 192.168.153.0/24 -s 10.0.0.0/8 -p icmp --icmp-type 0 -j ACCEPT

方法二:狀態追蹤

[[email protected] ~]# iptables -A FORWARD -j REJECT
[[email protected] ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp --icmp-type 8 -j ACCEPT
[[email protected] ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT

方法三:

[[email protected] ~]# iptables -A FORWARD -j REJECT
[[email protected] ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp -m state --state NEW -j ACCEPT
[[email protected] ~]# iptables -I FORWARD - --m state --state ESTABLISHED -j ACCEPT

實驗二:SNAT源地址轉化

在server1啟用iptables並設定SNAT地址轉換,使得192.168.83.0/24網段能夠正常訪問網際網路:

前提:只有僅主機的ip和可以上網的ip的僅主機網絡卡在同一個網段(可以ping通)

首先在可以上網的機器上做以下操作:

#首先啟用IP轉發功能
[[email protected] ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
#新增SNAT規則
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.83.0/24  -j SNAT --to-source 1.1.1.1

在僅主機的機器上開啟路由指向

[[email protected] ~]# route add default gw outside(ip)

另外還可以使用MASQUERADE處理動作來實現SNAT地址轉換,此動作適用於動態IP環境:

[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.83.0/24 -j MASQUERADE

DNAT目的埠對映

在Server1上通過iptables設定DNAT使得client192.168.0.38能通過192.168.0.81的8080埠訪問10.10.10.10的80埠:

[[email protected] ~]# iptables -t nat -A PREROUTING -d 192.168.0.81 -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.10:80