第四章 实作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档案,
如此一来就可以方便的依照不同的使用环境切换规则设定。