防火墙之 iptables详解


 一、防火墙介绍

防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。

目前市面上比较常见的有3、4层的防火墙,叫网络防火墙,还有7层的防火墙,其实是代理层的网关。

对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你的所有东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。


 二、iptables发展史


iptables 是与最新的 3.5 版本 Linux内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。

虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它

与Linux内核各版本集成的防火墙历史版本:

2.0.X内核:ipfwadm

2.2.X内核:ipchains

2.4.X内核:iptables

 二、iptables的四表五链


 功能:表(table)


filter:过滤,防火墙;

mangle:拆解报文 ,按需修改;

nat: network address translation(ip层地址,传输层地址);

raw:关闭在nat表启用的连接追踪机制;

        netfilter内置的五个钩子


prerouting:路由前,数据报文刚到达本机还哦没有路由的;

input:路由完之后,要到达本机内部来的;

forward:不到本机内部的,经由本机转发的;

output:由本机内部向外发出的;

postrouting:即将发出去,马上要离开本机网卡的报文;

 报文流向:

流入本机:prerouting-->input==>用户空间进程;

流出本机:用户空间进程==>output-->postrouting;

转发:prerouing-->forward-->postrouting

用户自定义链:用于内置链进行补充扩展。可实现更灵活的规则组织管理机制;

表和链的对应关系,及优先级(由高到底:raw-->mangle-->nat-->filter);

表和链对应关系:

raw:PREROUTING , OUTPUT

mangle:  PREROUTING  ,  INPUT  ,   FORWARD ,  OUTPUT,   POSTROUTING

nat: PREROUTING ,   INPUT ,OUTPUT ,POSTROUTING

filter: INPUT , FORWARD , OUTPUT

添加规则时的考量点:

(1)要实现何种功能:判断添加规则至哪个表上;

(2)报文流经的位置:判断添加规则至哪个链上;

iptables的关闭和开启:

CentOS 7:

~]# systemctl stop firewalld.service

~]# systemctl disable firewalld.service

CentOS 6:

~]#service iptables  stop

~]#chkchonfig iptables off

   三、iptables命令(以CentOS 7为例)


命令格式: iptables [-t table] SUBCOMMAND chain  [matches...]  [-j target]

 

3.1 -t table:指定表,不指默认是filter表

raw, mangle, nat, [filter]

3.2 SUBCOMMAND:

1)、 链管理:远程连接时,DROP使用要慎重。

-N:  new ,新增一条自定义链;

policy:默认策略; 0 references :引用计数为0。

-X:  delete,删除自定义的空链;(有规则的链的先清除规则 -F)

-P :   policy,设置链的默认策略;

ACCEPT:接受

DROP:丢弃,

REJECT:拒绝

注意:DROP和REJECT设置时,一般设置为DROP。

示例,把filter表中的FORWARD链设置为DROP

-E  :  rename,重命名自定义的未被引用(引用计数为0)的链;

2)、 规则管理:

-A:append ,追加,默认为最后一个;

示例: 允许所有192.168网段的主机ping本主机(192.168.1.107)                                                                                                              

 -I:insert,插入,默认为第一个;


-D:delete,删除

(1)rule specification

(2)rule number

-R: replace ,替换

-F:flush ,冲刷,清洗

-Z:zero ,置0 ;

iptables的每条规则都有两个计数器:

(1)由本规则匹配到得所有的packets;

(2) 由本规则匹配到得所有的bytes;

-S:selected ,以 iptables-save命令的格式显示链上的规则;


                3)、查看:

-L: lsit,列出规则

-n: numeric ,以数字格式显示地址和端口;

-v:verbose ,详细信息;-vv,-vvv

-x: exactiy,显示计数器的精确值而非单位换算后的结果;

--line-numbers:显示链上的规则的编号;

组合:-nvL

   

3.3 匹配条件

1)基本匹配:netfilter自带的匹配机制

[!] -s, --source address[/mask][,...]              :原地址匹配

[!] -d, --destination address[/mask][,...]      :目标地址匹配

[!] -i, --in-interface name                          :限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;

[!] -o, --out-interface name                      :限制报文流出的接口,只能用于OUTPUT,FORWARD,POSTROUTING;

