iptables入门篇

一、 iptables简介
1.1 什么是iptables?
iptables是Linux防火墙工作在用户空间的管理工具,是netfilter/iptables IP 信息包过滤系统是一部分,用来设置、维护和检查Linux内核的IP数据包过滤规则。
1.2主要特点
1)列出数据包过滤器规则集的内容
2)添加/删除/修改数据包过滤器规则集中的规则
3)列出/清零数据包过滤器规则集的每个规则计数器

二、 基本概念
iptables 可以检测、修改、转发、重定向和丢弃 IP 数据包。其代码已经内置于内核中,并且按照不同的目的被组织成表(table)的集合。表由一组预先定义的链(chain)组成,链包含遍历顺序规则。每一条规则包含条件匹配和相应的动作(称为目标),如果条件匹配为真,该动作会被执行。
下图简要描述了网络数据包通过iptables的过程(只包含filter和nat表):

图中在上面的小写字母代表表,在下面的大写字母代表链。从任何网络端口进来的每一个 IP 数据包都要从上到下的穿过这张图。一种常见的困扰是认为 iptables 对从内部端口进入的数据包和从面向互联网端口进入的数据包采取不同的处理方式,相反,iptabales 对从任何端口进入的数据包都会采取相同的处理方式。可以定义规则使 iptables 采取不同的方式对待从不同端口进入的数据包。当然一些数据包是用于本地进程的,因此在图中表现为从顶端进入,到 <Local Process> 停止,而另一些数据包是由本地进程生成的,因此在图中表现为从 <Local Process> 发出,一直向下穿过该流程图。关于该流程图如何工作的详细解释请参考《Iptables Tutorial》。
防火墙策略一般分为两种,一种叫通策略,一种叫堵策略。通策略,默认门是关着的,必须要定义谁能进。堵策略,门是打开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。

