作者:
Debian (Debian)
2014-07-15 06:28:33第四章 實作nftables與開機載入規則分享
本章節即將以一實例運作的nftables,
來介紹nftables在Debian Jessie可以如何運作。
我們在測試所使用的這台電腦,
就直接實際測試開機規則載入執行nftables的實測。
4.1 建立nftables規則的方式
nftables的規則建立方式,
除了在第三章中我們所介紹的直接輸入nftables的指令以外,
nftables本身也有一個互動式的介面,
可以讓使用者查詢/編輯目前運作中的nftables規則。
# nft -i
nft -i的這個指令可以讓使用者進入nftables的互動式指令介面:
nft>
而稍早我們在第三章所介紹的指令,
在互動介面中,
就可以不用輸入指令最前端的"nft"這3個英文字,
如此一來下指令的時間就縮短了一些。
而若要離開互動式介面,
則在互動式介面中輸入quit即可:
nft>quit
如此一來就跳回原本使用的shell環境了。
而詳細的nftables指令,
可以在man裏面查詢nftables的指令規則,
安裝好nftables後man裏面就有詳細的資料囉!
4.2 nftables運作實例
一個完整的防火牆,
在電腦開機後進入系統,
就需要自動運行了,
而如何讓nftables在Debian Jessie上自動的運行呢?
這個問題非常好!
在debian中不用額外撰寫任何的script,
便有現成的方法讓nftables自動運行。
在早期我們操作iptables的開機規則載入時,
我們將iptables-restore指令寫在/etc/network/if-pre-up.d中,
給予其x權限,
使得我們所建立的iptables規則得以於開機時自動載入並且執行。
同樣的nftables也可以依樣畫葫蘆!
在Debian Jessie中nftables的規則檔案,
目前經過測試可成功運行的載入方法有兩種,
分別是:
1. 複製/etc/nftables中的設定,
並且在複製的設定中編輯所需的規則,
於開機時設定由/etc/network/if-pre-up.d建立的nftables載入指令,
來去載入編輯好的nftables規則。
2. 於/etc目錄中,
隨意touch一檔案,
將nftables規則寫於此檔案中,
在由/etc/network/if-pre-up.d建立的nftables載入指令,
使其自動執行編輯的nftables指令檔。
由於方法2可以讓使用者看到完整的nftables指令,
如此一來就算不常編輯nftables規則,
也比較不容易忘記nftables的指令語法。
亦為筆者較為推荐的方式。
故於在第四章中,
便以方法2進行示範!
為了避免視覺性的混淆,
示範的過程將會將ipv4與ipv6設定的檔案以不同的檔名做區分。
首先我們先在/etc中分別建立ipv4規則與ipv6規則的檔案,
以範例中的電腦,
是直接建立在/etc/nftables中,
分別建立檔案名稱為4與6的檔案予以分別放置ipv4與ipv6的規則,
為了避免一般使用者cd至nftables目錄後可以使用cat指令看到nftables的規則,
加上此兩個檔案必須進行載入而需要使用x權限,
故我們將此兩檔案權限設定為700。
我們簡單測試的ipv4的nftables規則加至檔案名稱為4的檔案如下:
nft add rule ip filter input ct state established accept
nft add rule ip filter input tcp dport {1234,5678} accept
nft add rule ip filter input icmp type {echo-request} accept
nft add rule ip filter input drop
nft add rule ip filter forward drop
ipv6的nftables規則加至檔案名稱為6的檔案如下:
nft add rule ip6 filter input ct state established accept
nft add rule ip6 filter input drop
nft add rule ip6 filter forward drop
編輯好所需要的規則後,
再來就是處理開機載入的部份了!
我們到了/etc/network/if-pre-up.d目錄中,
分別建立自動載入ipv4與ipv6規則的兩個檔案,
ipv4的檔案隨意命名為4start,
ipv6的檔案隨意命名為6start,
在4start的檔案中,
我們寫入以下的指令:
#!/bin/sh
/usr/sbin/nft -f /etc/nftables/ipv4-filter;/usr/sbin/nft flush table ip
filter;/etc/nftables/4
而在6start的檔案中,
我們寫入以下的指令:
#!/bin/sh
/usr/sbin/nft -f /etc/nftables/ipv6-filter;/usr/sbin/nft flush table ip6
filter;/etc/nftables/6
完成此兩個檔案後,
切記必須要把兩個檔案的權限設為700,
如此一來開機後,
才會自動載入/etc/nftables/4,
以及/etc/nftables/6這兩個以設定好的規則檔案。
這時候重新開機試試看吧!
重新開機後,
我們下nft list table ip filter指令,
將會看到:
table ip filter {
chain input {
type filter hook input priority 0;
ct state established accept
icmp type { echo-request} accept
tcp dport { 1234, 5678} log accept
drop
}
chain forward {
type filter hook forward priority 0;
drop
}
chain output {
type filter hook output priority 0;
}
}
也就是剛才我們設定在/etc/nftables/4中的規則,
這樣就成功了。
那麼來檢查看看試試看ipv6的規則,
下了nft list table ip6 filter指令,
將會看到:
table ip6 filter {
chain input {
type filter hook input priority 0;
ct state established accept
drop
}
chain forward {
type filter hook forward priority 0;
drop
}
chain output {
type filter hook output priority 0;
}
}
這也就是我們在/etc/nftables/6檔案中所設定的ipv6規則,
如此一來就證明我們的開機自動規則載入設定成功!
4.3 新增/移除/重新載入規則
當需要調整規則時,
不管是新增/移除/調整前後規則並且重新載入,
nftables都可以順利的進行,
不過由於nftables本身不會判斷重複設定的規則,
故若是由設定檔中載入nftables的規則,
勢必需要先進行flush規則的動作,
再次進行載入規則,
以本次測試電腦的ipv4來說,
先行更動/etc/nftables/4中的檔案,
再來執行/usr/sbin/nft flush table ip filter,
最後執行/etc/nftables/4,
如此依來才可以讓nftables更新規則時不會重複載入相同的規則,
不過由於這樣指令太長,
對打字速度慢或是懶的打很多字的使用者並不吃香,
若您們與筆者一樣為lazy guy,
可以學筆者將flush的指令與載入規則的指令,
寫於/usr/local/sbin中,
如此一來只要打簡短幾個字,
就可以一次進行flush與載入規則的動作!
在/usr/local/sbin中,
我們建立一個ipv4使用的檔案假設叫作4reload好了,
並在4reload中加入下列指令:
#!/bin/sh
/usr/sbin/nft flush table ip filter;/etc/nftables/4
另外也可以建立一個ipv6使用的檔案假設叫作6reload,
在6reload中加入下列指令:
#!/bin/sh
/usr/sbin/nft flush table ip6 filter;/etc/nftables/6
並將此兩檔案權限設為700,
如此一來只要打上4reload這幾個字,
就可以讓nftables重新載入/etc/nftables/4中新設定好的ipv4規則。
而同樣的若打上6reload這幾個字,
就可以讓nftables重新載入/etc/nftables/6中新設定好的ipv6規則。
nftables的規則載入運作在Debian Jessie就是這麼簡單!
若要測試NAT等所需的規則設定,
也可以用同樣的方式以此類推來進行自動載入。
若想要在不同的網路使用場所使用不同的nftables規則,
亦可進行不同場所所需的nftables規則,
當把電腦帶到不同的地方,
就可以立刻載入不同設定的rules檔案,
如此一來就可以方便的依照不同的使用環境切換規則設定。