iptables(3)

iptables/netfilter網絡防火牆:

打開本機的核心轉發功能:echo 1 > /proc/sys/net/ipv4/ip_forward

網關上有兩個網卡,一個內網網卡,一個內網網卡,

內網網卡ip:192.168.254.135;外網網卡ip:10.1.68.15

內網主機ip:192.168.254.136;網關:192.168.254.135 。外網主機ip:10.1.68.16

此時內網主機是可以ping通192.168.254.135,10.1.68.15

內網主機添加gateway:route add default gw 192.168.254.135

同時外網主機添加gateway:route add default gw 10.1.68.15

此時外網和內網的通信就可以了

        

wKiom1gMcbywRktvAACJ6XgSdTg616.png-wh_50

wKioL1gMcY-zQ74-AAB5ZGyre84789.png-wh_50

iptables -I FORWARD -s 192.168.254.0/24 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD 2 -d 192.168.254.0/24 -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -j DROP


添加以上規則,內網就能實現內網訪問外網的由80端口提供的服務,而外網無法訪問內網

iptables -I FORWARD 1 -m state --state ESTABLISHED -j ACCEPT//可以省去寫所有響應報文的規則
iptables -I FORWARD 3 -s 192.168.254.0/24 -p icmp -j ACCEPT//允許內網主機ping外網主機
iptables -R FORWARD 2 -s 192.168.254.0/24 -p tcp  -m multiport --dport 22,23,80,21,139,445 -m state --state NEW -j ACCEPT//同時放行多端口,並指定放行端口的狀態


開啓ftp的被動轉發功能:先開啓網關的nf_conntract_nfs 

之後把第一條規則改爲iptables -I FORWARD 1 -m state --state RELATED,ESTABLISHED -j 

定義規則,調試之前最好設置一個20分鐘自動清空規則的計劃任務,防止規則出錯,導致服務連接不上

添加規則於FORWARD鏈,注意幾個問題:

1) 請求和響應報文均會經由FORWARD鏈,要注意規則的方向性;

第一條:iptables -I FORWARD  -m state --state ESTABLISHED,RELATED -j ACCEPT

2) 如果可以啓用conntrack機制,注意網關主機所能夠追蹤的連接數的最大數量要符合需要

wKioL1gMcgugCipfAACp_tRGOSs291.png

NAT:網絡地址轉換

內網主機不希望互聯網上的用戶訪問到內網主機的存在。就需要把內網主機發的報文到達網關時,把內網主機的地址轉化爲網關的外網地址。網關主機中有一個nat表記錄哪個內網發來的請求轉發給了外網。

源地址轉換:SNAT,POSTROUTING

靜態轉換:外網地址是固定的  (另外一種是地址池機制,外網地址有多個,轉換的時候隨機選擇一個)

動態轉換:外網地址是不固定的

目標地址轉換:DNAT,PREROUTING

公司中有三臺主機提供對外的三種服務,但是隻有一個外網地址我們在網關上設置目標地址轉換。網關主機對外宣稱自己提供三種服務,當外網用戶訪問網關外網ip時,將不同服務轉換給內網的不同主機以提供服務

PAT:Port Address Translation :端口轉換

SNAT:源地址轉換

This  target  is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.

--to-source [ipaddr[-ipaddr]]

iptables -t nat -I POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source  10.1.68.15

//經由內網192.168.254.0/24網絡的訪問,都把源地址改爲10.1.68.15

iptables -t nat -I POSTROUTING -s 10.1.68.16 -j SNAT --to-source 192.168.254.135

//經由外網進來的訪問內網主機,都轉換爲由網關內網網卡的訪問

此時在網關主機上不同的網卡上抓的包是不一樣的。

MASQUERADE:動態地址轉換

This target is only valid in the nat table, in the POSTROUTING chain.  It  should  only  be  used  with  dynamically assigned  IP (dialup) connections: if you have a static IP address, you should use the SNAT target. 

iptables -t nat -I  POSTROUTING -s 192.168.254.0/24 -p tcp --dport 80 -j MASQUERADE

由內網訪問出去的,沒指定轉換爲網關的哪個地址時,會自動掃描可用的地址。通常用在撥號上網的方式上。使用靜態地址時不建議使用這種方式,會影響性能

DNAT:目標地址轉換

This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains  which  are only  called from those chains. 

--to-destination [ipaddr[-ipaddr]][:port[-port]]

iptables -t nat -R  PREROUTING 1 -d 10.1.68.15 -j DNAT --to-destination 192.168.254.136//訪問網關外網ip的請求都轉發至內網192.168.254.136,提供服務

iptables -t nat -I PREROUTING  -d 10.1.68.15 -p tcp --dport 80 -j DNAT --to-destination 192.168.254.136:8080//轉至內網httpd服務的8080端口

iptables -t nat -R PREROUTING 1 -d 10.1.68.15 -p tcp --dport 22 -j DNAT --to-destination 192.168.254.137:22



