iptables的原理及使用

 

Linux内核里有一个称为Netfilter的子系统,当包通过内核时,必须依次经过此子系统的各个检查点。管理员可以使用一个user-space机制 (iptables命令),在各检查点设置过滤规则,借此架设IP防火墙。Netfilter可对包采起三种处理方式: 过滤(filtering)、拆分(mangling)、转址(Network Address Translation, NAT)。“过滤"是在包到达检查点时,判断是否应该让包通往下一站。凡是会修改包内容的行为,都统称为”拆分"。NAT是改变包的来源地址、来源端口、目的地址、目的端口,在无形中影响包的去处或改变外界对包来源的认知。实际上,NAT只是“拆分”的一种特殊应用。服务器

过滤IP包网络

当包从网络接口进入Linux内核后,会依次经过一系列检查点,管理员能够在各检查点设置“过滤规则",这些过滤规则描述"怎样的包”(比对条件)应该给予“怎样的处理"(丢弃、拒绝、经过)。常见的比对条件以下:tcp

  • 协议类型:TCP、UDP、ICMP等。
  • 通讯端口编号(对于TCP/UDP协议)。
  • 包类型: SYN/ACK、数据、ICMP Echo Request等。
  • 来源地址:发出包的主机的IP地址。
  • 目的地址:包的最终接受者的IP地址。

对于符合条件的包,可能的处理方式有下列三种:spa

  • 丢弃(Drop):直接让包消失,包来源不会收到通知。
  • 拒绝(Reject):让包消失,可是以ICMP通知包来源。
  • 经过(Accept):让包流入下一个检查点。

有个很是重要的概念:IP过滤动做是发生在网络层,这表示Netfilter对于使用网络链接的应用程序一无所知,惟一知道的是网络链接自己。举例来讲,假设你想要禁止外界telnet到内部网络主机,为此,你封锁了目的通讯端口为23(Telnet的默认通讯端口)、从外界通往内部网络的TCP包。然而,这并不能阻止外界使用telnet程序访问内部主机上的其余通讯端口。设计

iptables的概念rest

iptables在内核对于包的处理过程当中定义了五个"检查点"(hook point),每一个检查点各对应到一组链,分别是:PREROUTING、INPUT、FORWARD、POSTROUTING与OUTPUT。这些内置的链可供管理员安排过滤表规则,每一条过滤表规则各表明依次监视或影响包流程的机会。code

了解iptables的工做原理对于理解其各类命令、参数和选项都很是有帮助,也是设计iptables的基础。开启了iptables后,系统网卡上的各个数据包都会通过iptables的检查和处理。iptables就像一个流水线,各个规则就像流水线上的工人按照必定的顺序排列在流水线上。全部进入iptables的数据包在这个过程当中会依次被各个规则检查。blog

这个图展现了包从网络接口流入系统、经过内核、离开内核(若是没被丢弃的话)的流程。五个方框分别表明iptables的”链“,方框内部是该链可能执行的处理方式(过滤表类型)。仔细观察发现每个链的第一个过滤表都是mangle,这表示包通过拆分以后,才被交给后续的过滤表继续处理。接口

检查点的做用生命周期

 

检查点

可处理何种状态的包

FORWARD

通过网关(从某接口进来,再从另外一个接口出去)的包

INPUT

即将递交给本地进程的包

OUTPUT

本地进程刚产生的包

POSTROUTING

即将进入网络接口而离开的包

PREROUTING

刚从网络接口进入的有效包(因“混杂模式”才得以进入的任何包以及校验码错误的包,会被排除在外)

 

 

 

 

 

 

 

 

 

规则应该写在哪个链中,取决于规则应该做用在包的哪一段生命周期。举例来讲,若是要过滤出站包,你应该选择OUTPUT链(由于POSTROUTING链没有filter过滤表)。

过滤表

iptables内置了三个过滤表:filter、mangle和nat。各个过滤表被预先设置了几个合适的链(检查点)。

 
过滤表 说明
filter 用于设定"进入”、“穿越”、“离开”三种通讯的过滤检查原则。内置的链包括INPUT、FORWARD和OUTPUT
mangle 用于执行特殊的包修改程序,好比说,裁掉IP options(此动做须搭配IPV4OPTSSTRIP扩充模块)。本过滤表是五个内置链(FORWARD、INPUT、OUTPUT、POSTROUTING和PREROUTING)的第一站
nat 用于搭配链接跟踪机制来进行转址操做(将穿越包的来源地址和目的地址改为NAT网关的地址)。内置的链包括OUTPUT、POSTROUTING和PREROUTING

 

 

 

 

iptables根据包的来源和目的地址,在各个过滤表安排了适当的链(检查点),塑造"包依次通过xxx过滤表的aa、bb、cc链”的假象。

当使用iptables时,若没以-t选项指出要操做的过滤表,iptables会假设你要操做的是filter过滤表。

链(chain)自己象征包流程中的特定“检查点”,当包到达某个检查点时,必须依次接受该检查点所包含的一系列过滤规则的考验。若包符合某规则的匹配条件,则以该规则的“目标”来处置该包;相对地,若包不符合规则的匹配条件,则必须继续接受链里的下一条过滤规则的考验;若包成功经过链里的全部规则,则以链的“默认政策”(default policy)来处理包。

系统刚开机时,全部过滤表和链都是空的,直到管理员以iptables命令添加新规则,或是由开机脚本执行iptables-restore加载预先有iptables-save所存储的规则时才会有内容。

