一般来说,Netfilter 算是 Linux 的第三代防火墙,前两代分别是 ipfwadm 和 ipchains 。Netfilter 的官网是:www.netfilter.org ,它在不断的开发着 Netfilter;而 Linux (www.kernel.org) 也不断的将其新版本整合到 Linux 系统中来。
Linux 是一个 “模块化” 的内核,内核中的众多功能以模块的形式提供,我们可以加载所需要的模块到内存,在不用时可以将其移除,而 Netfilter 也是以模块的形式存在于 Linux 中。我们可以用 lsmod 命令列出内核模块信息,加载一个内核模块使用 insmod 命令,移除内核模块使用 rmmod 命令。
Netfilter 的在内核中的工作位置如下图所示:
对于 IPV4 网络环境来说,相应的 Netfilter 模块存放在:
[Plain Text] 纯文本查看 复制代码 /lib/modules/2.6.43.2-6.fc15.i686.PAE/kernel/net/ipv4/netfilter/
其中 2.6.43.2-6.fc15.i686.PAE 是系统内核版本,根据具体的系统不同而不同。
对于 IPV6 网络环境来说,相应的 Netfilter 模块存放在:
[Plain Text] 纯文本查看 复制代码 /lib/modules/2.6.43.2-6.fc15.i686.PAE/kernel/net/ipv6/netfilter/
上面的 ipv4 和 ipv6 两个目录都是与 “协议” 相关的,而在内核版本 2.6.14 之前也只有这两个目录。在这种情况下,我们在使用这些模块时,要注意区别使用,如此一来不但对于使用者不方便,就程序设计者而言要维护这么多模块也很辛苦。因此,在 2.6.14 版本开始,这些 Netfilter 模块的设计上有了重大改变,Netfilter 组织希望模块与 “协议” 无关。也就是说,同一个模块可以同时应用于 IPV4 和 IPV6 两种网络环境下。这个工作目标还没有完全达成,但也有部分的模块已经做到这一点,而这些目标则存放在下面的目录下:
[Plain Text] 纯文本查看 复制代码 /lib/modules/2.6.43.2-6.fc15.i686.PAE/kernel/net/netfilter/
其中 2.6.43.2-6.fc15.i686.PAE 是系统内核版本,根据具体的系统不同而不同。
那么,Netfilter 和 iptables 有什么关系呢?
实际上,iptables 有两个版本,iptables 和 ip6tables,它们分别对应 IPV4 和 IPV6 两个网络环境。iptalbes 可以说是防火墙规则编辑工具,它将操作人员编辑好的规则写入内存,以及后续对新规则的添加或对已有规则的删除与修改等操作。这些别写入到内存的规则,由 Netfilter 读取并执行。因此,我们常说的 Linux 防火墙是 "iptables" 是一种比较宽泛点的说法,严格一点可以说成是 “Netfilter/iptables” 。
比如我们要将一条防火墙规则(如 iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT) 写到 Netfilter 的规则数据库中时,iptables 工具会先检查其语法是否正确,如果不正确,则发出警告,反之则些到规则数据库中。那么这里有一个问题:iptables 如何知道一个规则命令语法是否在正确,应该调用哪个模块呢?
实际上,不只是 Netfilter 有模块,iptables 也有模块(实际上 .so 共享库),它们放在/lib/xtables/ 目录下。在该目录下有 iptables 和 ip6tables 两个工具需要的模块:[root@beyes beyes]# ls /lib/xtables/
libip6t_ah.so libipt_icmp.so libxt_connlimit.so libxt_mac.so libxt_SET.so
libip6t_dst.so libipt_LOG.so libxt_connmark.so libxt_mark.so libxt_socket.so
libip6t_eui64.so libipt_MASQUERADE.so libxt_CONNMARK.so libxt_MARK.so libxt_standard.so
libip6t_frag.so libipt_MIRROR.so libxt_CONNSECMARK.so libxt_multiport.so libxt_state.so
libip6t_hbh.so libipt_NETMAP.so libxt_conntrack.so libxt_NFLOG.so libxt_statistic.so
libip6t_hl.so libipt_realm.so libxt_cpu.so libxt_NFQUEUE.so libxt_string.so
libip6t_HL.so libipt_REDIRECT.so libxt_CT.so libxt_NOTRACK.so libxt_tcpmss.so
libip6t_icmp6.so libipt_REJECT.so libxt_dccp.so libxt_osf.so libxt_TCPMSS.so
libip6t_ipv6header.so libipt_SAME.so libxt_dscp.so libxt_owner.so libxt_TCPOPTSTRIP.so
libip6t_LOG.so libipt_SNAT.so libxt_DSCP.so libxt_physdev.so libxt_tcp.so
libip6t_mh.so libipt_ttl.so libxt_esp.so libxt_pkttype.so libxt_TEE.so
libip6t_REJECT.so libipt_TTL.so libxt_hashlimit.so libxt_policy.so libxt_time.so
libip6t_rt.so libipt_ULOG.so libxt_helper.so libxt_quota.so libxt_tos.so
libipt_addrtype.so libipt_unclean.so libxt_IDLETIMER.so libxt_rateest.so libxt_TOS.so
libipt_ah.so libxt_CHECKSUM.so libxt_iprange.so libxt_RATEEST.so libxt_TPROXY.so
libipt_CLUSTERIP.so libxt_CLASSIFY.so libxt_ipvs.so libxt_recent.so libxt_TRACE.so
libipt_DNAT.so libxt_cluster.so libxt_LED.so libxt_sctp.so libxt_u32.so
libipt_ecn.so libxt_comment.so libxt_length.so libxt_SECMARK.so libxt_udp.so
libipt_ECN.so libxt_connbytes.so libxt_limit.so libxt_set.so 其中以 libxt 开头的文件是 iptables 模块,而以 libip6t 开头的文件则是 ip6tables 模块;这些模块和 Netfilter 的模块一一对应。比如在 /lib/xtables 下有一个名为 libxt_state.so 的模块,那么在/lib/modules/2.6.43.2-6.fc15.i686.PAE/kernel/net/netfilter/ 目录下就有一个 xt_state.ko 模块。也就是说,当我们下达和 xt_state.ko 相关的命令语法时,iptables 工具就会根据 libxt_state.so 模块中的指示去检查语法是否正确,然后就将 Netfilter 的 xt_state.ko 载入到系统内存。可以做下面的实验来说明:
1. 一开始我们并没有写入任何的防火墙规则,因此此时也不会有任何上述模块插入内核,因此有:命令输出为空。
2. 执行下面的防火墙规则添加命令:# iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
3. 然后再执行步骤 1 中的命令:# lsmod |grep "state"
xt_state 942 1 由上可见,xt_state.ko 模块已经被插入到内核中,写入到内存里。 |