iptables

防火墙详解

什么是防火墙?

在计算中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
防火墙分为软件防火墙和硬件防火墙,他们的优缺点:
**硬件防火墙:**拥有经过特别设计的硬件及芯片,性能高、成本高(当然硬件防火墙也是有软件的,只不过有部分功能由硬件实现,所以硬件防火墙其实是硬件+软件的方式);
**软件防火墙:**应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能比硬件防火墙低、成本低。

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

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

所以Linux中真正的防火墙是Netfilter,但由于都是通过应用层程序如iptables或firewalld进行操作,所以我们一般把iptables或firewalld叫做Linux的防火墙。

**注意:**以上说的iptables都是针对IPv4的,如果IPv6,则要用ip6tables,至于用法应该是跟iptables是一样的。

注:Linux系统运行时,内存分内核空间和用户空间,内核空间是Linux内核代码运行的空间,它能直接调用系统资源,用户空间是指运行用户程序的空间,用户空间的程序不能直接调用系统资源,必须使用内核提供的接口“system call”。

链的概念

iptables开启后,数据报文从进入服务器到出来会经过5道关卡,分别为Prerouting(路由前)、Input(输入)、Outpu(输出)、Forward(转发)、Postrouting(路由后):

  • **INPUT链:**当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;
  • **OUTPUT链:**当防火墙本机向外发送数据包(出站)时,应用此链中的规则;
  • **FORWARD链:**当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则;
  • PREROUTING链:(互联网进入局域网)在对数据包作路由选择之前,应用此链中的规则,如DNAT;
  • POSTROUTING链:(局域网出互联网)在对数据包作路由选择之后,应用此链中的规则,如SNAT。

在这里插入图片描述

每一道关卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把这些关卡都叫**“链”**
在这里插入图片描述

表的概念

虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”:
filter表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter;
nat表 network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat;
mangle表 拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;
raw表 是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。
我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。
每条表的匹配规则
在这里插入图片描述
在这里插入图片描述

规则的概念

iptables规则主要包含“条件&动作”,即匹配出符合什么条件(规则)后,对它采取怎样的动作。

匹配条件

  • **S_IP:**source ip,源ip
  • **S_PORT:**source port,源端口
  • D_IP: destination ip,目标ip
  • D_PORT: destination port,目标端口
  • **TCP/UDP:**第四层(传输层)协议

处理的动作

  • **ACCEPT:**允许数据包通过;
  • **DROP:**直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;
  • **REJECT:**拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;

iptables命令操作

对iptables进行操作,其实就是对它的四种“表”进行“增删改查”操作。

启动iptables

对于CentOS7:
前面说过,CentOS7默认没有iptables(CentOS7默认防火墙是firewalld),但我们还是可以自己安装iptables。

CentOS7关闭firewalld防火墙:

systemctl stop firewalld

CentOS7关闭firewalld防火墙开机启动:

systemctl disable firewalld

CentOS7安装iptables防火墙:

sudo yum -y install iptables

CentOS7安装iptables的service启动工具:

sudo yum -y install iptables-services

安装完之后,所有启动、停止之类的操作与CentOS6都一样,参考前面CentOS6的操作即可。

但实际上在CentOS7中用service来操作程序的启停,它会自动跳转到使用systemctl,所以其实除了用CentOS6的方法,还可以用CentOS7的:

# 启动iptables
systemctl start iptables
# 查看iptables状态
systemctl status iptables
# 停止iptables
systemctl stop iptables
# 重启iptables
systemctl restart iptables
# 重载iptables
systemctl reload iptables

这里要特别注意,稍微了解Linux的童鞋都知道,service命令是用于启动Linux的进程的(参见这里),但在这里是例外,service iptables start并没有启动一个进程,你无法用ps aux | grep iptables的方式看到一个叫iptables的进程,你只能用service iptables status去查看它的状态。

所以iptables其实不能叫“服务”,因为它并没有一个“守护进程”,其实iptables只是相当于一个客户端工具,真正的防火墙是Linux内核中的netfilter,由于netfilter是内核功能,用户无法直接操作,iptables这个工具是提供给用户设置过滤规则的,但最终这个过滤规则是由netfilter来执行的。

查询规则

命令格式:iptables [选项] [参数]

常用选项:
-L: list的缩写,list我们通常翻译成列表,意思是列出每条链上的规则,因为多条规则就是一个列表,所以用-L来表示。-L后面还可以跟上5条链(POSTROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)的其中一条链名,注意链名必须全大写,如查看“INPUT链”上的规则:

iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

不指定的话就是默认查看所有链上的规则列表:

iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
  • Chain INPUT: INPUT链上的规则,同理,后面的“Chain FORWARD”、“Chain OUTPUT”分别是FORWARD链和OUTPUT链上的规则;
  • (policy ACCEPT): 表示默认策略是接受,即假如我没设置,那就是允许,只有我设置哪个不允许,才会不允许,示例中是安装iptables后的默认规则,由于默认是ACCEPT,你规则也设置为ACCEPT按道理来说是没什么意义的,因为你不设置也是ACCEPT呀,但事实上,是为了方便修改为REJECT/DROP等规则,说白了就是放在那,要设置的时候我们就可以直接修改;
  • target: 英文意思是“目标”,但该列的值通常是动作,比如ACCEPT(接受)、REJECT(拒绝)等等,但它确实可以是“目标”,比如我们创建 一条链iptables -N July_filter
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值