2)扩展匹配:经由扩展模块引入的匹配机制,需要加载扩展模块;-m mathchname

隐式扩展:可以不用使用-m选项专门加载相应模块;前提是使用-p选项可匹配何种协议;

[!] -p,--protocol PROTOCOL PROTOCOL:

协议:tcp,udp,icmp,icmpv6,esp,ah,sctp,mh or "all"

tcp:隐含指明了“-m tcp,有专用选项:

[!] --source-port,--sport port[:port] :匹配报文中tcp首部的源端口;可以是端口范围;

[!] --destination-port,--dport port[:port]:匹配报文中的tcp首部的目标端口,可以是端口范围;

[!]--tcp-flags mask comp :检查报文中的mask指明的tcp标志位,而要这些标志位comp中必须为1;

--tcp-flags syn,fin,ack,rst syn

--tcp-flags syn,fin,ack,rst ack,fin

[!] --syn:

--syn相当于“--tcp-flags syn,fin,ack,rst syn” ;tcp三次握手的第一次

示例:允许其他任何主机访问本机的80端口

udp:隐含指明了“-m udp”,有专用选项:

[!] --source-port,--sport port[:port]:匹配报文中的udp首部的源端口;可以是端口范围;

[!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口;可以是端口范围;

icmp:隐含 指明了“-m icmp”,有专用选项;

[!]--icmp-type {type[/code] | yypename}

type/code:

0/0:echo reply

8/0:echo request

总结:本机为服务器是,其他主机请求本机,入栈为8,出栈为0;本机请求其他服务器时,出栈为8,入栈为0。

示例1:允许本机ping其他主机,不允许其他主机ping本机。

示例2:允许其他主机ping本机。

显示扩展:必须由-m选项专门加载相应模块

multiport:多端口匹配

以离散方式定义多端口匹配,最多可以指定15个端口;

[!]--source-ports,--sports port[,port|,port:port]...

[!]--destination-ports,--dports port[,port|,port:port]...

[!]--ports port[,port|,port:port]...

示例:

~]# iptables -I INPUT -s 0/0 -d 172.18.100.6 -p tcp -m multiport --dports 22,80 -j ACCEPT

~]# iptables -I OUTPUT -d 0/0 -s 172.18.100.6 -p tcp -m multiport --sports 22,80 -j ACCEPT

iprange:指明一段连续的ip地址范围作为源地址或目标地址匹配;

[!]--src-range from[-to]:源地址范围

[!]--dst-range from[-to]:目标地址范围

string:对报文中的应用层数据做字符串匹配检测;

--algo {bm | kmp}:

(bm = Boyer-Moore ,kmp = Knuth-Pratt-Morris)

[!]--string pattern:指定要检查的字符串模式;

[!]--hex-string pattern:给定要检查的字符串模式;

示例:

~]# iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT

time:根据收到报文的时间/日期与指定的时间/日期范围进行匹配;

--datastart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] :起始日期时间

--datastop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] :结束日期时间

[!]--monthdays day[,day...]匹配一个月中的哪些天

[!]--weekdays day[,day...]匹配一个周中的哪些

示例:

~]# iptables -R INPUT 4 -d 172.18.100.6 -p tcp --dport 23 -m iprange 172.18.100.1-17.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT

connlimit:根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量;

--connlimit-upto n:连接数量小于等于n则匹配;

--connlimit-above n:连接数量大于n则匹配;

示例:

~]# iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit-upto 2 -j ACCEPT

limit:基于令牌桶算法对报文的速率做匹配;

This module mathches at a limited rate using a token bucket filter.

--limit rate[/second | minute | /hour | /day]

--limit-burst number

示例:

~]# iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT

state:是conntrack的子集,用于对报文的状态做连接追踪;

INVALID:无法识别的连接;

ESTABLISHED:连接追踪模块当中存在记录的连接;

NEW:连接追踪模板当中不存在的连接请求;

RELATED:相关联的连接;

UNTRACKED:未追踪的连接;

已经追踪到得记录下来的连接:

/proc/net/nf_conntrack

连接追踪功能所能够记录的最大连接数量(可调整):

/proc/sys/net/nf_conntrack_max

