您的位置:首页 > 运维架构 > Linux

iptables 详解(NAT)

2017-10-24 16:36 465 查看
前提基础:

当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。

iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。

iptables中定义有5条链,说白了就是上面说的5个钩子函数,因为每个钩子函数中可以定义多条规则,每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包

iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw-->mangle-->nat-->filter

一条链上可定义不同功能的规则,检查数据包时将根据上面的优先级顺序检查



(图片来源网络)

小结一下~~~



数据包先经过PREOUTING,由该链确定数据包的走向:

    1、目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;

    2、若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥

主机发送数据包时,流程则是⑤--->⑥

iptables安装配置

linux一般默认都已经安装iptables,只需要开启服务即可

iptables规则书写

基本语法:iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作]
说明支持的链
raw一般是为了不再让iptables对数据包进行跟踪,提高性能PREROUTING、OUTPUT
mangle对数据包进行修改五个链都可以
nat进行地址转换PREROUTING、OUTPUT、POSTROUTING
filter(默认)对包进行过滤INPUT、FORWARD、OUTPUT
常用操作命令

说明
-A在指定链尾部添加规则
-D删除匹配的规则
-R替换匹配的规则
-I在指定位置插入规则

例:iptables -I INPUT 1 --dport 80 -j ACCEPT

(将规则插入到filter表INPUT链中的第一位上)

-L/S列出指定链或所有链的规则
-F删除指定链或所有链的规则

-N创建用户自定义链

例:iptables -N allowed

-X删除指定的用户自定义链

-P为指定链设置默认规则策略,对自定义链不起作



例:iptables -P OUTPUT DROP

-Z将指定链或所有链的计数器清零
-E更改自定义链的名称

例:iptables -E allowed disallowed

-nip地址和端口号以数字方式显示

例:iptables -Ln

常见规则匹配器说明
-p tcp|udp|icmp|all匹配协议,all会匹配所有协议
-s addr[/mask]匹配源地址
-d addr[/mask]匹配目标地址
--sport port1[:port2]匹配源端口(可指定连续的端口)
--dport port1[:port2]匹配目的端口(可指定连续的端口)
-o interface匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT。

例:iptables -A FORWARD -o eth0

-i interface匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。

--icmp-type 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型)
--tcp-flags mask comp匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。

例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT

(表示匹配SYN和ACK标记的数据包)

目标动作说明
ACCEPT允许数据包通过
DROP丢弃数据包
REJECT丢弃数据包,并且将拒绝信息发送给发送方
SNAT源地址转换(在nat表上)

例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 

DNAT目标地址转换(在nat表上)

例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102

REDIRECT目标端口转换(在nat表上)

例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80

MARK将数据包打上标记

例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60

注意要点:

    1、目标地址转换一般在PREROUTING链上操作

    2、源地址转换一般在POSTROUTING链上操作

 

保存和恢复iptables规则

    使用iptables-save可以保存到特定文件中

    使用iptables-restore可以恢复规则

iptables的进阶使用

   1、limit限制流量:

        -m limit --limit-burst 15        #设置一开始匹配的最���数据包数量

        -m limit --limit 1000/s            #设置最大平均匹配速率

        -m limit --limit 5/m --limit-burst 15     #表示一开始能匹配的数据包数量为15个,每匹配到一个,   

                                                                    limit-burst的值减1,所以匹配到15个时,该值为0,以后每过   

                                                                    12s,limit-burst的值会加1,表示又能匹配1个数据包

例子:

    注意要点:

        1、--limit-burst的值要比--limit的大

        2、limit本身没有丢弃数据包的功能,因此,需要第二条规则一起才能实现限速的功能

    2、time :在特定时间内匹配
-m time 说明
--monthdays day1[,day2]在每个月的特定天匹配
--timestart hh:mm:ss在每天的指定时间开始匹配
--timestop hh:mm:ss在每天的指定时间停止匹配
--weekdays day1[,day2]在每个星期的指定工作日匹配,值可以是1-7
例子:

    3、ttl:匹配符合规则的ttl值的数据包
参数说明
--ttl-eq 100匹配TTL值为100的数据包
--ttl-gt 100匹配TTL值大于100的数据包
--ttl-lt 100匹配TTL值小于100的数据包
例子:

    4、multiport:匹配离散的多个端口
参数说明
--sports port1[,port2,port3]匹配源端口
--dports port1[,port2,port3]匹配目的端口
--ports port1[,port2,port3]匹配源端口或目的端口
例子:

   

    5、state:匹配指定的状态数据包
参数说明
--state valuevalue可以为NEW、RELATED(有关联的)、ESTABLISHED、INVALID(未知连接)
例子:

    6、mark:匹配带有指定mark值的数据包
参数说明
--mark value匹配mark标记为value的数据包
例子:

    7、mac:匹配特定的mac地址

例子:


iptables实现nat

在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项:  

1. 对规则的操作  加入(append) 一个新规则到一个链 (-A)的最后。  在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。  在链内某个位置替换(replace) 一条规则 (-R)。  在链内某个位置删除(delete) 一条规则 (-D)。  删除(delete) 链内第一条规则 (-D)。  

2.指定源地址和目的地址  通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址:  a. 使用完整的域名,如“www.linuxaid.com.cn”;  b.
使用ip地址,如“192.168.1.1”;  c. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;  d. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是 UNIX环境中通常使用的表示方法。  缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。  

3. 指定网络接口  可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。  

4.指定协议及端口  可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。

iptables -t nat -vnL是什么命令?
用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号
iptables -L
粗略列出 filter 表所有链及所有规则
iptables -t nat -vxnL PREROUTING
用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解
 


 http://www.cnblogs.com/hyzhou/archive/2011/11/26/2264343.html

 

一、打开内核的路由功能。

   要实现nat,要将文件/proc/sys/net/ipv4/ip_forward内的值改为1,(默认是0)。

二、nat不同动作的配置

 1)MASQUERADE:是动态分配ip时用的IP伪装:在nat表的POSTROUTING链加入一条规则:所有从ppp0口送出的包会被伪装(MASQUERADE)

 
 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
 

   要想系统启动时自动实现nat,在/etc/rc.d/rc.local文件的末尾添加

   #echo "1">/proc/sys/net/ipv4/ip_forward

   #/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

 2) SNAT:一般正常共享上网都用的这个。

 所有从eth0(外网卡)出来的数据包的源地址改成61.99.28.1(这里指定了一个网段,一般可以不指定)
 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 61.99.28.1
 

3)DNAT:目的nat 做智能DNS时会用到

 智能DNS:就是客户端在dns项里无论输入任何ip,都会给他定向到服务器指定的一个dnsip上去。

 在路由之前所有从eth0(内网卡)进入的目的端口为53的数据包,都发送到1.2.3.4这台服务器解析。

 

 iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 1.2.3.4:53

 iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to-destination 1.2.3.4:53
4)REDIRECT:重定向,这个在squid透明代理时肯定要用到它

 所有从eth1进入的请求80和82端口的数据,被转发到80端口,由squid处理。
 iptables -t nat -A PREROUTING - -i eth1 -p tcp -m multiport --dports 80,82 -j REDIRECT --to-ports 80
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux iptable nat