2.1表(tables)
iptables包含5张表(优先级为:security > raw > mangle > nat > filter):

  1. filter表:用于存放所有有防火墙相关操作的默认表。
  2. nat表:用于网络地址转换(例如:DNAT和SNAT)
  3. mangle表:用于对特定数据包的修改
  4. raw表:用于配置数据包,raw中的数据包不会被系统跟踪。
  5. security表:用于强制访问控制网络规则(例如:selinux—详情可参考https://lwn.net/Articles/267140/),该表是后来加上的。
    在大多数情况下仅需要使用filter和nat,不会用到raw,mangle和security表,这三张表用于更复杂的情况——包括多路由和路由判定。
    2.2 链(chains)
    表由链组成,链是一些按顺序排列的规则的列表。Iptables一共包含5条链:
  6. INPUT链:用于处理进入本机的数据包
  7. OUTPUT链:用于处理从本机输出的数据包
  8. FORWARD链:用于转发数据包
  9. PREROUTING链:用于在路由决策前对数据包做相关操作,经常用来做DNAT
  10. POSTROUTING链:用于在路由决策后对数据包做相关操作,经常用来做SNAT
    默认的filter表包含INPUT、OUTPUT和FORWARD 3条内建的链,这3条链作用于数据包过滤过程中的不同时间点,如下图所示。nat表包含PREROUTING、POSTROUTING和OUTPUT链。mangle表包含PERROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD链。raw表包含PREROUTING和OUTPUT链。
    默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。链的默认规则通常设置为 ACCEPT,如果想要确保任何包都不能通过规则集,那么可以重置为 DROP。默认的规则总是在一条链的最后生效,所以在默认规则生效前数据包需要通过所有存在的规则。用户可以加入自己定义的链,从而使规则集更有效并且易于修改。如何使用自定义链请参考《Simple stateful firewall》。
    默认的表、链结构示意图如下:

    2.3 规则(rules)
    数据包的过滤基于规则。规则由一个目标(数据包包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。一个规则的典型匹配事项是数据包进入的端口(例如:eth0 或者 eth1)、数据包的类型(ICMP、TCP或者 UDP)和数据包的目的端口。
    目标使用 -j 或者 --jump 选项指定。目标可以是用户定义的链(例如,如果条件匹配,跳转到之后的用户定义的链,继续处理)、一个内置的特定目标或者是一个目标扩展。内置目标是 ACCEPT, DROP, QUEUE 和 RETURN,目标扩展是 REJECT 和 LOG。如果目标是内置目标,数据包的命运会立刻被决定并且在当前表的数据包的处理过程会停止。如果目标是用户定义的链,并且数据包成功穿过第二条链,目标将移动到原始链中的下一个规则。目标扩展可以被终止(像内置目标一样)或者不终止(像用户定义链一样)。
    数据包通过防火墙的时候是按顺序匹配规则的,从上往下依次匹配,一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省的规则处理。
    2.4 遍历链(Traversing Chains)
    下面的流程图描述了在任何接口上收到的网络数据包是按照怎样的顺序穿过表的交通管制链。第一个路由策略包括决定数据包的目的地是本地主机(这种情况下,数据包穿过 INPUT 链),还是其他主机(数据包穿过 FORWARD 链);中间的路由策略包括决定给传出的数据包使用那个源地址、分配哪个接口;最后一个路由策略存在是因为先前的mangle与nat链可能会改变数据包的路由信息。数据包通过路径上的每一条链时,链中的每一条规则按顺序匹配;无论何时匹配了一条规则,相应的 target/jump 动作将会执行。最常用的3个target是 ACCEPT, DROP ,或者jump到用户自定义的链。内置的链有默认的策略,但是用户自定义的链没有默认的策略。在jump到的链中,若每一条规则都不能提供完全匹配,那么数据包像这张图片描述的一样返回到调用链。在任何时候,若 DROP target 的规则实现完全匹配,那么被匹配的数据包会被丢弃,不会进行进一步处理。如果一个数据包在链中被 ACCEPT,那么它也会被所有的父链 ACCEPT,并且不再遍历其他父链。然而,要注意的是,数据包还会以正常的方式继续遍历其他表中的其他链。

2.5 模块(modules)
有许多模块可以用来扩展 iptables,例如 connlimit, conntrack, limit 和 recent。这些模块增添了功能,可以进行更复杂的过滤。

三、 相关参数
3.1 语法
iptables(选项)(参数)
3.2 命令通用格式
iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
3.3 选项(options)
-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清除规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口;
3.4 目标(target)
ACCEPT:接收数据包;
DROP:丢弃数据包,不返回响应信息;
REDIRECT:重定向、映射、透明代理;
SNAT:源地址转换;
DNAT:目标地址转换;
MASQUERADE:IP伪装(NAT),用于ADSL;
LOG:日志记录;
MARK:做防火墙标记;
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息;
QUEUE: 防火墙将数据包移交到用户空间;
RETURN:防火墙停止执行当前链中的后续Rules,并返回到调用链;

四、 常见实例
4.1 查看iptables规则
iptables –nvL –t [filter|nat|mangle|raw] #默认查看filter表
4.2 清除iptables规则
iptables -F -t [filter|nat|mangle|raw] #默认清除filter表
4.3 清空规则链中的数据包计算器和字节计数器
iptables -Z -t [filter|nat|mangle|raw] #默认清除filter表
4.4 定义规则链中的默认目标(动作)
iptables -P INPUT DROP #定义filter表的INPUT链默认目标为DROP
iptables -P FORWARD ACCEPT #定义filter表的FORWARD链默认目标为ACCEPT
iptables -P OUTPUT ACCEPT #定义filter表的OUTPUT链默认目标为ACCEPT
4.5 开放IP/协议/port
iptables -A INPUT -s 192.168.1.2 -j ACCEPT #允许源192.168.1.2的数据包进入本机
iptables -A INPUT -p ospf -j ACCEPT #允许所有ospf协议数据包进入本机
iptables -A INPUT -p icmp -j ACCEPT #允许所有icmp协议数据包进入本机
iptables -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT #允许本地回环
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关的数据包通行
iptables -A FORWARD -i eth0 -m set ! --match-set white_list src -j DROP #拒绝从eth0网卡进入,并且IP不在white_list中的数据包通过
4.6 记录日志
iptables -A PREROUTING -s 172.16.0.0/16 -i eth0 -j LOG #所有从eth0网卡进入的源172.16.0.0/16的数据包记录在log日志中
4.7启动网络转发规则
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127 #让内网192.168.188.0/24使用公网IP 210.14.67.127上网
4.8 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
4.9 限速
iptables -I INPUT -p tcp -i eth0 -s 192.168.12.2 -m limit --limit=5000/s --limit-burst=100 -j ACCEPT
iptables -I INPUT -p tcp -i eth0 -s 192.168.12.2 -j DROP

本文仅整理了iptables的基本概念及入门知识,旨在帮助大家快速了解和使用iptables。关于更多iptables的扩展和实践部分将在后续篇章推出,未完待续…

参考文章:
https://en.wikipedia.org/wiki/Iptables
http://www.netfilter.org/projects/iptables/index.html
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html

原文地址:http://blog.51cto.com/ptallrights/2104513

时间: 2024-08-29 20:13:05

iptables入门篇的相关文章

《Java从入门到放弃》入门篇:springMVC数据校验

昨天我们扯完了数据传递,今天我们来聊聊数据校验的问题.来,跟着我一起读:计一噢叫,一按艳. 在springMVC中校验数据也非常简单,spring3.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架. Spring的DataBinder在进行数据绑定时,会同时调用校验框架完成数据校验工作. 具体使用步骤如下: 1)导入数据校验的JAR包 2)在springmvc的配置文件中添加校验Bean 3)修改实体类,在属性上加上校验的注解 4)修改昨天的login4方法,加上校验的相关代码

