iptables原理与命令简析

来源:互联网 发布:qq举报软件 编辑:程序博客网 时间:2024/06/04 01:13

首先,需要理解iptables,否则看着网上的各种案例,死记硬背,来个新的需求还是不会。

参考:
Linux数据包路由原理、Iptables/netfilter入门学习 - .Little Hann
超级详细的iptables介绍

一、iptables原理

1.挂载点

       iptables是Netfilter的应用层表现,用于在应用层为Netfilter的配置表XTables配置各种规则。Netfilter提供了5个挂载点(HOOK点,类似回调函数,注册后数据包经过时会调用,让我们有机会操作或修改数据包)。这5个挂载点是:

  • PRE_ROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POST_ROUTING

这些点的作用位置,对应数据包流向图来理解有奇效,下面是一张盗图:
这里写图片描述
这张图其实主要描述了一台主机所接收数据包的3种场景:

1 以本主机为目标的包,会经过INPUT;
2 本主机发出的包,会经过OUTPUT;
3 本主机转发的包,会经过FORWARD;

另外,所有包都会经过PREROUTING和POSTROUTING两个挂载点

注意所有的数据包都会走完整上图的某一条路径。

2.表与链

看完数据包行走,仔细看上图还会有疑问,一共只有5个挂载点,但上图经过的点可不只5个。这是因为netfilter将挂载点按作用细分成了几个表:

  • FILTER表,这个表就是用来过滤的,可以放心的放行ACCEPT、丢弃DROP、拒绝REJECT等等,图中可以看到这个表分了3个链,位于不同的位置,以便可以过滤所有的包,分别是INPUT/OUTPUT/FORWARD,对应不同目的的数据包,所以可以自由配置是过滤本机发出的还是本机接收的,还是本机转发的包;
  • MANGLE表,这个很少用到,不讨论;
  • NAT表,这个表是用来作地址转换的(Network Address Translation),这个表也是有三个链,分别是PREROUTING/OUTPUT/POSTROUTING,而按功能则分为SNAT与DNAT,分别表示修改源地址与目标地址,其中PREROUTING/OUTPUT只能用于DNAT(修改目标地址),而POSTROUTING只能用于SNAT(修改源地址),原因与这两个链所处的位置有关,做DNAT修改目的地址,必须在路由这个操作之前,否则岂不是需要重新路由。至于SNAT,默默接受这个限制吧

好了,我们现在了解了数据包流程图,知道了表(TABLE),知道了链(CHAIN),知道了可以在哪里做什么,然后就需要知道怎么做了。

二、iptables命令:

其实iptables的命令很简单,有了上面的知识积累,很容易明白相关命令的作用,一个iptables的典型调用如下:
iptables -A INPUT -p tcp --dport 80 -j DROP
翻译一下就是:
iptables啊,帮我在INPUT链上添加一个命令(-A),对于TCP协议(-p tcp),目标端口是80(--dport 80)的数据包,都丢弃掉(-j DROP)

抽象一下就是:
在哪里,对谁,做什么事

1.在哪里:

       就是在哪个表,哪个链,默认不指定的话使用FILTER表,要指定的话使用-t,如-t nat 表示使用NAT表,然后后面的命令用来指定插入-I、添加-A、删除-D、替换-R等操作,再后面跟的INPUT就是链了,是不是很简单

2.对谁(Matches):

       就是用来挑选出需要操作的数据包,iptables提供了丰富的参数来使用(iptables最麻烦的就在这里):

1 通用匹配,与协议或扩展无关,可以直接使用

  • -p,−−procotol 指定协议,如tcp/udp/icmp,需要是/etc/protocols中有的协议,可指定多个协议,用逗号隔开,如-p tcp,udp,可以取反,如-p ! tcp,注意空格,表示udp或icmp协议
  • -s,−−src,−−source 指定源地址,可以是单个ip地址,也可以是网络,如192.168.1.0/24,也可以取反,地址前加!tcp,注意空格
  • -d,−−dst,−−destination 指定目标地址,配置同-s
  • -i,−−in-interface 指定来源网络接口,如-i eth0,可指定所有接口-i any,也可以取反
  • -o,−−out-interface 指定包离开的网络接口,同-i

2 隐式匹配,在装载协议时会自动装载,不需要使用-m显示指定

  • −−sport,−−source-port 指定来源端口,需要tcp或udp协议才可使用,可以是单个端口,可以是连续端口如−−sport 22:80,可以取反,但不支持不连续的端口
  • −−dport,−−destination-port 指定目标端口,配置同−−sport

3 显示匹配,显示匹配需要使用-m或−−match装载,比如匹配状态需要使用-m state,这里有许多类型的匹配,有些只是为了说明iptables的能力,只提几个常用的匹配

  • -m multiport 多端口匹配,可以添加不连续的端口,如-m multiport −−source-port 22,53,80,指定源端口,也可以−−destination-port指定目标端口,需要tcp或udp才可使用
  • -m state 状态匹配,这里的状态不是TCP协议中的连接状态,与协议无关,iptables简化了状态这个概念,主要有下面4个状态
    • NEW 收到的第一个包就是NEW
    • ESTABLISHED 只要本机应答了一个包,连接就由NEW状态变为ESTABLISHED
    • RELATED 与一个ESTABLISHED相关的包,如FTP会建立两个连接,一个用于控制,一个用于数据
    • INVALID 未知的包,一般全部DROP

3.做什么事(Targets)

       对挑选出来的数据包做什么操作,使用-j参数(jump)指定,后续要跳到的target,操作主要由表来决定,列举如下:

FILTER表:

  • -j ACCEPT 放行数据包
  • -j DROP 丢弃数据包
  • -j REJECT −−reject-with tcp-reset 拒绝数据包,和DROP功能基本一样,不过还会返回来源一个错误信息,可用的信息类型有:1、icmp-net-unreachable 2、icmp-host-unreachable 3、 icmp-port-unreachable 4、icmp-proto-unreachable 5、icmp-net-prohibited 6、icmp-host-prohibited 。其中缺省的是port-unreachable。

NAT表:

  • -j SNAT −−to-source 172.16.1.100:80 来源地址转换,只能用于POSTROUTING链,可以指定一段IP,如172.16.1.20-172.16.1.40,如果是tcp或udp,还可指定端口,同样可以是端口范围
  • -j DNAT −−to-destination 192.168.1.100:80 目标地址转换,只能用于PREROUTING链(用于修改转发的包)或OUTPUT链(用于修改本地发出的包),使用方法与SNAT一样
  • -j MASQUERADE 效果与SNAT一样,修改源地址,不过会自动修改为出口网卡的ip地址,使用起来更加方便,适合ADSL这种经常换ip的主机使用

三、总结

       如上就是iptables的原理和命令简析,后面会再拿iptables的经常配置的案例来详细说明一下配置时要考虑的事情。生产的配置例子可以参考前面的文章配置一个生产的iptables防火墙规则

0 0