iptables/netfilter、?tcp_wrapper

來源:互聯網
上載者:User

標籤:etc   pac   nodeps   請求   資料   演算法   推出   相關   update   

iptables/netfilter:

Firewall:防火牆,隔離工具;工作於主機或網路邊緣,對於進出本主機或本網路的報文根據事先定義的檢查規則作匹配檢測,對於能夠被規則匹配到的報文作出相應處理的組件;
主機防火牆
網路防火牆

軟體防火牆(軟體邏輯):
硬體防火牆(硬體和軟體邏輯):NetScreen,CheckPoint,。。。

iptables(netfilter)
netfilter:kernel
hooks function(鉤子函數):
iptables:cli
rules untility

hooks function(鉤子函數):
input
output
forward
prerouting
postrouting

報文流向:
流入本機:PREROUTING --> INPUT ==>使用者空間進程;
由本機流出:使用者空間進程==> OUTPUT --> POSTROUTING;
轉寄:PREROUTING --> FORWARD --> POSTROUTING

功能:表(table)
filter:過濾,防火牆;
nat:network address translation網路位址轉譯;用於修改源IP或目標IP,也可以改連接埠;
mangle:拆解報文,按需修改;
raw:關閉nat表上啟用的串連追蹤機制;

?iptables:
1、內建鏈:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING;對應於一個鉤子函數(hook function);
2、自訂鏈:用於內建鏈的擴充和補充,可實現更靈活的規則管理機制;

表<==>鏈:
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING、INPUT、OUTPUT、POSTROUTING
mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw:PREROUTING、OUTPUT

優先順序:同一個鏈上的不同的表的規則的應用優先順序(高-->低):raw>managle>nat>filter

路由功能發生的時刻:

1、報文進入本機後:判斷目標主機是否為本機?是:INPUT;否:FORWARD(真正是否生效取決於是否開啟路由轉寄)

2、報文離開本機之前:判斷經由哪一個介面送往下一跳?

規則:
組成部分:根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作作出處理;
a、匹配條件:
1、基本匹配條件
2、擴充匹配條件
b、處理動作(target):
1、基本處理動作
2、擴充處理動作
3、自訂處理機制

添加規則時的考量點:
(1) 要實現哪種功能:判斷添加到哪個表上;
(2) 報文流經的路徑:判斷添加到哪個鏈上;
鏈上規則的次序:即為檢查的次序,因此隱含一定的法則:自上而下檢查

1、同類規則(訪問同一應用),匹配範圍小的放上面;

2、不同類規則(訪問不同應用),匹配到報文頻率較大的放上面;

3、將那些可由一條規則描述的多個規則合并為一個;

4、設定預設策略;

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}
1、-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”;

2、-p udp :隱含指明了“-m udp”,有專用選項:
[!] --source-port, --sport port[:port]:匹配報文的源連接埠;可以是連接埠範圍;
[!] --destination-port,--dport port[:port]:匹配報文的目標連接埠;可以是連接埠範圍;

3、-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

1、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

2、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

3、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

4、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

5、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

6、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

7、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 ?日誌行首碼

iptables -I FORWARD -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix “(new connctions)”

RETURN:
返回調用者;

REDIRECT:
只能用在nat表的PREROUTING和POSTROUTING鏈上,連接埠重新導向(即連接埠映射)
--to-ports

iptables -t nat -A PREROUTING -d 172.18.100.67 -p tcp --dport 80 -j REDIRECT --to-ports 8080

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)

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 f2br/>其結果的第一部分,也是檔案的基本資料。"---"表示變動前的檔案,"+++"表示變動後的檔案。第二部分,變動的位置用兩個@作為起首和結束。第三部分是變動的具體內容。

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 mockbuildrpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpmcd rpmbuild/SOURCEStar linux-2.6.32-*.tar.gz -C /usr/srccd /usr/srcln -sv

2、給核心打補丁

tar xf netfilter-layer7-v2.23.tar.bz2cd /usr/src/linuxpatch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patchcp /boot/config-* ?.configmake menuconfig

按如下步驟啟用layer7模組
Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
<M> ?“layer7” match support

3、編譯並安裝核心

makemake modules_installmake install

4、重啟系統,啟用新核心

5、編譯iptables

tar xf iptables-1.4.20.tar.gzcp /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 /rootcp /etc/sysconfig/iptables-config /rootrpm -e iptables iptables-ipv6 --nodeps./configure ?--prefix=/usr ?--with-ksource=/usr/src/linuxmake && make installcp /root/iptables /etc/rc.d/init.dcp /root/iptables-config /etc/sysconfig

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

tar zxvf l7-protocols-2009-05-28.tar.gzcd l7-protocols-2009-05-28make 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模組

?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: [email protected]_ 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: ALL
vsftpd:ALL

iptables/netfilter、?tcp_wrapper

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.