Vue学习笔记入门篇——组件的使用

本文为转载,原文:Vue学习笔记入门篇--组件的使用 组件定义 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 组件使用 注册 注册一个全局组件,你可以使用 Vue.component(tagName, options).组件在注册之后,便可以在父实例的模块中以自定义元素 的形式使用.

Vue学习笔记入门篇——组件的内容分发(slot)

本文为转载,原文:Vue学习笔记入门篇--组件的内容分发(slot) 介绍 为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 "transclusion" 如果你熟悉 Angular).Vue.js 实现了一个内容分发 API,使用特殊的 'slot' 元素作为原始内容的插槽. 编译作用域 在深入内容分发 API 之前,我们先明确内容在哪个作用域里编译.假定模板为: <child-component> {{ messa

漫游Kafka入门篇之简单介绍

原文地址:http://blog.csdn.net/honglei915/article/details/37564521 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以topic为单位进行归纳. 将向Kafka topic发布消息的程序成为producers. 将预订topics并消费消息的程序成为consumer. Kafka以集群的方式运行,

现代C++学习笔记之二入门篇2,数据转换

static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换,但是,编译器在无法分辨此类转换在运行时是否是安全的. dynamic_cast: dynamic_cast在运行时检查基类指针和派生类指针之间的强制转换. dynamic_cast 是比 static_cast 更安全的强制类型转换,但运行时检查会带来一些开销. const_cast:    con

软件测试系列之入门篇

一.你知道软件测试有多重要吗? 在国际上,软件测试(软件质量控制)是一件非常重要的工程工作,测试也作为一个非常独立的职业.在IBM.Microsoft等开发大型系统软件公司,很多重要项目的开发测试人员的比例能够达到1:2甚至1:4. 在国内软件测试的地位还不够高,并且大多只停留在软件单元测试.集成测试和功能测试上.软件测试从业人员的数量同实际需求有不小差距,国内软件企业中开发人员与测试人员数量一般为5:1,因此,国内的软件测试产业化还有待开发和深掘. 说到这里不知道你反应是高兴还是失望?但是我却

hacker入门篇——相关书籍

1.<黑客大曝光:网络安全机密与解决方案(第7版)> 简介:这是一本老外写的书,比较适合入门看,内容包括一些基本的攻防流程,基本工具软件,网络安全的一些基本概念等,对整个网络安全和黑客入侵都有比较全面的介绍.对Windows和Unix系统做了分别得介绍,新版(第7版)还对现今新兴技术无线网.移动设备等方面的安全知识做了介绍.虽然关于具体细节的介绍比较少,但通过这本书可以让初学小白们对黑客有一个全面完整的认识.推荐作为第一本读物阅读. PDF: 第六版:http://pan.baidu.com/

微信支付--入门篇

公众号支付有2种支付方式: JS API 支付:是指用户打开图文消息或者扫描二维码,在微信内置浏览器打开网页进行的支付.商户网页前端通过使用微信提供的 JS API,调用微信支付模块.这种方式,适合需要在商户网页进行选购下单的购买流程.  Native(原生)支付:是指商户组成符合 Native(原生)支付规则的 URL 链接,用户可通过点击该链接或者扫描对应的二维码直接进入微信支付模块(微信客户端界面),即可进行支付.这种方式,适合无需选购直接支付的购买流程. 以上两种方式最大的区别是:是否需

微信小程序入门篇

微信小程序入门篇: 准备工作 IDE搭建 就不多说了,没有内测码去下载个破解版吧,我用了一下,学习完全够了!IDE破解版+安装教程 图片发自简书App 知识准备 JavaScrip还是要看看的,推荐教程 廖雪峰大神的博客 HTML+CSS 大概知道是干啥的就行 从零开始 微信小程序中就四种类型的文件 js ---------- JavaScrip文件 json -------- 项目配置文件,负责窗口颜色等等 wxml ------- 类似HTML文件 wxss ------- 类似CSS文件