REDIRECT:端口映射, 在本機上把端口轉換爲指定的端口

This  target  is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. 

--to-ports port[-port]

iptables -t nat -I PREROUTING -d 192.168.254.136,192.168.254.137 -p tcp --dport 80 -j REDIRECT --to-port 8080//僅在當前主機上完成端口映射,提供服務的是8080端口,當用戶訪問本機的80端口時把端口轉換爲提供服務的8080端口

這樣可以不用在網關上設置端口轉換


RETURN:返回調用的鏈上,不加默認也是返回。但是最好加上。

nat上完成轉換,filter上完成過濾

自定義鏈:自定義鏈需要在主鏈上調用才能生效。可以把針對不同服務的規則定義在不同的自定義鏈上,然後在主鏈上調用。  自定義鏈只要被調用了,就不能刪掉。沒被引用但是上面有規則也不能刪除

iptables -N chain_new

                        *nat
			:PREROUTING ACCEPT [88:12626]
			:INPUT ACCEPT [82:12266]
			:OUTPUT ACCEPT [0:0]
			:POSTROUTING ACCEPT [2:120]
			COMMIT
			# Completed on Sat Oct 22 09:56:27 2016
			# Generated by iptables-save v1.4.21 on Sat Oct 22 09:56:27 2016
			*filter
			:INPUT ACCEPT [81:6825]
			:FORWARD ACCEPT [0:0]
			:OUTPUT ACCEPT [20:1868]
			:web_in - [0:0]
			-A FORWARD -m state --state ESTABLISHED -j ACCEPT
			-A FORWARD -d 192.168.254.136/32 -p tcp -m tcp --dport 80 -j web_in
			-A FORWARD -j REJECT --reject-with icmp-port-unreachable
			-A web_in -d 192.168.254.0/24 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
			iptables -A web_in -j RETURN 
			COMMIT
			# Completed on Sat Oct 22 09:56:27 2016


練習:INPUT和OUTPUT默認策略爲DROP;


1、限制本地主機的web服務器在週一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機;

2、在工作時間,即週一到週五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;

3、開放本機的ssh服務給172.16.x.1-172.18.x.100中的主機,x爲你的學號,新請求建立的速率一分鐘不得超過2個;僅允許響應報文通過其服務端口離開本機;

4、拒絕TCP標誌位全部爲1及全部爲0的報文訪問本機;

5、允許本機ping別的主機;但不開放別的主機ping本機;



練習:判斷下述規則的意義:

# iptables -N clean_in //添加一個鏈名爲clean_in的自定義鏈

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP


# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

# iptables -A clean_in -d 172.16.100.7 -j RETURN 



# iptables -A INPUT -d 172.16.100.7 -j clean_in


# iptables -A INPUT  -i lo -j ACCEPT

# iptables -A OUTPUT -o lo -j ACCEPT



# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP


# iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT

補充:利用iptables的recent模塊來抵禦DOS***: 22,建立一個列表,保存有所有訪問過指定的服務的客戶端IP



ssh: 遠程連接,


iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP



iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP


1.利用connlimit模塊將單IP的併發設置爲3;會誤殺使用NAT上網的用戶,可以根據實際情況增大該值;


2.利用recent和state模塊限制單IP在300s內只能與本機建立2個新連接。被限制五分鐘後即可恢復訪問。


下面對最後兩句做一個說明:


1.第二句是記錄訪問tcp 22端口的新連接,記錄名稱爲SSH

--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目


2.第三句是指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接。

--update 是指每次建立連接都更新列表;

--seconds必須與--rcheck或者--update同時使用

--hitcount必須與--rcheck或者--update同時使用


3.iptables的記錄:/proc/net/xt_recent/SSH



也可以使用下面的這句記錄日誌:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"



CentOS 6:


http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/

layer7:第三方擴展;


iptables實現七層訪問過濾:


模塊:layer7

識別應用層協議


iptables/netfilter

iptables -m state, 

netfilter state


對內核中的netfilter,打補丁layer7,重新編譯內核

對iptables打補丁,補上layer7模塊,重新iptables



diff/patch:文本操作工具



diff是Unix系統的一個很重要的工具程序。它用來比較兩個文本文件的差異,是代碼版本管理的核心工具之一。其用法非常簡單:

# diff <變動前的文件> <變動後的文件>


由於歷史原因,diff有三種格式:

* 正常格式(normal diff)

* 上下文格式(context diff)

* 合併格式(unified diff)


1、正常格式的diff

例如,對file1(變動前的文件)和file2(變動後的文件)進行比較可使用如下命令:

# diff file1 file2

顯示結果中,第一行是一個提示,用來說明變動位置。它分成三個部分:前面的數字,表示file1的第n行有變化;中間的"c"表示變動的模式是內容改變(change),其他模式還有"增加"(a,代表addition)和"刪除"(d,代表deletion);