sysctl -w net.nf_conntrack_max=300000

echo 300000 >/proc/sys/net/nf_conntrack_max

conntrack所能够追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定;已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模板满载时,后续的新连接有可能会超时;

解决办法:

(1)加大nf_conntrack_max的值

(2)降低nf_conntrack条目的超时时长;

不同协议的连接追踪时长:/proc/sys/net/netfilter/

如何放行被动模式的ftp服务?

(1)内核加载 nf_conntrack_ftp模块;

modprobe nf_conntrack_ftp

(2)放行命令连接

#   iptables -A INPUT -d $sip -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -s $sip -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

(3)放行数据连接

#  iptables -A INPUT -d $sip -p tcp  -m state --state RELATED,ESTABLISHED -j ACCEPT

#   iptables -A OUTPUT -s $sip -p tcp  -m state --state ESTABLISHED -j ACCEPT

 4、处理动作:

-j targetname [per-target-options]

ACCEP,DROP,REJECT

RETURN:返回调用的链

REDIRECT:端口重定向

LOG:日志

MARK:防火墙标记

DNAT:目标地址转换

SNAT:源地址转换

MASQERADE:地址伪装

REDIRECT:

This  target  is only valid in the nat table, in the PREROUTING and  OUTPUT chains, and user-defined chains which  are only  called  from  those  chains.   It  redirects  the packet to the machine itself by  changing the destination IP to the    primary address of the  incoming  interface

--to-ports port[-port]

示例:

~]# iptables -t nat -A PREROUTING -d 172.18.100.67 -p tcp --dport 80 -j REDIRET --to-ports 8080

LOG:

Turn on kernel logging of matching packets.if you want to LOG the  packets  you  refuse, use two separate rules with the same matching criteria, first using target LOG then DROP (or REJECT).

--log-level level

emerg, alert, crit, error, warning, notice,  info or debug

--log-prefix prefix

示例:

~]# iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state NEW -j LOG --log-prefix "(new connctions)"

NAT:Network Address Translation

SNAT:source NAT

修改IP报文中的源IP地址

让本地网络的主机可使用统一地址与外部主机通信,从而实现地址伪装;

请求:修改源IP,如果修改则由管理员定义;

响应:修改目标IP,由nat自动根据会话表中追踪机制实现相应修改;

DNAT:destination NAT

修改IP报文中的目标IP地址;

让本地网络中的服务器使用统一的地址向外提供服务(发布服务),但隐藏了自己的真实地址;

请求:由外网主机发起,修改其目标地址,由管理员定义;

响应:修改源地址,但由nat自动根据会话表中的追踪机制实现对应修改;

PNAT:port NAT

SNAT发生在PSTROUTING

DNAT发生在RPEROUTING

SNAT:

This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains  which  are  only  called  from those chains.

--to-soure [ipaddr[-ipaddr]][:port[-port]]

DNAT

This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

--to-destination [ipaddr[-ipaddr]][:port[-port]]

MASQUERADE:

This target is only valid in the nat table, in the POSTROUTING chain.  It  should  only  be  used with  dynamically assigned  IP (dialup) connections: if you have a static IP address, you should use the SNAT target.

 5、规则的检查和保存

规则的检查的次序:规则在链接上的次序即为其检查时的生效次序;因此,其优化使用有一定法则;

(1)同类规则(访问同一应用),匹配范围小的放前面;用于特殊处理;

(2)不同类的规则(访问不同应用),匹配范围大的放前面

(3)应该将那些可由一条规则描述的多个规则合并为一;

(4)设置默认策略;

规则的有效期限:

iptables命令添加的规则,手动删除之前,其生效期限为kernel的生命周期;

保存规则:

                      CentOS 6:                            ~]# service  iptables  save                             ~]# iptables-save  > /etc/sysconfig/iptables                            ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE	                    ~]#service  iptables  restart		            		                重启后会自动从/etc/sysconfig/iptables文件中重载规则;

                CentOS 7:                            ~]# iptables  -S  > /PATH/TO/SOME_RULE_FILE                            ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE

                    重载预存的规则                            ~]# iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

                    自动生效规则文件中的规则:                        (1) 把iptables命令放在脚本文件中,让脚本文件开机自动运行;                            /etc/rc.d/rc.local                                /usr/bin/iptables.sh

                        (2) 用规则文件保存规则,开机自动重载命令;                            /etc/rc.d/rc.local                                iptables-restore  <  /PATH/FROM/SOME_RULE_FILE


