netfilter框架和iptables

转载自:http://blog.chinaunix.net/uid-23069658-id-3160506.html

http://blog.chinaunix.net/uid-23069658-id-3243434.html

https://blog.csdn.net/jasonchen_gbd/article/details/44873089

https://blog.csdn.net/fangxin205/article/details/54972153

1.网络通信的基本模型

netfilter框架和iptables

  数据在协议栈的发送过程中,发送方从上至下依次是“加头”的过程,每到达一层数据就被会加上该层的头部;与此同时,接受方就是个“剥头”的过程,从网卡收上包来之后,在往协议栈的上层传递过程中依次剥去每层的头部,最终到达用户那儿的就是裸数据了

2.Netfilter概念

1)Netfilter 是Linux内核中在网络层进行控制和修改网络数据包的实现框架,常用来数据包过滤、地址转换(NAT)、连接跟踪等

2)Netfilter 定义了一系列hook点,每个hook点上可以挂载多个hook函数,hook函数中可以实现对数据包内容修改、过滤数据包等功能

3)所有的hook点都放在一个全局的二维数组,第一维为协议族编号,第二维为该协议族下的hook点个数

netfilter框架和iptables

  如IPv4协议(编号为2)下的5个hook点

PRE_ROUTING:     nf_hooks[2][0]

LOCAL_IN:           nf_hooks[2][1]

FORWARD:            nf_hooks[2][2]

LOCAL_OUT:         nf_hooks[2][3]

POST_ROUTING:  nf_hooks[2][4]

4)每个hook点上的hook函数会按照优先级顺序注册到一个链表中,注册的接口为nf_register_hook()

netfilter框架和iptables

5)hook函数返回值的说明:

NF_ACCEPT: 接受分组,使之穿过网络实现中剩余的协议层(或该hook点上后续的hook函数)。
NF_STOLEN:挂钩函数窃取了一个分组,并处理了该分组,此时,该分组已与内核无关,不必再调用其他挂钩,还必须取消其他协议层的处理。
NF_DROP::丢弃分组,其中的数据可以释放了。
NF_QUEUE:将分组置于一个等待队列上,以便其数据可以由用户空间代码处理。不会执行其他hook函数
NF_REPEAT:再次调用该hook函数。

6)一个数据包按顺序经过hook点,到达一个hook点后,会检查该hook点是否注册了用于处理数据包的hook函数,如果有,则挨个去调用链表上的hook函数,根据返回到Netfilter框架中的值来进一步决定该如何处理该数据包

3.Netfilter在内核中的位置

netfilter框架和iptables

4.IPv4下的五个hook点

netfilter框架和iptables

  数据报从进入系统,进行IP校验以后,首先经过第一个HOOK点NF_IP_PRE_ROUTING进行处理;然后就进入路由代码,其决定该数据报是需要转发还是发给本机的;若该数据报是发被本机的,则该数据经过HOOK点NF_IP_LOCAL_IN处理以后然后传递给上层协议;若该数据报应该被转发则它被NF_IP_FORWARD处理;经过转发的数据报经过最后一个HOOK函数NF_IP_POST_ROUTING处理以后,再传输到网络上。本地产生的数据包经过HOOK点NF_IP_LOCAL_OUT 处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理后发送出去。

简单的说:

1)对于发往本地的数据包,会依次经过NF_INET_PRE_ROUTING和NF_INET_LOCAL_IN两个hook点的处理

2)对于本地向外发出去的数据包,会依次经过NF_INET_LOCAL_OUT和NF_INET_POST_ROUTING两个hook点的处理

3)对于通过本机转发的数据包,会依次经过F_INET_PRE_ROUTING、NF_INET_FORWARD和NF_INET_POST_ROUTING三个hook点的处理

5.iptables命令

1)iptables的主要功能是实现系统对网络数据包的进出和转发

2)iptables用5张不同的表来存放iptables规则:

  filter表:对数据包进行过滤

  nat表:对数据包进行地址转换

  mangle表:主要用来修改数据包

  raw表:高级功能,如:设置raw时一般是为了不再让iptables做数据包的跟踪连接处理,提高性能https://blog.csdn.net/qk1992919/article/details/51149043

  security表:centos系统中有,用于实现强制访问控制安全模型

4个表的优先级由高到低的顺序:raw-->mangle-->nat-->filter

3)iptables有5条规则链(5个hook点):

  INPUT链:处理输入数据包

  OUTPUT链:处理输出数据包

  FORWARD链:处理转发数据包

  PREROUTING链:用于目的地址转换(DNAT)

  POSTOUTING链:用于源地址转换(SNAT)