2、上下文格式的diff

上個世紀80年代初,加州大學伯克利分校推出BSD版本的Unix時,覺得diff的顯示結果太簡單,最好加入上下文,便於瞭解發生的變動。因此,推出了上下文格式的diff。它的使用方法是加入-c選項(即context)。

# diff -c f1 f2

結果分成四個部分。第一部分的兩行,顯示兩個文件的基本情況:文件名和時間信息,"***"表示變動前的文件,"---"表示變動後的文件。第二部分是15個星號,將文件的基本情況與變動內容分割開。第三部分顯示變動前的文件,即file1。

另外,文件內容的每一行最前面,還有一個標記位。如果爲空,表示該行無變化;如果是感嘆號(!),表示該行有改動;如果是減號(-),表示該行被刪除;如果是加號(+),表示該行爲新增。

第四部分顯示變動後的文件,即file2。


3、合併格式的diff

如果兩個文件相似度很高,那麼上下文格式的diff,將顯示大量重複的內容,很浪費空間。1990年,GNU diff率先推出了"合併格式"的diff,將f1和f2的上下文合併在一起顯示。

它的使用方法是加入u參數(代表unified)。

# diff -u f1 f2

其結果的第一部分,也是文件的基本信息。"---"表示變動前的文件,"+++"表示變動後的文件。第二部分,變動的位置用兩個@作爲起首和結束。第三部分是變動的具體內容。

除了有變動的那些行以外,也是上下文各顯示3行。它將兩個文件的上下文,合併顯示在一起,所以叫做"合併格式"。每一行最前面的標誌位,空表示無變動,減號表示第一個文件刪除的行,加號表示第二個文件新增的行。


diff 

-u


patch


儘管並沒有指定patch和diff的關係,但通常patch都使用diff的結果來完成打補丁的工作,這和patch本身支持多種diff輸出文件格式有很大關係。patch通過讀入patch命令文件(可以從標準輸入),對目標文件進行修改。通常先用diff命令比較新老版本,patch命令文件則採用diff的輸出文件,從而保持原版本與新版本一致。


patch的標準格式爲

patch [options] [originalfile] [patchfile]


如果patchfile爲空則從標準輸入讀取patchfile內容;如果originalfile也爲空,則從patchfile(肯定來自標準輸入)中讀取需要打補丁的文件名。因此,如果需要修改的是目錄,一般都必須在patchfile中記錄目錄下的各個文件名。絕大多數情況下,patch都用以下這種簡單的方式使用:


patch命令可以忽略文件中的冗餘信息,從中取出diff的格式以及所需要patch的文件名,文件名按照diff參數中的"源文件"、"目標文件"以及冗餘信息中的"Index:"行中所指定的文件的順序來決定。


-p參數決定了是否使用讀出的源文件名的前綴目錄信息,不提供-p參數,則忽略所有目錄信息,-p0(或者-p 0)表示使用全部的路徑信息,-p1將忽略第一個"/"以前的目錄,依此類推。如/usr/src/linux-2.4.15/Makefile這樣的文件名,在提供-p3參數時將使用linux-2.4.15/Makefile作爲所要patch的文件。


patch

-p

-R


mockbuild


總結:操作步驟


1、獲取並編譯內核


# useradd mockbuild

# rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm

# cd rpmbuild/SOURCES

# tar linux-2.6.32-*.tar.gz -C /usr/src

# cd /usr/src

# ln -sv 


2、給內核打補丁

# tar xf netfilter-layer7-v2.23.tar.bz2

# cd /usr/src/linux

# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch

# cp /boot/config-*  .config

# make menuconfig


按如下步驟啓用layer7模塊

Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration

<M>  “layer7” match support


3、編譯並安裝內核

# make

# make modules_install

# make install


4、重啓系統,啓用新內核


5、編譯iptables


# tar xf iptables-1.4.20.tar.gz

# cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/

# cp /etc/rc.d/init.d/iptales /root

# cp /etc/sysconfig/iptables-config /root

# rpm -e iptables iptables-ipv6 --nodeps

# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux

# make && make install


# cp /root/iptables /etc/rc.d/init.d

# cp /root/iptables-config /etc/sysconfig


6、爲layer7模塊提供其所識別的協議的特徵碼


# tar zxvf l7-protocols-2009-05-28.tar.gz

# cd l7-protocols-2009-05-28

# make install


7、如何使用layer7模塊


ACCT的功能已經可以在內核參數中按需啓用或禁用。此參數需要裝載nf_conntrack模塊後方能生效。

net.netfilter.nf_conntrack_acct = 1




l7-filter uses the standard iptables extension syntax 

# iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action] 



# iptables -A FORWARD -m layer7 --l7proto qq -j REJECT




編譯內核:

make menuconfig

make -j #

make modules_install

make install


清理內核源碼樹:


提示:xt_layer7.ko依賴於nf_conntrack.ko模塊


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章