时间: 2024-10-05 15:59:11

防火墙之 iptables详解的相关文章

iptables防火墙相关命令详解

前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发. iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING.INPUT.OUTPUT. FORWARD.POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般 的定义为"如果数据包头符合这样的条件,就这样处理

CentOS7下Firewall防火墙配置用法详解

官方文档地址: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld1 修改防火墙配置文件之前,需要对之前防火墙做好备份 重启防火墙后,需要确认防火墙状态和防火墙规则是否加载,若重启失败或规则加载失败,则所有请求都会被防火墙拦截 1 2 3 4 5 6 7

iptables 详解

Iptables 详解 Iptables的历史 历史版本 与Linux内核各版本集成的防火墙历史版本: 2.0.X内核:ipfwadm 2.2.X内核:ipchains 2.4.X内核:iptables iptables的工作原理 iptables由用户空间的命令行程序和位于内核中的tcp/ip协议栈的报文处理框架两部分组成.工作在用户空间中,定义规则,让在内核空间当中的netfilter来读取,并且实现让防火墙工作.而放入内核的地方必须是tcp/ip的协议栈经过的地方.而这个tcp/ip协议栈

Linux网络安全模型及iptables详解(1)

Linux网络安全模型及iptables详解 基本概念 Firewall:工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查, 并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是两者的组合 硬件防火墙:在硬件级别实现部分功能的防火墙:另一个部分功能基于软件实现 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙: 主机防火墙:工作于主机边缘,只能对一台主机起到保护作用 网络防火墙:工作于网络边缘,对多台主机起到保护作用(定向规则) iptables:防火墙规则编写工具,位于用

linux中iptables详解

linux中iptables详解 一.通用基础知识 1.基本概念 什么是防火墙? 所谓防火墙指的是工作于主机或网络的边缘,对于进出的报文根据事先定义的规则作检查,将那些能够被规则所匹配到的报文作出相应处理的组件. 防火墙是由软件和硬件设备组合而成.在内部网和外部网之间.专用网与公共网之间的界面上构造的保护屏障,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入. 防火墙主要由服务访问规则.验证工具.包过滤和应用网关4个

iptables详解--转

出处:http://yijiu.blog.51cto.com/433846/1356254 iptables详解 基本概念: 1.防火墙工作在主机边缘:对于进出本网络或者本主机的数据报文,根据事先设定好的检查规则对其检查,对形迹可疑的报文一律按照事先定义好的处理机制做出相应处理 对linux而言tcp/ip协议栈是在内核当中,意味着报文的处理是在内核中处理的,也就是说防火墙必须在工作在内核中,防火墙必须在内核中完成tcp/ip报文所流进的位置,用规则去检查,才真正能工作起来. iptables用

CentoOS iptables详解

一.防火墙.iptables和netfilter简介 防火墙(Firewall):是由软件和硬件设备组合而成的一种隔离技术,它工作于网络或主机的边缘(通信报文的进出口),对于进出本网络或主机的数据包根据事先定义的检测规则进行匹配检测,允许或是限制传输的数据包通过. netfilter:是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集. iptables:是用来插入.修改和删除数据包过滤表中的规则的管理工具. 二.iptables详解 该图片来自于网络 报文流向

iptables详解之filter

iptables详解之filter iptables令很多小伙伴脑阔疼,下面我们来说说如何使用iptables. 一.iptables格式 1.1.iptables 帮助 通过iptables --help查看一下iptables用法 [[email protected] ~]# iptables --help iptables v1.4.21 Usage: iptables -[ACD] chain rule-specification [options] iptables -I chain

iptables详解加实战

iptables 组件是一种工具,也称为用户空间(userspace),它使插入.修改和除去信息包过滤表中的规则变得容易.分为四个表和五个链,其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度. 4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表).表的处理优先级:raw>mangle>nat>filter. filter:一般的过滤功能,如不-t指定表,则默认filte