除了默认链以外,也能够定义新链来组织你本身的过滤规则。

每个链都有所谓的默认策略(default policy)。当包成功流过链里的每一条规则,而未被任何规则的“目标”处理过,则以默认策略来处理包。内置链的策略只能是ACCEPT(默认)与DROP这两个内置目标(稍后解释)的其中之一。用户自定义的链,其默认策略为RETURN,不能够改变。

尽管有这些限制,可是仍能够用取巧的方法,改变内置链的“实质策略”:在链末端安装一条全部包均可以符合条件的“彻底匹配规则”(match-all),这样,全部到达该规则的包,都会被送到彻底匹配规则的目标。运用一样的技巧,咱们也可使自定义链具备RETURN以外的其余实质策略。使用这种末端拦截技术时,可将链的(形式上的)政策改为DROP,借此阻止任何经过彻底匹配规则的包。

过滤规则

iptables的过滤规则(rule),由一个或多个匹配条件(match)与一个目标(target)构成,前者用于挑出适合处理的包,后者决定如何处理包。只有同时符合全部匹配条件的包,才会受到过滤规则的影响。

对于每一条规则,系统各维护两个计数器,一个计算包数,另外一个计算字节数。每当有包符合匹配条件时,便累加这两个计数值。

匹配条件与目标二者都有选择性。没有明确指定匹配条件时,表示全部包都算。没有明确指定目标时,则除了更新计数器以外,不对包进行任何变更。举例来讲,下列命令添加一条“空规则”到filter过滤表的FORWARD链中:# iptables -t filter -A FORWARD 像这样的空规则,经常使用于累计经过某一检查点的包数(与字节数)。

匹配条件

“匹配条件”(match)的做用是挑出适合处理的包。Linux内核内置了经常使用的匹配条件,例如,适用于任何IP包的通常性IP(Internet Protocol)匹配条件(像协议类型、来源地址、目的地址)。

有些匹配条件须要用户以-m(或--match)选项来加载额外的扩充模块。好比说,若你想以Ethernet的Media Access Controller (MAC)地址做为匹配条件,则须要另外加载mac模块。

目标

“目标”决定如何处理符合匹配条件的包,也能够用来做为链的默认策略。iptables内置了四种目标,对于其余目标,则须要另外加载扩充模块。

内置目标
目标 说明
ACCEPT 跳过当前链的后续流程,让包进入下一个链
DROP 彻底终止后续的处理过程,就看成没收到包同样。包来源不会收到任何通知。若是须要让包来源知道包已被丢弃,请改用REJECT扩充目标
QUEUE 将包交给userspace(内核以外的程序)。细节请参阅 lipipq manpage
RETURN 对于用户自定义链中的规则,表示中止该链的后续过滤规则,让包回到先前使得包进入本自定义链的原链,由分支点的下一条过滤规则继续处理;对于内置链中的规则,则跳过链的后续规则,直接以链的默认策略来处理包

Linux防火墙的基本安装步骤

首先,必须肯定Netfilter被编译进Linux内核。若是你使用厂商提供的内核,这应该不成问题。

加载内核模块

若是将netfilter编译进内核里了,能够直接使用iptables命令而没必要另外加载任何模块;相对地,若是将netfilter编译成外挂模块的形式(馊主意!),则必须先以modprobe加载模块: modprobe ip_tables

当使用到被编译成模块的外挂功能时(例如REJECT目标、tcp匹配条件等),iptables会自动加载相关模块,没必要另外以modprobe加载它们。

iptables的操做方法

iptables是用于设定Netfilter的user-space命令,它的语法由于有条理可循,因此不算太复杂。不过,因为扩充模块不少,而每一个模块都有本身的特殊选项,因此你可能须要一本小手册以方便查阅。

iptables的基本语法结构以下:

 iptables subcmd rule-specification extention

其中的subcmd描述你想操做的过滤表与链、对于链的操做方式(插入、添加、删除、清空)以及表所列的杂项选项。rule-specification描述过滤规则(包括筛选条件与处理目标)。extension是扩充模块的选项。

 经常使用防火墙的配置

 1 #清空全部链
 2 iptables -F INPUT
 3 #删除自定义链
 4 iptables -X
 5 #将全部链中全部规则的计数值归零
 6 iptables -Z
 7 #将INPUT链的默认规则改为丢弃
 8 iptables -P INPUT DROP
 9 #容许本地回环
10 iptables -A INPUT -i lo -j ACCEPT
11 #开放22,80端口容许外网主动访问
12 iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
13 #容许主机主动访问的内容经过
14 iptables -A INPUT -p tcp -m state  --state ESTABLISHED -j ACCEPT
15 #容许外网主机ping
16 iptables -A INPUT -m icmp -p icmp --icmp-type ping -j ACCEPT
17 #容许ping外网机器回应的数据包
18 iptables -A INPUT -m icmp -p icmp --icmp-type pong -j ACCEPT
19 #容许接收DNS服务器的返回结果,不然没法使用域名访问
20 iptables -A INPUT -p udp --sport 53 -j ACCEPT

 

 

Debian 开启IP转发功能: 

两种方式:

  • 临时:echo "1">/proc/sys/net/ipv4/ip_forward
  • 系统启动时自动开启:
    修改/etc/sysctl.conf,取消这一行的注释: 
    net.ipv4.ip_forward= 1 使该配置当即生效可使用以下命令  sysctl -p 或者 从新启动系统

经常使用的网络其余命令:

相关文章
相关标签/搜索