概述

Netfilter/iptables(以下简称iptbales)是unix/linux自带的一款优秀切开放源代码的完全自由的基于包过滤的防护墙工具,他的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。
Iptables是linux2.4以2.6内核中集成的服务。其功能与安全性比其老一辈ipfwadm,ipchains强大的多(长江后浪推前浪),iptable主要是工作在OSI模型的二三四层,如果重新编译内核,iptables也可以支持7层控制(squid代理+iptables)。

专业名词

Netfilter/iptables

可以把Netfilter/iptables看作一栋楼,里面存放着很多的表。

表(tables)

表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables)上,可以把表(iptables)当作一套房子。
表有filter nat mangle raw四个表。

表名作用
filter表I负责过滤功能,内核模块:iptables_filter
nat表负责网络地址转换功能,内核模块:iptable_nat
mangle表解析报文,做出修改,重新封装的功能,内核模块:iptable_mangle
raw表关闭nat表上启用的链接追踪机制,内核模块:iptable_raw

链(chains)

链(chains)是规则(Policys)的容器。如果把表(tables)当作一套房子,那么链就是里面的房间,卧室,厨房,客厅什么的。
链有INPUT OUTPUT FORWARD PREROUTING POSTROUTING 不同的表有不同的链

规则(Policy)

规(Policy)则就是一条条过滤的语句用来控制流量动作的。

关于表和链

关系

filter表INPUT,FORWARD,OUTPUT
nat表PREROUTING,OUTPUT,POSTROUTING,INPUT(centos6没有)
mangle表PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw表PREROUTING,OUTPUT

Filter

主要是和自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)。Filter表是iptables默认使用的表,这个表定义了三个链(chains),工作场景主要是作为主机的防火墙。

INPUT链 负责过滤所有目标地址是本机地址的数据。通俗的讲,就是过滤进入主机的数据包。
FORWARD链 负责转发流经主机的数据包。起转发的作用,和nat关系很大,后面会详细介绍。 LVSNAT模式。net.ipv4.ip_forward = 0
OUTPUT链 处理所有源地址是本机地址的数据包。通俗的讲,就是处理从主机发去的数据包。

NAT

负责网络地址转换,即来源与目的ip地址和port的转换。主要应用于局域网共享上网或者特殊的端口转换服务相关。(和主机本身无关)
NAT功能一般用于的场景

  • 用于做企业路由或网关,共享上网。
  • 做内部IP地址一对一映射,硬件防火墙映射IP到内部服务器,FTP服务。
  • Web,单个端口映射,直接映射80端口

OUTPUT链 和主机发出去的数据包有关。改变主机发出数据包的目标地址。
PREROUTING链 在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址,目的端口等。(通俗的说就是收信时,根据规则重写收件人的地址)
POSTROUTING链 在数据包离开防火墙时进行路由判断之后的规则,作用改变数据包的源地址,源端口等。(通俗的说就是寄信的时候可以改变发件人的地址)

Mangle

主要负责修改数据包中特殊的路由标记,如TTL,TOS,MARK等。这个表定义了5个链
INPUT FORWARD OUTPUT PREROUTING POSTROUTING
这个表基本用不到知道即可

RAW

主要是用来控制数据包是否需要通过iptables来处理的一个表 比如web服务器流量很大80端口默认开着需要filter表的INPUT是否来通过 使用RAW表之后则这条就不需要经过iptables防火墙了直接忽略通 防止流量过高 iptables处理不过来提高服务器性能
链只有两个
PREROUTING和OUTPUT
在表中数据包最早经过就是RAW所以可以让iptables不处理对应的数据包

工作流程

过滤流程

iptables是采取包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析、并根据我们预先设定的规则进行匹配来判断之后进行的动作。下图为过滤的流程图
过滤流程

表链工作流程

下图为较为具体的工作流程图
详细图
下图为简易流程图
简易图
平常我们其实只需要顾及到nat的prerouting、postrouting和filter的input、forward以他的一般是用不到

命令

注意

  • CentOS6自带iptables 往后的版本应该都是改用firewalld防火墙了 使用iptables的话得stop服务或者mask服务 systemctl sotp/mask firwealld才行 之后不管是那个版本iptables应该都是自带的但是还缺一样东西iptables-services这个包安装之后才可以使用service iptables的命令来进行管理服务这个包很重要
  • 规则的动作丢弃比拒绝更好一些拒绝会回包丢弃是直接忽略还有一个理由就是说如果别人来判断你的主机是否存货拒绝的话就代表你的服务器存在 忽略的话他就会以为你这个东西不存在因为没有回包。

服务管理

systemctl start iptables        //开启服务
systemctl stop iptables        //关闭服务
systemctl enable iptables     //设置开机自启
systemctl disable iptables     //设置开机自动关闭
service iptables save         //保存当前设置下次开机之后会生效

Ps:在centos7版本之后默认不会安装iptables-services,如果需要使用服务管理则需要安装一下"yum -y install iptables-services",iptables默认会有一个配置表(/var/sysconfig/iptabels这个文件) 这个表记录这本机的所有的iptables配置 每次开机之后都会找这个文件使其里面的配置生效service iptables save就是把当前临时的配置保存到这个表里使下次重载或者重启时生效 这一步很重要

规则管理

iptables -L     //列出表的规则 默认不加任何参数输出的时filter表的规则
iptables -F     //清除所有的规则(无法清除默认的规则)
iptables -X    //删除用户自定义的链(用的很少)
iptables -N  //创建链(用的少)
iptables -Z  //把链的计数器清零

规则配置

iptables -t     //指定表
iptables -t [表] -A  //指定链以及添加规则的方式(在规则低端添加规则)
iptables -t [表] -I   //指定链以及添加规则的方式(在规则顶端添加规则)
iptables -t [表] -D   //指定链以及删除对应规则
iptables -t [表] -A/I [链] -p //指定ip协议tcp/udp
iptables -t [表] -A/I [链] –p [tcp/udp] --