地址屬于內核,而不屬于網卡?。。?!
網絡防火墻的實現(主要是forward鏈)
172.16.100.68(A)和172.16.100.67(B)
192.168.12.10(B)和192.168.12.77(C)(VNET2)
B作為C的網關
配置B主機的網卡一個為192.168.1.72,另一個為172.16.25.72
配置C主機的網卡一個
[root@B ~]# sysctl -w net.ipv4.ip_forward=1 打開轉發
[root@B ~]# tcpdump -i eno16777736 -nn icmp
此時可以轉發,但是A主機的網關不是192.168.1.72.故它的回應報文此時回不去。
————————————————————————————————————————————————-
源地址(端口)轉換和目標地址(端口)轉換都不考慮回應報文;而僅考慮第一次接到(DNAT)或發出(SNAT)的報文
端口映射
NetFilter
NAT :NetWork Address Translation
SNAT:源地址轉換,一般發生在POSTROUTING(路由決策才可以決定是否更改地址,PREROUTING和FORWARD和POSTROUTING都有路由決策)和OUTPUT(本機多塊網卡的地址轉換)
使用場景:本地網絡中的主機通過某一特定地址訪問外部網絡時使用;
DNAT:目標地址轉換,一般發生在PREROUTING,(在路由決策之前,否則會轉入本機)
讓本地網絡中的某些主機的某些服務開放給外部網絡中的用戶訪問時;
PNAT:端口 轉換,比如web服務的服務端口為80,可將真正的web服務器主機的web服務監聽端口設置為8080,而后當客戶端訪問時是80端口,在經過網關時轉換為8080來訪問真正的web服務。
NAT表的target:
SNAT
–to-source [ipaddr[-ipaddr]][:port[-port]]
—random
DNAT
–to-destination [ipaddr[-ipaddr]][:port[-port]]
—random
MASQUERADE
–to-ports port[-port]
–random
SNAT示例:
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT –to-source 172.16.100.67
MASQUERADE示例:
源地址轉換:當外網源地址為動態獲取的地址時,MASQUERADE可自行判斷要轉換為的外網地址;
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
DNAT示例:
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp –dport 80 -j DNAT –to-destination 192.168.12.77
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp –dport 80 -j DNAT –to-destination 192.168.12.77:8080
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp –dport 22012 -j DNAT –to-destination 192.168.12.78:22
REDIRECT:
本機的端口重定向
web: 8080
80 –> 8080
補充:利用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
————————————————————————————————————————————————
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模塊
原創文章,作者:sjfbjs,如若轉載,請注明出處:http://www.www58058.com/54321