iptables防火墻
@(Linux基礎(chǔ))[iptables防火墻]
iptables防火墻
iptables簡(jiǎn)介
iptables工作在用戶空間,他是定義規(guī)則的工具,本身不是防火墻。他所定義得規(guī)則就是讓在內(nèi)核空間當(dāng)中得netfilter來(lái)讀取。而放入內(nèi)核的地方必須要是特定的位置,必須是tcp/ip的協(xié)議棧經(jīng)過的地方。而這個(gè)tcp/ip協(xié)議棧必須經(jīng)過的地方,可以實(shí)現(xiàn)讀取規(guī)則的地方就叫做 netfilter.(網(wǎng)絡(luò)過濾器)
他在內(nèi)核中選取了5個(gè)位置:
- 1.內(nèi)核空間中:從一個(gè)網(wǎng)絡(luò)接口進(jìn)來(lái),到另一個(gè)網(wǎng)絡(luò)接口去的
- 2.數(shù)據(jù)包從內(nèi)核流入用戶空間的
- 3.數(shù)據(jù)包從用戶空間流出的
- 4.進(jìn)入/離開本機(jī)的外網(wǎng)接口
- 5.進(jìn)入/離開本機(jī)的內(nèi)網(wǎng)接口
這五個(gè)位置也被稱為五個(gè)鉤子函數(shù)
- 1.PREROUTING (路由前)
- 2.INPUT (數(shù)據(jù)包流入口)
- 3.FORWARD (轉(zhuǎn)發(fā)管卡)
- 4.OUTPUT(數(shù)據(jù)包出口)
- 5.POSTROUTING(路由后)
這是NetFilter規(guī)定的五個(gè)規(guī)則鏈,任何一個(gè)數(shù)據(jù)包,只要經(jīng)過本機(jī),必將經(jīng)過這五個(gè)鏈中的其中一個(gè)鏈。
防火墻策
防火墻策略一般分為兩種,一種叫“通”策略,一種叫“堵”策略。
規(guī)則寫法
iptables定義規(guī)則的方式比較復(fù)雜:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
- -t table :3個(gè)filter nat mangle
- COMMAND:定義如何對(duì)規(guī)則進(jìn)行管理
- chain:指定你接下來(lái)的規(guī)則到底是在哪個(gè)鏈上操作的,當(dāng)定義策略的時(shí)候,是可以省略的
- CRETIRIA:指定匹配標(biāo)準(zhǔn)
- -j ACTION :指定如何進(jìn)行處理
示例:
不允許172.16.0.0/24的進(jìn)行訪問
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
當(dāng)然你如果想拒絕的更徹底
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
iptables -L -n -v #查看定義規(guī)則的詳細(xì)信息
- -P 設(shè)置默認(rèn)策略:iptables -P INPUT (DROP|ACCEPT)
- -F 清空規(guī)則鏈
- -L 查看規(guī)則鏈
- -A 在規(guī)則鏈的末尾加入新規(guī)則
- -I num 在規(guī)則鏈的頭部加入新規(guī)則
- -D num 刪除某一條規(guī)則
- -s 匹配來(lái)源地址IP/MASK,加嘆號(hào)"!"表示除這個(gè)IP外。
- -d 匹配目標(biāo)地址
- -i 網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流入的數(shù)據(jù)
- -o 網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流出的數(shù)據(jù)
- -p 匹配協(xié)議,如tcp,udp,icmp
- --dport num 匹配目標(biāo)端口號(hào)
- --sport num 匹配來(lái)源端口號(hào)
iptables的增刪查
查看
iptables -nvL –line-number
- -L 查看當(dāng)前表的所有規(guī)則,默認(rèn)查看的是filter表,如果要查看NAT表,可以加上-t NAT參數(shù)
- -n 不對(duì)ip地址進(jìn)行反查,加上這個(gè)參數(shù)顯示速度會(huì)快很多
- -v 輸出詳細(xì)信息,包含通過該規(guī)則的數(shù)據(jù)包數(shù)量,總字節(jié)數(shù)及相應(yīng)的網(wǎng)絡(luò)接口
- –line-number 顯示規(guī)則的序列號(hào),這個(gè)參數(shù)在刪除或修改規(guī)則時(shí)會(huì)用到
添加
添加規(guī)則有兩個(gè)參數(shù):-A和-I。其中-A是添加到規(guī)則的末尾;-I可以插入到指定位置。
iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 10.20.36.199 0.0.0.0/0
2 DROP all -- 10.20.36.15 0.0.0.0/0
添加一條規(guī)則到尾部:
iptables -A INPUT -s 192.168.1.5 -j DROP
再插入一條規(guī)則到第二行,將行數(shù)直接寫到規(guī)則鏈的后面:
iptables -I INPUT 2 -s 10.25.65.22 -j DROP
查看:
iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 10.20.36.199 0.0.0.0/0
2 DROP all -- 10.25.65.22 0.0.0.0/0
3 DROP all -- 10.20.36.15 0.0.0.0/0
刪除:
iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 10.20.36.199 0.0.0.0/0
2 DROP all -- 10.25.65.22 0.0.0.0/0
3 DROP all -- 10.20.36.15 0.0.0.0/0
查出第二行
iptables -D INPUT 2
修改
使用-R參數(shù)
iptables -R INPUT 3 -j ACCEPT
iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 10.20.36.199 0.0.0.0/0
2 DROP all -- 10.25.65.22 0.0.0.0/0
3 ACCEPT all -- 10.20.36.15 0.0.0.0/0
開機(jī)添加規(guī)則
iptables-save > /opt/iptables_all.txt
在/etc/rc.local添加一行
iptables-restore < /etc/sysconfig/iptables
常用例子:
清空規(guī)則:
iptables -F
iptables –flush
兩條任意一個(gè)都可以
設(shè)置鏈的默認(rèn)策略
鏈的默認(rèn)政策設(shè)置為”ACCEPT”(接受),若要將INPUT,FORWARD,OUTPUT鏈設(shè)置成”DROP”(拒絕),命令如下:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
阻止指定ip地址
丟棄來(lái)自IP地址x.x.x.x的包
iptables -A INPUT -s x.x.x.x -j DROP
阻止來(lái)自IP地址x.x.x.x eth0 tcp的包
iptables -A INPUT -i eth0 x.x.x.x -j DROP
iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP
允許所有SSH的連接請(qǐng)求
允許所有來(lái)自外部的SSH連接請(qǐng)求,即只允許進(jìn)入eth0接口,并且目標(biāo)端口為22的數(shù)據(jù)包
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
僅允許來(lái)自指定網(wǎng)絡(luò)的SSH連接請(qǐng)求
僅允許來(lái)自于192.168.100.0/24域的用戶的ssh連接請(qǐng)求
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允許http和https的連接請(qǐng)求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLEISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
允許所有來(lái)自web -https的連接請(qǐng)求
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
使用multiport將多個(gè)規(guī)則結(jié)合在一起
允許多個(gè)端口從外界連入,除了為每個(gè)端口都寫一條獨(dú)立的規(guī)則外,我們可以用multiport將其組合成一條規(guī)則。如下所示: 例:允許所有ssh,http,https的流量訪問。
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
允許從本地發(fā)起的ssh
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
請(qǐng)注意,這與允許ssh連入的規(guī)則略有不同。本例在OUTPUT鏈上,我們?cè)试SNEW和ESTABLISHED狀態(tài)。在INPUT鏈上,我們只允許ESTABLISHED狀態(tài)。ssh連入的規(guī)則與之相反。
僅允許從本地發(fā)起到一個(gè)指定的網(wǎng)絡(luò)域的SSH請(qǐng)求
僅允許從內(nèi)部連接到網(wǎng)域192.168.100.0/24
iptables -A OUTPUT-o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state NEW,ESTABLEISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLEISHED -j ACCEPT
允許從本地發(fā)起的HTTPS連接請(qǐng)求
下面的規(guī)則時(shí)允許輸出安全的網(wǎng)絡(luò)流量。如果你想允許用戶訪問互聯(lián)網(wǎng)。這些規(guī)則能讓你使用wget從外部瞎子啊一些文件
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -I ETH0 -P tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
注:對(duì)于HTTP web流量的外聯(lián)請(qǐng)求,只需要將上述命令中的端口從443改為80即可。
負(fù)載均衡傳入的網(wǎng)絡(luò)流量
使iptables可以實(shí)現(xiàn)傳入web流量的負(fù)載均衡,我們可以傳入web流量負(fù)載均衡是iptables防火墻規(guī)則。例如:使用iptables nth將https流量負(fù)載均衡到相同的ip地址。
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
允許外部主機(jī)ping內(nèi)網(wǎng)主機(jī)
iptables -A -p icmp --icmp-type echo-request -j ACCEPT
iptables -A -p OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
允許內(nèi)部主機(jī)ping外部主機(jī)
iptable -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
允許回環(huán)訪問
在127.0.0.0回環(huán)訪問
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
允許內(nèi)部網(wǎng)絡(luò)與外部網(wǎng)絡(luò)的通信
防火墻服務(wù)器上的其中一個(gè)網(wǎng)卡連接到外部,另一個(gè)內(nèi)網(wǎng)卡連接到內(nèi)部服務(wù)器,使用以下規(guī)則允許內(nèi)部網(wǎng)絡(luò)與外部網(wǎng)絡(luò)的通信,此外,eth1連接到外部網(wǎng)絡(luò)(互聯(lián)網(wǎng)),eth0連接到內(nèi)部網(wǎng)絡(luò)(例如:192.168.1.x)。
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
允許出站的DNS連接
iptables -A OUTPUT -p upd -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -P udp -i eth0 --sport 53 -j ACCEPT
允許NIS連接
如果使用NIS管理用戶賬號(hào),你需要允許NIS連接。如果你不允許NIS相關(guān)的ypbind連接請(qǐng)求,即使SSH連接請(qǐng)求已被允許,用戶仍然無(wú)法登錄。NIS的端口是動(dòng)態(tài)的,先使用命令rpcinfo -p來(lái)知道端口,此例中為853和端口850端口。rpcinfo -p | grep ypbind 例如:允許來(lái)自111端口以及ypbind使用端口的連接請(qǐng)求。
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT
注:當(dāng)你重啟ypbind之后端口將不同,上述命令將無(wú)效。有兩種解決方案:1)使用你NIS的靜態(tài)IP 2)編寫shell腳本通過“rpcinfo - p”命令自動(dòng)獲取動(dòng)態(tài)端口號(hào),并在上述iptables規(guī)則中使用。
允許來(lái)自指定網(wǎng)絡(luò)的rsync連接請(qǐng)求
允許來(lái)自網(wǎng)絡(luò)192.168.101.0/24的rsync連接請(qǐng)求
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
允許來(lái)自指定網(wǎng)絡(luò)的MySQL連接請(qǐng)求
一些小公司,MySQL數(shù)據(jù)庫(kù)與web服務(wù)跑在同一臺(tái)服務(wù)器上。有時(shí)候我們僅希望DBA和開發(fā)人員從內(nèi)部網(wǎng)絡(luò)(192.168.100.0/24)直接登錄數(shù)據(jù)庫(kù),可嘗試以下命令:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
允許Sendmail,Postfix郵件服務(wù)
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
允許IMAP和IMAPS
允許IMAP/IMAP2流量,端口143
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
允許IMAPS流量,端口為993
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
允許POP3和POP3S
允許POP3訪問
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
允許POP3S訪問
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
防止DoS攻擊
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
上述例子中:
-m limit: 啟用limit擴(kuò)展
–limit 25/minute: 允許最多每分鐘25個(gè)連接(根據(jù)需求更改)。
–limit-burst 100: 只有當(dāng)連接達(dá)到limit-burst水平(此例為100)時(shí)才啟用上述limit/minute限制。
端口轉(zhuǎn)發(fā)
將來(lái)自422端口的流量全部轉(zhuǎn)到22端口。 這意味著我們既能通過422端口又能通過22端口進(jìn)行ssh連接。啟用DNAT轉(zhuǎn)發(fā)。
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
除此之外,還需要允許連接到422端口的請(qǐng)求
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
記錄丟棄的數(shù)據(jù)表
第一步:新建名為L(zhǎng)OGGING的鏈
iptables -N LOGGING
第二步:將所有來(lái)自INPUT鏈中的數(shù)據(jù)包跳轉(zhuǎn)到LOGGING鏈中
iptables -A INPUT -j LOGGING
第三步:為這些包自定義個(gè)前綴,命名為”IPTables Packet Dropped”
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
第四步:丟棄這些數(shù)據(jù)包
iptables -A LOGGING -j DROP

浙公網(wǎng)安備 33010602011771號(hào)