PREROUTING链上即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理,其余链也是如此

4)iptables规则的动作包括:

  ACCEPT:接收数据包

  DROP:丢弃数据包

  SNAT:源地址转换

  DNAT:目的地址转换

  MASQUERADE:ip地址伪装,算是SNAT中的一种特例,有着和SNAT相近的效果,可以实现自动化的SNAT

  REDIRECT:重定向、映射、透明代理

  LOG:日志记录

5)下图是IPv4协议中iptables在每个hook点上默认注册好注册的hook函数,这些hook函数会去遍历这些表中的iptables规则,并根据这些规则去处理数据包:

netfilter框架和iptables

6)下图这些默认注册好的hook函数对应的iptables表:

netfilter框架和iptables

7)iptables指令参数:

. --proto -p proto protocol: by number or name, eg. `tcp'
. --source -s address[/mask][...]. Source specification
. --destination -d address[/mask][...]. Destination specification
. --in-interface -i input name[+]. Network interface name ([+] for wildcard)
. --jump -j target. Target for rule (may load target extension)
. --goto -g chain. Jump to chain with no return
. --match -m match extended match (may load extension)
. --numeric -n numeric output of addresses and ports
. --out-interface -o output name[+]network interface name ([+] for wildcard)
. --table -t table table to manipulate (default: `filter')
. --verbose -v verbose mode
. --line-numbers print line numbers when listing
. --exact -x expand numbers (display exact values)
. --fragment -f match second or further fragments only
. --modprobe= try to insert modules using this command
. --set-counters PKTS BYTES set the counter during insert/append
. --version -V print package version.

8)指令举例:

//在filter表的INPUT链上添加一条规则:将源地址为192.168.100.122的icmp请求包丢弃(禁止别人ping我)
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -s 192.168.100.122 -j DROP
//在filter表的INPUT链上删除这条规则
iptables -t filter -D INPUT -p icmp --icmp-type echo-request -s 192.168.100.122 -j DROP
//在filter表的OUTPUT链上添加一条规则:将目的地址为114.114.114.114的icmp请求包丢弃(禁止我ping别人)
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request -d 114.114.114.114 -j DROP
//在filter表的INPUT链上删除这条规则
iptables -t filter -D OUTPUT -p icmp --icmp-type echo-request -d 114.114.114.114 -j DROP
//在filter表的FORWARD链上添加一条规则:将源地址为192.168.100.100的数据包丢弃不转发
iptables -t filter -A FORWARD -s 192.168.100.100 -j DROP

6.iptables命令中的SNAT、DNAT和MASQUERADE

6.1SNAT

1)SNAT(source network address translation),即源地址转换。举例来说,多个用户连接路由器上网,每个用户都配置了内网IP,用户访问外网时,用户将数据包发给路由器,路由器将数据包的报头中的源地址(用户的内网ip)替换成路由器的ip,再将数据包转发给下一跳;下一跳收到数据包时,查看数据包的源地址将是路由器的ip地址,而不是用户的ip地址

2)指令举例:

//把所有10.8.0.0网段的数据包的源地址改成192.168.5.3,再由eth0口发出
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
////把所有10.8.0.0网段的数据包的源地址改成192.168.5.3或192.168.5.4或192.168.5.5,再由eth0口发出
iptables -t nat -A POSTROUTING -s -192.168.5.5

6.2DNAT

1)DNAT(destination network address translation),即目的地址转换。举例来说,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,用户使用公网ip来访问这个网站,当访问的时候,用户发出一个数据包,这个数据包的目的地址是公网ip,所以这个数据包会发送到防火墙,防火墙收到数据包会把数据包的报头里的目的地址改成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上

2)指令举例:

//更改所有从eth0口进来的源地址为192.168.1.0/24的数据包的目的地址为1.2.3.4
iptables -t nat -A PREROUTING -s  -i eth0 -j DNAT --to 1.2.3.4

6.3MASQUERADE

1)MASQUERADE,ip地址伪装,算是SNAT中的一种特例,有着和SNAT相近的效果,可以实现自动化的SNAT

2)使用SNAT的时候,出口的ip地址可以是一个,也可以是一个范围,但是不管是几个,都必须明确的写出出口的ip;当系统采用动态拨号方式上网时,出口的ip时常发生变化,这个时候就使用MASQUERADE,自动地获取当前出口的ip来做nat

3)指令举例:

//把所有10.8.0.0网段的数据包的源地址动态地改成出口的ip
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
上一篇:imx6 system boot


下一篇:玩转Slot Machine