iptables个人理解

在计算机领域,防火墙是用于保护信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输。

  • 用于保护内网安全的一种设备
  • 依据规则进行防护
  • 用户定义规则
  • 允许或拒绝外部用户访问

iptables

iptables是什么?

  • iptables不是防火墙,是防火墙用户代理

  • 用于把用户的安全设置添加到安全框架中

  • 安全框架是防火墙

  • 安全框架的名称为netfilter

  • netfilter位于内核空间中,是Linux操作系统核心层内部的一个数据包处理模块

  • iptables是用于在用户空间对内核空间的netfilter进行操作的命令行工具

netfilter/iptables功能

netfilter/iptables可简称为iptables,为Linux平台下的包过滤防火墙,是开源的,内核自带的,可以代替成本较高的 企业级硬件防火墙,能够实现如下功能:

  • 数据包过滤,即防火墙
  • 数据包重定向,即转发
  • 网络地址转换,即可NAT

注:

平常我们使用iptables并不是防火墙的“服务”,而服务是由内核提供的。

iptables概念

iptables工作依据------规则(rules)

iptables是按照规则(rules)来办事的,而规则就是运维人员所定义的条件;规则一般定义为“如果数据包头符合这样的 条件,就这样处理这个数据包”。

规则存储在内核空间的数据包过滤表中,这些规则分别指定了源地址、目的地址,传输协议(TCP、UDP、ICMP)和服 务类型(HTTP、FTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,比如放行(ACCEPT)、拒绝(REJECT)、 丢弃(DROP)等

配置防火墙主要工作就是对iptables规则进行添加、修改、删除等

小结:

  • 工作依据是规则
  • 规则存在表中
  • 规则指定了什么?源地址或目的地址或传输协议的类型
  • 如果数据包备匹配到,按照规则指定的动作去执行

iptables中链的概念

当客户端访问服务器端的web服务时,客户端发送访问请求报文至网卡,而tcp/ip协议栈是属于内核的一部分,
所 以,客户端的请求报文会通过内核的TCP协议传输到用户空间的web服务,而客户端报文的目标地址为web服务器
所 监听的套接字(ip:port)上,当web服务器响应客户端请求时,web服务所回应的响应报文的目标地址为客户端地址,
我们说过,netfilter才是真正的防火墙,属于内核的一部分,所以,我们要想让netfilter起到作用,我们就需要在内
核中设置“关口”,所以进出的数据报文都要通过这些关口,经检查,符合放行条件的准允放行,符合阻拦条件的则被
阻止,于是就出现了input和output关口,然而在iptables中我们把关口叫做“链”。

上面的举例中,如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够
进行转发,那么这个转发就是本机内核所支持的IP_FORWARD功能,此时我们的主机类似于路由器功能,所以我们会
看到在iptables中,所谓的关口并只有上面所提到的input及output这两个,应该还有“路由前”,“转发”,“路由后”,
它们所对应的英文名称分别为“PREROUTING”,“FORWARD”,“POSTROUTING”,这就是我们说到的5链

INPUT

OUTPUT

PREROUTING

FORWARD

POSTROUTING

当我们在本地启动了防火墙功能时,数据报文需要经过以上关口,根据各报文情况,
各报名经常 的“链”可能不同,如果报文目标地址是本机,则会经常input链发往本机用户空间,如果报
文目标不是本机,则会直接 在内核空间中经常forward链和postrouting链转发出去。

所以,根据上图,我们能够想象出某些常用场景中,报文的流向:

到本机某进程的报文:PREROUTING --> INPUT

由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING

由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

有的时候我们也经常听到人们在称呼input为“规则链”,这又是怎么回事呢?
我们知道,防火墙的作用在于对经过的数 据报文进行规则匹配,然后执行
对应的“动作”,所以数据包经过这些关口时,必须匹配这个关口规则,但是
关口规则 可能不止一条,可能会有很多,当我们把众多规则放在一个关口
上时,所有的数据包经常都要进行匹配,那么就形成 了一个要匹配的规则
链条,因此我们也把“链”称作“规则链”。
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包(主要是将数据包转发至本机其它网卡)

当数据报文经过本机时,网卡接收数据报文至缓冲区,内核读取报文ip首部,发现报文不是送到本机时(目的ip 不是本机),由内核直接送到forward链做匹配,匹配之后若符合forward的规则,再经由postrouting送往下一 跳或目的主机。

PREROUTING:在进行路由选择前处理数据包,修改到达防火墙数据包的目的IP地址,用于判断目标主机

POSTROUTING:在进行路由选择后处理数据包,修改要离开防火墙数据包的源IP地址,判断经由哪一接口送往 下一跳

iptables中表的概念

每个“规则链”上都设置了一串规则,这样的话,我们就可以把不同的“规则链”组合成能够完成某一特定功能集合分 类,而这个集合分类我们就称为表,iptables中共有5张表,学习iptables需要搞明白每种表的作用。

  • filter: 过滤功能,确定是否放行该数据包,属于真正防火墙,内核模块:iptables_filter
  • nat: 网络地址转换功能,修改数据包中的源、目标IP地址或端口;内核模块:iptable_nat
  • mangle: 对数据包进行重新封装功能,为数据包设置标记;内核模块:iptable_mangle
  • raw: 确定是否对数据包进行跟踪;内核模块:iptables_raw
  • security:是否定义强制访问控制规则;后加上的

iptables中表链之间的关系

我们在应用防火墙时是以表为操作入口的,只要在相应的表中的规则链上添加规则即可实现某一功能。那么我们就应 该知道哪张表包括哪些规则链,然后在规则链上操作即可。

  • filter表可以使用哪些链定义规则:INPUT,FORWARD,OUTPUT
  • nat表中可以使用哪些链定义规则:PREROUTING,OUTPUT ,POSTROUTING,INPUT
  • mangle 表中可以使用哪些链定义规则:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  • raw表中可以使用哪些链定义规则:PREROUTING,OUTPUT

iptables中表的优先级

raw-mangle-nat-filter(由高至低)

数据包经由iptables的流程

image.png

防火墙分类

逻辑上划分,防火墙可以大体分为主机防火墙和网络防火墙
  主机防火墙:针对于单个主机进行防护
  网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是本地局域网
  网络防火墙主外(服务集体),主机防火墙主内(服务个人)

物理上划分,防火墙可分为硬件防火墙和软件防火墙
  硬件防火墙:在硬件级别实现防火墙功能,另一部分基于软件实现,其性能高,硬件成本高

软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,其性能相较于硬件防火墙低,成本较低,对于 Linux系统已自带,直接使用即可

防火墙性能

  • 吞吐量
  • 并发连接
  • 新建连接
  • 时延
  • 抖动

四表五链

链操作:

新增:iptables -N <链名>
重命名:iptables -E <链名>
删除:iptables -X <链名>

表操作:

查看表
iptable -L <链名> -nv

增加表
  头插:iptables -I <链名> -d <desc_ip> -s <source_ip> -j <DROP|ACCEPT> -o <出口网卡>
  尾插:iptables -A <链名> -d <desc_ip> -s <source_ip> -j <DROP|ACCEPT> -i <入口网卡>

删除表
iptables -D <链名> -d <desc_ip> -j <DROP|ACCEPT>

修改表
iptables -t filter -R INPUT 1 -s <source_ip> -j REJECT

拓展模块
udp、icmp、state
multiport扩展模块
常用的扩展匹配条件如下:
-p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
-p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开

动作

ACCEPT、DROP、REJECT、LOG

SNAT、DNAT、MASQUERADE、REDIRECT
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 172.16.30.0/24 -j SNAT --to-source 192.168.1.146
[root@node1 ~]# iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 23 -j DNAT --to-destination 172.16.30.100:22

MASQUERADE会动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址,示例如下:

[root@node1 ~]# iptables -t nat -I POSTROUTING -s 172.16.30.0/24 -o eth0 -j MASQUERADE

通过外网网卡出去的报文在经过POSTROUTING链时,会自动将报文的源地址修改为外网网卡上可用的IP地址,这时,即使外网网卡中的公网IP地址发生了改变,也能够正常的、动态的将内部主机的报文的源IP映射为对应的公网IP。
可以把MASQUERADE理解为动态的、自动化的SNAT,如果没有动态SNAT的需求,没有必要使用MASQUERADE,因为SNAT更加高效。

iptables -t nat -A PREROUTING -p tcp --dport 81 -j REDIRECT --to-ports 80
REJECT动作的常用选项为--reject-with
使用--reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝。

如上图所示,上述规则表示所有发往22号端口的tcp报文都符合条件,所以都会被记录到日志中,查看/var/log/messages即可看到对应报文的相关信息,但是上述规则只是用于示例,因为上例中使用的匹配条件过于宽泛,所以匹配到的报文数量将会非常之多,记录到的信息也不利于分析,所以在使用LOG动作时,匹配条件应该尽量写的精确一些,匹配到的报文数量也会大幅度的减少,这样冗余的日志信息就会变少,同时日后分析日志时,日志中的信息可用程度更高。

注:请把刚才用于示例的规则删除。

从刚才的示例中我们已经了解到,LOG动作会将报文的相关信息记录在/var/log/message文件中,当然,我们也可以将相关信息记录在指定的文件中,以防止iptables的相关信息与其他日志信息相混淆,修改/etc/rsyslog.conf文件(或者/etc/syslog.conf),在rsyslog配置文件中添加如下配置即可。

  #vim /etc/rsyslog.conf

  kern.warning /var/log/iptables.log

加入上述配置后,报文的相关信息将会被记录到/var/log/iptables.log文件中。

完成上述配置后,重启rsyslog服务(或者syslogd)

#systemctl restart rsyslog

服务重启后,配置即可生效,匹配到的报文的相关信息将被记录到指定的文件中

LOG动作也有自己的选项,常用选项如下(先列出概念,后面有示例)

--log-level选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。

--log-prefix选项可以给记录到的相关信息添加"标签"之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。

注:--log-prefix对应的值不能超过29个字符。

比如,我想要将主动连接22号端口的报文的相关信息都记录到日志中,并且把这类记录命名为"want-in-from-port-22",则可以使用如下命令

[root@node1 ~]# iptables -F
[root@node1 ~]# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
[root@node1 ~]# iptables -vnL INPUT
Chain INPUT (policy ACCEPT 529 packets, 288K bytes)
pkts bytes target   prot opt in   out   source        destination    
0   0 LOG    tcp -- *   *    0.0.0.0/0      0.0.0.0/0      tcp dpt:22 state NEW LOG flags 0 level 4 prefix 
"want-in-from-port-22"

完成上述配置后,我在IP地址为192.168.1.102的客户端机上,尝试使用ssh工具连接上例中的主机,然后查看对应的日志文件(已经将日志文件设置为/var/log/iptables.log)

Sep 4 09:13:06 node1 kernel: want-``in``-``from``-port-22IN=eth0 OUT= MAC=00:50:56:b7:ad:4d:00:50:56:b7:16:6a:08:00 SRC=192.168.1.102 DST=192.168.1.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48815 DF PROTO=TCP SPT=50676 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0

如上图所示,ssh连接操作的报文的相关信息已经被记录到了iptables.log日志文件中,而且这条日志中包含"标签":want-in-from-port-22,如果有很多日志记录,我们就能通过这个"标签"进行筛选了,这样方便我们查看日志,同时,从上述记录中还能够得知报文的源IP与目标IP,源端口与目标端口等信息,从上述日志我们能够看出,192.168.1.102这个IP想要在09点13分连接到192.168.1.101(当前主机的IP)的22号端口,报文由eth0网卡进入,eth0网卡的MAC地址为00:50:56:b7:ad:4d,客户端网卡的mac地址为00:50:56:b7:16:6a。

除了ACCEPT、DROP、REJECT、LOG等动作,还有一些其他的常用动作,比如DNAT、SNAT等,我们会在之后的文章中对它们进行总结。

可用值如下

icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable,
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-pro-hibited
icmp-admin-prohibited
    **centos6中**,使用"service iptables save"命令即可保存规则,规则默认保存在/etc/sysconfig/iptables文件中,如果你刚刚安装完centos6,在刚开始使用iptables时,会发现filter表中会有一些默认的规则,这些默认提供的规则其实就保存在/etc/sysconfig/iptables中,  保存规则的示例如下。

    文件中保存了filter表中每条链的默认策略,以及每条链中的规则,由于其他表中并没有设置规则,也没有使用过其他表,所以文件中只保存了filter表中的规则。

当我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。

从现在开始,最好养成及时保存规则的好习惯。

centos7中,已经不再使用init风格的脚本启动服务,而是使用unit文件,所以,在centos7中已经不能再使用类似service iptables start这样的命令了,所以service iptables save也无法执行,同时,在centos7中,使用firewall替代了原来的iptables service,不过不用担心,我们只要通过yum源安装iptables与iptables-services即可(iptables一般会被默认安装,但是iptables-services在centos7中一般不会被默认安装),在centos7中安装完iptables-services后,即可像centos6中一样,通过service iptables save命令保存规则了,规则同样保存在/etc/sysconfig/iptables文件中。
此处给出centos7中配置iptables-service的步骤

#配置好yum源以后安装iptables-service
  yum install -y iptables-services
#停止firewalld
  systemctl stop firewalld
#禁止firewalld自动启动
  systemctl disable firewalld
#启动iptables
  systemctl start iptables
#将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
  systemctl enable iptables

上述配置过程只需一次,以后即可在centos7中愉快的使用service iptables save命令保存iptables规则了。

其他通用方法

还可以使用另一种方法保存iptables规则,就是使用iptables-save命令

使用iptables-save并不能保存当前的iptables规则,但是可以将当前的iptables规则以"保存后的格式"输出到屏幕上。

所以,我们可以使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。

iptables-save > /etc/sysconfig/iptables

我们也可以将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。

使用iptables-restore命令可以从指定文件中重载规则,示例如下

iptables-restore < /etc/sysconfig/iptables

保存规则

保存规则命令如下,表示将iptables规则保存至/etc/sysconfig/iptables文件中,如果对应的操作没有保存,那么当重启iptables服务以后

service iptables save

注意点:centos7中使用默认使用firewalld,如果想要使用上述命令保存规则,需要安装iptables-services,具体配置过程请回顾上文。

或者使用如下方法保存规则

iptables-save > /etc/sysconfig/iptables

可以使用如下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则。

iptables-restore < /etc/sysconfig/iptables
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • iptables俗称防火墙,或许我们已经不在陌生,但是作为openstack基础,这里还是对其做一些补充,了解更多...
    ximitc阅读 1,781评论 0 8
  • 1 前言 防火墙(Firewall),就是一个隔离工具,工作于主机或者网络的边缘,对于进出本主机或本网络的报文,根...
    魏镇坪阅读 6,928评论 1 23
  • Firewall 工作于网络(网络防火墙)或主机(主机防火墙)的边缘(通信报文的进出口),对于进出本网络或主机的报...
    SRE1阅读 1,301评论 0 0
  • 一、防火墙原理 防火墙一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统。按照给定的规则,允许或...
    voidFan阅读 1,733评论 0 4
  • 一. 什么是防火墙 防火墙,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪...
    InnocenceYWQ阅读 1,039评论 0 3