iptables/netfilter網絡防火牆:
node
打開本機的核心轉發功能:echo 1 > /proc/sys/net/ipv4/ip_forwardlinux
網關上有兩個網卡,一個內網網卡,一個內網網卡,web
內網網卡ip:192.168.254.135;外網網卡ip:10.1.68.15bash
內網主機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.15ssh
此時外網和內網的通訊就能夠了tcp
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端口提供的服務,而外網沒法訪問內網ide
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;
一、限制本地主機的web服務器在週一不容許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不容許訪問;web服務器僅容許響應報文離開本機;
二、在工做時間,即週一到週五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;
三、開放本機的ssh服務給172.16.x.1-172.18.x.100中的主機,x爲你的學號,新請求創建的速率一分鐘不得超過2個;僅容許響應報文經過其服務端口離開本機;
四、拒絕TCP標誌位所有爲1及所有爲0的報文訪問本機;
五、容許本機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)
一、正常格式的diff
例如,對file1(變更前的文件)和file2(變更後的文件)進行比較可以使用以下命令:
# diff file1 file2
顯示結果中,第一行是一個提示,用來講明變更位置。它分紅三個部分:前面的數字,表示file1的第n行有變化;中間的"c"表示變更的模式是內容改變(change),其餘模式還有"增長"(a,表明addition)和"刪除"(d,表明deletion);
二、上下文格式的diff
上個世紀80年代初,加州大學伯克利分校推出BSD版本的Unix時,以爲diff的顯示結果太簡單,最好加入上下文,便於瞭解發生的變更。所以,推出了上下文格式的diff。它的使用方法是加入-c選項(即context)。
# diff -c f1 f2
結果分紅四個部分。第一部分的兩行,顯示兩個文件的基本狀況:文件名和時間信息,"***"表示變更前的文件,"---"表示變更後的文件。第二部分是15個星號,將文件的基本狀況與變更內容分割開。第三部分顯示變更前的文件,即file1。
另外,文件內容的每一行最前面,還有一個標記位。若是爲空,表示該行無變化;若是是感嘆號(!),表示該行有改動;若是是減號(-),表示該行被刪除;若是是加號(+),表示該行爲新增。
第四部分顯示變更後的文件,即file2。
三、合併格式的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
總結:操做步驟
一、獲取並編譯內核
# 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
二、給內核打補丁
# 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
三、編譯並安裝內核
# make
# make modules_install
# make install
四、重啓系統,啓用新內核
五、編譯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
六、爲layer7模塊提供其所識別的協議的特徵碼
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
七、如何使用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模塊