linux之iptable

转自:http://seanlook.com/2014/02/23/iptables-understand/

一、 netfilter与iptables

  Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。

  Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)
  • 数据包内容修改
  • 数据包过滤的防火墙功能

  Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

  • INPUT当接收到防火墙本机地址的数据包(入站)时
  • OUTPUT当防火墙本机向外发送数据包(出站)时
  • FORWARD当接收到需要通过防火墙发送给其他地址的数据包(转发)时
  • PRE_ROUTING在对数据包作路由选择之前,应用此链中的规则
  • POST_ROUTING在对数据包作路由选择之后,应用此链中的规则
  •           

  Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。

        

二、filter、nat、mangle等规则表

  table有 filter、nat、mangle等规则表;

  filter表

    主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:

  • INPUT链:INPUT针对那些目的地是本地的包
  • FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的
  • OUTPUT链:OUTPUT是用来过滤所有本地生成的包

  nat表

    主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过

  这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链

  • PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址
  • OUTPUT链:改变本地产生的包的目的地址
  • POSTROUTING链:在包就要离开防火墙之前改变其源地址

  mangle表

    主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等

  应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

  raw表

    是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING

  iptables中数据包和4种被跟踪连接的4种不同状态:

  • NEW:该包想要开始一个连接(重新连接或将连接重定向)
  • RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的。
  • ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
  • INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。

三、INPUT、FORWARD等规则链和规则

  在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:

  • INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
  • OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  • FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
  • PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
  • POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。
 1 -->PREROUTING-->[ROUTE]-->FORWARD-->POSTROUTING-->
 2      mangle        |       mangle        ^ mangle
 3       nat          |       filter        |  nat
 4                    |                     |
 5                    |                     |
 6                    v                     |
 7                  INPUT                 OUTPUT
 8                    | mangle              ^ mangle
 9                    | filter              |  nat
10                    v ------>local------->| filter

  其中中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

  防火墙处理数据包的方式(规则): 

  • ACCEPT允许数据包通过
  • DROP直接丢弃数据包,不给任何回应信息
  • REJECT拒绝数据包通过,必要时会给数据发送端一个响应的信息。
  • SNAT源地址转换。在进入路由层面的route之前,重新改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
  • DNAT:目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。
  • REDIRECT是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
  • LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键

四、Linux数据包路由原理

  理解了Netfilter和Iptables的架构和作用,并且学习了控制Netfilter行为的Xtables表的结构,那么这个Xtables表是怎么在内核协议栈的数据包路由中起作用的呢?

  工作流程:网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。

  如图:

      

  从上图中,我们可以总结出以下规律:

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表"判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
  • 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它
  • 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
  • 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)

  在写iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵活配置规则

