标题:Linux iptable与netfilter


在Linux防火墙的设计中,iptables负责为防火墙过滤框架下发过滤规则,而netfilter负责在各个点上对包进行拦截和过滤。

Iptables 是用来设置、维护和检查Linux内核的IP包过滤规则的。iptables 组件是一种命令工具,运行在用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

 

iptables定义规则的方式比较复杂:

 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

 -t table 3filter nat mangle

 COMMAND-A(追加),R(替换),D(删除),P(设置默认规则),F(清空)

 chain

filter:INPUT FORWARD OUTPUT

nat:PREROUTING OUTPUT POSTROUTING

mangle:PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

 CRETIRIA:-s源地址,-d目标地址,-p协议,--sport源端口,--dport目标端口

 -j ACTION :指定如何进行处理,DROP,REJECT,ACCEPT

 

 比如:不允许172.16.0.0/24的进行访问。

 iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

 当然你如果想拒绝的更彻底:

 iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

 

iptables -L -n -v #查看定义规则的详细信息

 

sudo iptables -A OUTPUT -p tcp --dport 80 -j DROP 禁止访问80端口

sudo iptables -L -n -v --line-numbers

sudo iptables -D OUTPUT 1

 

Netfilter

如下图所示:iptables与netfilter的关系。iptables下发包过滤规则,netfilter拦截到包后,结合规则对包进行过滤,比如拦截,放行,阻止等。

当一个网络数据包进入主机后,必然会经过如下图的5个点:prerouting,input,output,forward,postrouting。因此,netfilter将在这5个位置注册HOOK函数,来拦截(filter,mangle,nat)对应的数据包,其中filter是对包中的IP地址和端口进行过滤,mangle是修改包中的数据,而nat是地址转换。

五个钩子函数(hook functions,也叫五个规则链。

1.PREROUTING (路由前)

2.INPUT (数据包流入口)

3.FORWARD (转发管卡)

4.OUTPUT(数据包出口)

5.POSTROUTING(路由后)

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

 


下面的例子,演示了注册一个在prerouting位置丢弃所有数据包的netfilter HOOK。

struct nf_hook_ops {

      struct list_head list;

      /* 此下的值由用户填充 */

      nf_hookfn *hook;

      int pf;//协议

      int hooknum;//hook

      /* Hook以升序的优先级排序 */

     int priority;

};

unsigned int hook_func(

                       unsigned int hooknum,
                       struct sk_buff *skb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *))
{
    return NF_DROP;  /*
丢弃所有的数据包 */
        

}

struct nf_hook_ops   nfho;

/* 填充我们的hook数据结构 */
nfho.hook = hook_func;  /*
处理函数 */
nfho.hooknum  = NF_INET_PRE_ROUTING;    /*
使用IPv4的第一个hook */
nfho.pf       = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;       /*
让我们的函数首先执行 */

nf_register_hook(&nfho);  

//nf_unregister_hook(&nfho);



看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注