iptables/netfilter:html
Firewall:防火牆,隔離工具;工做於主機或網絡邊緣,對於進出本主機或本網絡的報文根據事先定義的檢查規則做匹配檢測,對於可以被規則匹配到的報文做出相應處理的組件;
主機防火牆
網絡防火牆前端
軟件防火牆(軟件邏輯):
硬件防火牆(硬件和軟件邏輯):NetScreen,CheckPoint,。。。node
iptables(netfilter)
netfilter:kernel
hooks function(鉤子函數):
iptables:cli
rules untilitylinux
hooks function(鉤子函數):
input
output
forward
prerouting
postroutingweb
報文流向:
流入本機:PREROUTING --> INPUT ==>用戶空間進程;
由本機流出:用戶空間進程==> OUTPUT --> POSTROUTING;
轉發:PREROUTING --> FORWARD --> POSTROUTING算法
功能:表(table)
filter:過濾,防火牆;
nat:network address translation網絡地址轉換;用於修改源IP或目標IP,也能夠改端口;
mangle:拆解報文,按需修改;
raw:關閉nat表上啓用的鏈接追蹤機制;安全
iptables:
一、內置鏈:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING;對應於一個鉤子函數(hook function);
二、自定義鏈:用於內置鏈的擴展和補充,可實現更靈活的規則管理機制;服務器
表<==>鏈:
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING、INPUT、OUTPUT、POSTROUTING
mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw:PREROUTING、OUTPUT網絡
優先級:同一個鏈上的不一樣的表的規則的應用優先級(高-->低):raw>managle>nat>filter併發
路由功能發生的時刻:
一、報文進入本機後:判斷目標主機是否爲本機?是:INPUT;否:FORWARD(真正是否生效取決因而否開啓路由轉發)
二、報文離開本機以前:判斷經由哪個接口送往下一跳?
規則:
組成部分:根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動做做出處理;
a、匹配條件:
一、基本匹配條件
二、擴展匹配條件
b、處理動做(target):
一、基本處理動做
二、擴展處理動做
三、自定義處理機制
添加規則時的考量點:
(1) 要實現哪一種功能:判斷添加到哪一個表上;
(2) 報文流經的路徑:判斷添加到哪一個鏈上;
鏈上規則的次序:即爲檢查的次序,所以隱含必定的法則:自上而下檢查
一、同類規則(訪問同一應用),匹配範圍小的放上面;
二、不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面;
三、將那些可由一條規則描述的多個規則合併爲一個;
四、設置默認策略;
Centos 7
~]# systemctl stop firewalld.service
~]# systemctl disable firewalld.service
注意:當修改iptables規則時,避免出錯致使遠程訪問給阻擋,應在應用規則前定義一個at或者crontab任務,清除規則,保證遠程訪問能夠正常訪問
規則格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, [filter]
SUBCOMMAND:
鏈管理:
-N:new, 新增一條自定義鏈;
-F:flush,清空指定的規則鏈;
-X: delete,刪除自定義的空鏈;
-Z:zero,置零規則計數器;iptables的每條規則都有兩個計數器:(1) 匹配到的報文的個數;(2) 匹配到的全部報文的大小之和;
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:ACCEPT:接受、DROP:丟棄、REJECT:拒絕
-E:rename,重命名自定義的未被引用的鏈;引用計數不爲0的自定義鏈不可以被重命名,也不能被刪除;
規則管理:
-A:append,在最後追加;
-I:insert, 插入,要指明位置,省略時表示第一條;
-D:delete,刪除指定規則;
-R:replace,替換指定鏈上的指定規則;
兩種指定方式:(1) 指明規則序號;(2) 指明規則自己;
-S:selected,以iptables-save命令的格式顯示鏈上的規則;
查看:
-L:list, 列出指定鏈上的全部規則;
-n:numeric,以數字格式顯示地址和端口;
-v:verbose,詳細信息;
-vv, -vvv
-x:exactly,顯示計數器結果的精確值而非換算後的結果;
--line-numbers:顯示鏈上的規則的編號;
chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配條件:
基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;
[!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;
[!] -p, --protocol protocol
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"
{tcp|udp|icmp}
[!] -i, --in-interface name:數據報文流入的接口;只能應用於數據報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;
[!] -o, --out-interface name:數據報文流出的接口;只能應用於數據報文流出的環節,只能應用於FORWARD、OUTPUT和POSTROUTING鏈;
擴展匹配條件: 須要加載擴展模塊,方可生效;其模塊目錄爲/usr/lib64/xtables/
隱式擴展:能夠不用使用-m選項專門加載相應模塊;前提是要使用-p選項可匹配何種協議;
[!] -p, --protocol protocol
協議protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"
{tcp|udp|icmp}
一、-p tcp:隱含指明瞭「-m tcp」,有專用選項:
[!] --source-port, --sport port[:port]:匹配報文的tcp首部的源端口;能夠是端口範圍;
[!] --destination-port,--dport port[:port]:匹配報文的tcp首部的目標端口;能夠是端口範圍;
[!] --tcp-flags LIST1 LIST2:檢查LIST1所指明的全部標誌位,且這其中,LIST2所表示出的全部標記位必須爲1,而餘下的必須爲0;沒有在LIST1中指明的,不作檢查;
SYN,ACK,FIN,RST,PSH,URG
例如:「--tcp-flags SYN,ACK,FIN,RST SYN」表示,
要檢查的標誌位爲SYN,ACK,FIN,RST四個,其中SYN必須爲1,餘下的必須爲0;
[!] --syn:用於匹配第一次握手,至關於「--tcp-flags SYN,ACK,FIN,RST SYN」;
二、-p udp :隱含指明瞭「-m udp」,有專用選項:
[!] --source-port, --sport port[:port]:匹配報文的源端口;能夠是端口範圍;
[!] --destination-port,--dport port[:port]:匹配報文的目標端口;能夠是端口範圍;
三、-p icmp :隱含指明瞭「-m icmp」,有專用選項:
[!] --icmp-type {type[/code]|typename}
echo-request:8/0echo請求
echo-reply:0/0 echo應答
顯式擴展:必需要手動加載擴展模塊, [-m matchname [per-match-options]];
使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
一、multiport擴展
以離散方式定義多端口匹配;最多指定15個端口;
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
[!] --ports port[,port|,port:port]...:指明多個端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
二、iprange擴展
指明連續的(但通常是不能擴展爲整個網絡)ip地址範圍時使用;
[!] --src-range from[-to]:源IP地址範圍;
[!] --dst-range from[-to]:目標IP地址範圍;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
三、string擴展
對報文中的應用層數據作字符串模式匹配檢測;
--algo {bm|kmp}:字符串匹配檢測算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] --string pattern:給定要檢測的字符串模式;
[!] --hex-string pattern:給定要檢測的字符串模式,16進制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string 'gay' -j REJECT
四、time擴展
根據將報文到達的時間與指定的時間日期範圍進行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間
--timestart hh:mm[:ss]:起始時間(天天)
--timestop hh:mm[:ss]:結束時間(天天)
[!] --monthdays day[,day...]:匹配一個月中的哪些天
[!] --weekdays day[,day...]:匹配一個週中的那些天
--kerneltz:使用內核上的時區,而非默認的UTC;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
五、connlimit擴展
根據每客戶端IP作併發鏈接數數量匹配;
--connlimit-upto n:鏈接的數量小於等於n時匹配;
--connlimit-above n:鏈接的數量大於n時匹配;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 8 -j REJECT
六、limit擴展
基於令牌桶過濾器算法對收發報文的速率作匹配;
令牌桶過濾器;
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number :突發速率
~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT
七、state擴展
根據「鏈接追蹤機制」去檢查鏈接的狀態;
conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有以下幾種:
NEW:新發出請求;鏈接追蹤模板中不存在此鏈接的相關信息條目,所以,將其識別爲第一次發出的請求;
ESTABLISHED:NEW狀態以後,鏈接追蹤模板中爲其創建的條目失效以前期間內所進行的通訊狀態;
RELATED:相關聯的鏈接;如ftp協議中的數據鏈接與命令鏈接之間的關係;
INVALID:無效的鏈接;
UNTRACKED:未進行追蹤的鏈接;一般在負載均衡前端須要關閉鏈接追蹤的功能。
[!] --state state
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
鏈接追蹤功能所可以容納的最大鏈接數量(可調整):
/proc/sys/net/nf_contrack_max
sysctl -w net.nf_contrack_max 300000
echo "300000" > /proc/sys/net/nf_contrack_max
注意:當conntrack所可以追蹤的最大值取決於/proc/sys/net/nf_contrack_max的設定;已經追蹤到到的並記錄下來的鏈接位於/proc/net/nf_conntrack文件中,超時的鏈接將會被刪除;當模版滿載時,後續的新鏈接有可能會超時;解決辦法:
(1)加大nf_contrack_max的值;
(2)下降nf_contrack_max條目的超時時長;
不一樣協議的鏈接追蹤時長設定位於/proc/sys/net/netfilter/目錄下
已經追蹤到到的並記錄下來的鏈接:
/proc/net/nf_conntrack
不一樣的協議的鏈接追蹤時長:
/proc/sys/net/netfilter/
iptables的連接跟蹤表最大容量爲/proc/sys/net/ipv4/ip_conntrack_max,連接碰到各類狀態的超時後就會從表中刪除;當模板滿載時,後續的鏈接可能會超時
解決方法通常有兩個:一般採用第1個辦法
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216
(2) 下降 nf_conntrack timeout時間
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
如何開放被動模式的ftp服務?
(1) 裝載ftp鏈接追蹤的專用模塊:
~]# modprobe nf_conntrack_ftp
(2) 放行命令鏈接(假設Server地址爲172.16.100.67):
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3) 放行數據鏈接(假設Server地址爲172.16.100.67):
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT
規則優化:
服務器端規則設定:任何不容許的訪問,應該在請求到達時給予拒絕;
(1) 可安全放行全部入站的狀態爲ESTABLISHED狀態的鏈接;
(2) 可安全放行全部出站的狀態爲ESTABLISHED狀態的鏈接;
(3) 謹慎放行入站的新請求
(4) 有特殊目的限制訪問功能,要於放行規則以前加以拒絕;
如何使用自定義鏈:
自定義鏈:須要被調用才能生效;自定義鏈最後須要定義返回規則;
返回規則使用的target叫作RETURN;
規則的用效期限:
使用iptables命令定義的規則,手動刪除以前,其生效期限爲kernel存活期限;
保存規則:
保存規則至指定的文件:
CentOS 6:
~]# service iptables save
將規則保存至/etc/sysconfig/iptables文件中;
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 7:
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
從新載入預存規則文件中規則:
~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE
CentOS 6:
~]# service iptables restart
會自動從/etc/sysconfig/iptables文件中載入規則
自動生效規則文件中的規則:
(1) 用腳本保存各iptables命令;讓此腳本開機後自動運行;
/etc/rc.d/rc.local文件中添加腳本路徑;
/PATH/TO/SOME_SCRIPT_FILE
(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則;
/etc/rc.d/rc.local文件添加:
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
CentOS 7:
引入了新的iptables前端管理工具firewalld,其管理工個有:firewalld-cmd, firewalld-config
關於firewalld:
https://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
處理動做:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回調用的鏈;
REDIRECT:端口重定向;
LOG:記錄日誌;
MARK:作防火牆標記;
DNAT:目標地址轉換;
SNAT:源地址轉換;
MASQUERADE:地址假裝;
LOG:開啓關於匹配數據包的內核日誌
--log-level level 日誌級別
emerg, alert, crit, error, warning, notice, info, debug.
--log-prefix prefix 日誌行前綴
RETURN:
返回調用者;
REDIRECT:
只能用在nat表的PREROUTING和POSTROUTING鏈上,端口重定向(即端口映射)
--to-ports
nat: network address translation:網絡地址轉換,網絡層+傳輸層實現
snat: source nat
修改IP報文中的源IP地址;
讓本地網絡中的主機可以使用同一地址與外部主機通訊,從而實現地址假裝;
請求:由內網主機發起,修改源IP,如何修改由管理員定義;
響應:修改目標IP,由nat自動根據會話表中追蹤機制實現相應修改;
dnat: destination nat
修改IP報文中的目標IP地址;
讓本地網絡中的服務器使用統一的地址向外提供服務,但隱藏了本身的真實地址;
請求:由外網主機發起,修改其目標地址,如何修改由管理員定義;
響應:修改源IP,由nat自動根據會話表中追蹤機制實現相應修改;
pnat: port nat(端口轉換)
snat:POSTROUTING
讓本地網絡中的主機經過某一特定地址訪問外部網絡時;
dnat:PREROUTING
把本地網絡中的某一主機上的某服務開放給外部網絡中的用戶訪問時;
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:只能用在nat表的POSTROUTING鏈,用於實現要轉換的IP爲動態地址時;
源地址轉換:當源地址爲動態獲取的地址時,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 -t nat -A POSTROUTING -s localnet ! -d localnet -j SNAT --to-source extip
iptables -t nat -A POSTROUTING -s localnet ! -d localnet -j MASQUERADE
目標地址轉換:
iptables -t nat -A PREROUTING -d extip -p tcp|udp --dport PORT -j DNAT --to-destination INTERSERVERIP[:PORT]
補充:利用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"
第三方模塊:
layer7:識別大多數常見的應用層協議,例如http、qq等協議;
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 f2br/>其結果的第一部分,也是文件的基本信息。"---"表示變更前的文件,"+++"表示變更後的文件。第二部分,變更的位置用兩個@做爲起首和結束。第三部分是變更的具體內容。
除了有變更的那些行之外,也是上下文各顯示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
總結:操做步驟
一、獲取並編譯內核
二、給內核打補丁
按以下步驟啓用layer7模塊
Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
<M> 「layer7」 match support
三、編譯並安裝內核
四、重啓系統,啓用新內核
五、編譯iptables
六、爲layer7模塊提供其所識別的協議的特徵碼
七、如何使用layer7模塊
ACCT的功能已經能夠在內核參數中按需啓用或禁用。此參數須要裝載nf_conntrack模塊後方能生效。
net.netfilter.nf_conntrack_acct = 1
l7-filter uses the standard iptables extension syntax
編譯內核:
make menuconfig
make -j #
make modules_install
make install
清理內核源碼樹:
提示:xt_layer7.ko依賴於nf_conntrack.ko模塊
tcp_wrapper:tcp包裝器
對基於tcp協議開發並提供服務的應用程序,提供的一層訪問控制工具;基於庫調用實現其功能:libwrap
判斷某服務是否可以由tcp_wrapper進行訪問控制的方法:
(1) 動態編譯:ldd命令;
ldd $(which COMMAND) | grep libwrap
(2) 靜態編譯:strings命令查看應用程序文件,其結果中是否出現了hosts.allow和hosts.deny文件;
strings $(which COMMAND)
注意:超級守護進程xinetd連接到了libwrap.so;
服務基於libwrap完成訪問控制的流程:
首先檢查/etc/hosts.allow文件中有沒有顯式受權當前請求者訪問:
是:直接受權客戶端訪問;
否:接着去檢查/etc/hosts.deny文件中有沒有顯式拒絕當前請求者訪問:
是:直接拒絕當前請求者的訪問;
否:容許請求者訪問;
配置文件語法:
daemon_list:client_list [:options]
daemon_list:
(1) 單個應用程序的文件名稱,而非服務名;例如vsftpd;
(2) 以逗號分隔的應用程序文件名列表;
例如:sshd, vsftpd
(3) ALL:全部接受tcp_wrapper控制的程序;
client_list:
(1)IP地址或主機名;
(2)網絡地址:必須使用完整格式的掩碼(172.18.0.0/255.255.0.0),或簡短格式的網絡地址:例如172.16. 表示172.16.0.0/255.255.0.0;不能使用前綴格式掩碼;
(3)ALL:全部主機;
(4)KNOWN(正解與反解一致):UNKNOWN:PARANOID(正反解不匹配):
(5)EXCEPT:除了;
例如:包含172.18網絡,除了172.18.100網段,但包含172.18.100.68主機;(雙重except表明確定)
vsftpd: 172.18. EXCEPT 172.18.100.0/255.255.255.0 EXCEPT 172.18.100.68
:options
deny:拒絕,主要用於hosts.allow文件;
allow:容許,主要用於hosts.deny文件;
spawn:啓動指定的應用程序;
例如:sshd: ALL :spawn /bin/echo $(date) login attempt from %c to %s, %d >> /var/log/sshd.log
可以使用的擴展:
%c: client ip
%s: daemon@serve_ ip
%d: daemon name
%p:daemon process id
獲取全部幫助信息手冊:man hosts_access
例如:vsftpd僅開放給172.16.0.0/255.255.0.0中的主機訪問;
sshd僅開放給172.16.0.0/255.255.0.0中的主機訪問,可是不包含172.16.100.6;
/etc/hosts.allow:
sshd: 172.16. EXCEPT 172.16.100.6
vsftpd: 172.16.
/etc/hosts.deny:sshd: ALLvsftpd:ALL