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
此時外網和內網的通信就可以了
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機制,注意網關主機所能夠追蹤的連接數的最大數量要符合需要
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模塊