曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5230|回复: 0
打印 上一主题 下一主题

Netfilter 简介, Netfilter 与 iptables 的关系

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-5-12 20:55:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一般来说,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. 一开始我们并没有写入任何的防火墙规则,因此此时也不会有任何上述模块插入内核,因此有:
# lsmod |grep "state"
命令输出为空。

2. 执行下面的防火墙规则添加命令:
# iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT

3. 然后再执行步骤 1 中的命令:
# lsmod |grep "state"
xt_state                 942  1
由上可见,xt_state.ko 模块已经被插入到内核中,写入到内存里。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-7 01:01 , Processed in 0.080252 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表