五、iptables编写规则

  命令格式:

      

  • [-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
  • -A:新增一条规则,到该规则链列表的最后一行
  • -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
  • -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
  • -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
  • -P:设置某条规则链的默认动作
  • -nL-L-n,查看当前运行的防火墙规则列表
  • chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
  • [规则编号]:插入、删除、替换规则时用,--line-numbers显示号码
  • [-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
  • [-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等
  • [-s 源IP地址]:源主机的IP地址或子网地址
  • [--sport 源端口号]:数据包的IP的源端口号
  • [-d目标IP地址]:目标主机的IP地址或子网地址
  • [--dport目标端口号]:数据包的IP的目标端口号
  • -m:extend matches,这个选项用于提供更多的匹配参数,如:
    • -m state --state ESTABLISHED,RELATED
    • -m tcp --dport 22
    • -m multiport --dports 80,8080
    • -m icmp --icmp-type 8
  • <-j 动作>:处理数据包的动作,包括ACCEPT、DROP、REJECT等

  

时间: 2024-08-28 10:46:18

linux之iptable的相关文章

Linux中Iptable防火墙规则的应用

在没有硬件防火墙的前提下,Linux系统也提供了很完善的防火墙策略Iptable,同样能胜任防火墙的策略,但由于规则负责的原因很少被使用.我总结一下iptable的使用方法. 通常防火墙策略配置文件所在的路径为/etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Wed Apr  8 13:50:49 2015 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT

Linux 关闭iptable防火墙

做为初学者使用Linux时都会关闭自带的防火墙. 下面是操作过程以Centos6.5为例: [[email protected] ~]# /etc/init.d/iptables stop         //关闭 iptables: Setting chains to policy ACCEPT: filter          [  OK  ] iptables: Flushing firewall rules:                         [  OK  ] iptabl

linux之iptable案例

转自:http://blog.csdn.net/bill_lee_sh_cn/article/details/4401896 1.一对一流量完全DNAT 首先说一下网络环境,普通主机一台做防火墙用,网卡两块 eth0 192.168.0.1  内网 eth1 202.202.202.1 外网 内网中一台主机 192.168.0.101 现在要把外网访问202.202.202.1的所有流量映射到192.168.0.101上 命令如下: [xhtml] view plaincopy #将防火墙改为转

Linux防火墙:iptables禁IP与解封IP常用命令

在Linux下,使用ipteables来维护IP规则表.要封停或者是解封IP,其实就是在IP规则表中对入站部分的规则进行添加操作. 要封停一个IP,使用下面这条命令: iptables -I INPUT -s ***.***.***.*** -j DROP 要解封一个IP,使用下面这条命令: iptables -D INPUT -s ***.***.***.*** -j DROP 参数-I是表示Insert(添加),-D表示Delete(删除).后面跟的是规则,INPUT表示入站,***.***

Linux服务器中怎么设置一个端口只能一个IP访问

Linux防火墙Iptable如何设置只允许某个ip访问80端口,只允许特定ip访问某端口?参考下面命令,只允许46.166.150.22访问本机的80端口.如果要设置其他ip或端口,改改即可.iptables -I INPUT -p TCP --dport 80 -j DROPiptables -I INPUT -s 46.166.150.22 -p TCP --dport 80 -j ACCEPT在root用户下执行上面2行命令后,重启iptables, service iptables r

openstack东西流量走向

很多网友问我openstack虚拟机之间通讯是怎么走的下面我大致介绍下虚拟机和虚拟机之间是如何通讯的首先虚拟机和虚拟机通讯分为两种 1相同组租户的的虚拟机位于不同宿主机之间的通讯 2相同组租户的的虚拟机位于同一个宿主机之间的通讯 3不同租户之间的虚拟机之间的通讯 下面我们来简单的介绍下第一种是怎么通讯的 我们先看图只看vlan network就好当vm1向vm2发送packet时首先会经过qbr桥这个桥有两个端口分别是tap和qvb.这个桥是利用linux的iptable防火墙做策略做一些安全规

iptables 封ip

要封停一个IP,使用下面这条命令: iptables -I INPUT -s ***.***.***.*** -j DROP 要解封一个IP,使用下面这条命令: iptables -D INPUT -s ***.***.***.*** -j DROP 参数-I是表示Insert(添加),-D表示Delete(删除).后面跟的是规则,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放弃连接. 此外,还可以使用下面的命令来查看当前的IP规则表: iptables -l

Centos6.5安装jdk和Tomcat

系统及软件: Centos6.5 jdk-7u60-linux-x64.gz apache-tomcat-7.0.69.tar.gz 安装前最好把防火墙和SELinux关掉,不关掉会影响访问. Linux 关闭iptable防火墙 http://zhaodongwei.blog.51cto.com/4233742/1762526 关闭SELinux http://zhaodongwei.blog.51cto.com/4233742/1745837 上传软件和安装jdk和tomcat: [[ema

tomcat7+jdk7

https://tomcat.apache.org/whichversion.html http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 下载对应的tomcat 及 jdk 版本 一.安装环境 Centos6.5 jdk-7u80-linux-x64.tar.gz apache-tomcat-7.0.69.tar.gz ------------------------------