linux学习

linux防火墙-iptables命令详解

一、iptable介绍

iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter

netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。

iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

1、四表

具有相同功能的规则的集合叫做”表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能

但是我们知道,iptables为我们定义了4张”表”,当他们处于同一条”链”时,执行的优先级如下。

优先级次序(由高而低):

raw –> mangle –> nat –> filter

但是我们前面说过,某些链天生就不能使用某些表中的规则,所以,4张表中的规则处于同一条链的目前只有output链,它就是传说中海陆空都能防守的关卡。

表名 作用 说明
filter(常用) 负责过滤功能,根据具体的规则要求决定如何处理一个数据包,内核模块:iptables_filter INPUT、FORWARD、OUTPUT 顾名思义是用来进行封包过滤的处理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。
nat(常用) network address translation,网络地址转换功能,用来修改数据包的 ip 地址,端口号等信息,内核模块:iptable_nat PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有) 主要功能为进行一对一、一对多、多对多等网址转译工作(SNAT、DNAT),由于转译工作的特性,需进行目的地址转译的封包,就不需要进行来源地址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作地址转译外,请不要做其它用途。
mangle 拆解报文,做出修改,并重新封装 的功能;用来修改数据包的服务类型、生命周期,或者设置mark标记实现流量整形等高级应用,内核模块:iptable_mangle PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw 关闭nat表上启用的连接追踪机制;主要用来决定是否对数据包进行状态跟踪,内核模块:iptable_raw PREROUTING,OUTPUT 在iptables中,raw表主要用于处理数据包的链接状态,对于未建立连接的数据包进行处理。它只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在系统进行ip_conntrack(连接跟踪)前进行处理。一旦用户使用了RAW表,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理。

2、五链

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables 默认划分为五种不同的规则链:

链名 作用 说明
INPUT 当收到访问防火墙本机地址的数据包时,应用此链中的规则 mangle表、filter表、(centos7中还有nat表,centos6中没有)
OUTPUT 当防火墙本机向外发送数据包时,应用此链中的规则 raw表、mangle表、nat表、filter表
FORWARD 当接收到需要通过防火墙中转发送给其他地址的数据包时,应用此链中的规则 mangle表、filter表
PREROUTING 在对数据包做路由选择之前,应用此链中的规则 raw表、mangle表、nat表 位于nat表,用于修改目的地址(DNAT),要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器。 PREOUTING 链不支持 ”流出接口”-o 参数
POSTROUTING 在对数据包做路由选择之后,应用此链中的规则 mangle表、nat表 位于nat表,用于修改源地址(SNAT),要把你的内网地址转换成公网地址才能让你上网。对于每个网卡数据流入的时候必然经过pre,数量流出必然经过post。他们之间是相对的关系。 POSTROUTING 链不支持”流入接口”-i 参数。

为了更方便的管理,我们还可以在某个表里面创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但是自定义链接不能直接使用,只能被某个默认的链当做动作去调用才能起作用,我们可以这样想象,自定义链就是一段比较”短”的链子,这条”短”链子上的规则都是针对某个应用程序制定的,但是这条短的链子并不能直接使用,而是需要”焊接”在iptables默认定义链子上,才能被IPtables使用,这就是为什么默认定义的”链”需要把”自定义链”当做”动作”去引用的原因。

img

二、iptables的安装

1、关闭防火墙

[root@localhost ~]# systemctl status firewalld
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# systemctl list-unit-files | grep firewalld
firewalld.service                             disabled

2、查看iptables是否安装

iptables 是基于内核的,和 iptables-services 没有关系,不用安装任何工具包就可以使用 iptable 命令添加的防火墙规则,只是添加的规则是临时的,基于内存的,在系统重启后会消失,所以需要 iptables.service 服务来对添加的规则进行保存来对添加的规则进行保存,这样在系统重启后重载对应的防火墙规则。

[root@localhost ~]# rpm -qa iptables
iptables-1.4.21-34.el7.x86_64                              # 系统默认装有 iptables
[root@localhost ~]# yum install iptables                   # 有新版本会安装最新版本
[root@localhost ~]# rpm -qa iptables
iptables-1.4.21-35.el7.x86_64
[root@localhost ~]# yum install iptables-services          # 安装 iptables-services 
[root@localhost ~]# rpm -qa iptables-services
iptables-services-1.4.21-35.el7.x86_64

3、启动iptables

设置iptables开机自启

[root@localhost ~]# systemctl enable iptables.service        # 设置 iptables 开机启动[root@localhost ~]# systemctl list-unit-files | grep iptables.service
iptables.service                              enabled 
[root@localhost ~]# systemctl start iptables                 # 开启 iptables[root@localhost ~]# systemctl status iptables                # 查看 iptables 状态
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: active (exited) since Fri 2023-10-06 13:05:53 CST; 2s ago
  Process: 3141 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
 Main PID: 3141 (code=exited, status=0/SUCCESS)

Oct 06 13:05:53 localhost.localdomain systemd[1]: Starting IPv4 firewall with iptables...
Oct 06 13:05:53 localhost.localdomain iptables.init[3141]: iptables: Applying firewall rules: [  OK  ]
Oct 06 13:05:53 localhost.localdomain systemd[1]: Started IPv4 firewall with iptables.
[root@localhost ~]# systemctl status iptables                 # 查看 iptables 状态

三、iptables的使用

1、匹配条件

匹配条件分为基本匹配条件与扩展匹配条件

  1. 基本匹配条件:源地址Source IP,目标地址 Destination IP
  2. 扩展匹配条件:源端口Source Port, 目标端口Destination Port

2、处理动作

处理动作在iptables中被称为target(这样说并不准确):

ACCEPT:允许数据包通过。

DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。

SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。

MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。

DNAT:目标地址转换。

REDIRECT:在本机做端口映射。

LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

3、使用iptables查看表的规则

iptables -t 表名 -L

查看对应表的所有规则,-t选项指定要操作的表,省略”-t 表名”时,默认表示操作filter表,-L表示列出规则,即查看规则。

iptables -t 表名 -L 链名

查看指定表的指定链中的规则。

iptables -t 表名 -v -L

查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出”计数器”的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL

iptables -t 表名 -n -L

表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。

iptables --line-numbers -t 表名 -L

表示查看表的所有规则,并且显示规则的序号,–line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为- -line,注意,简写后仍然是两条横杠,仍然是长选项。

iptables -t 表名 -v -x -L

表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。

实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以filter表为例

iptables --line -t filter -nvxL

当然,也可以只查看某张表中的某条链,此处以filter表的INPUT链为例

iptables --line -t filter -nvxL INPUT

4、修改规则

1、添加规则

注意点:添加规则时,规则的顺序非常重要

在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的**末尾**添加规则,省略-t选项时,表示默认操作filter表中的规则

命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作
示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP

在指定表的指定链的**首部**添加一条规则,-I选型表示在对应链的开头添加规则

命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作
示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT

在指定表的指定链的指定位置添加一条规则

命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT

设置指定表的指定链的默认策略(默认动作),并非添加规则。

命令语法:iptables -t 表名 -P 链名 动作
示例:iptables -t filter -P FORWARD ACCEPT

上例表示将filter表中FORWARD链的默认策略设置为ACCEPT

黑名单与白名单:

当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是”黑名单”机制。

同理,当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是”白名单”机制。

2、删除规则

注意:如果没有保存规则,删除规则时请慎重

按照规则序号删除规则,删除指定表的指定链的指定规则,-D选项表示删除对应链中的规则。

命令语法:iptables -t 表名 -D 链名 规则序号
示例:iptables -t filter -D INPUT 3

上述示例表示删除filter表中INPUT链中序号为3的规则。

按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。

命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作
示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP

上述示例表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则。

删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则,执行时需三思。

命令语法:iptables -t 表名 -F 链名
示例:iptables -t filter -F INPUT
3、修改规则

注意:如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。

修改指定表中指定链的指定规则,-R选项表示修改对应链中的规则,使用-R选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略。

命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作
示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT

上述示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 192.168.1.146为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0。

其他修改规则的方法:先通过编号删除规则,再在原编号位置添加一条规则。

修改指定表的指定链的默认策略(默认动作),并非修改规则,可以使用如下命令。

命令语法:iptables -t 表名 -P 链名 动作
示例:iptables -t filter -P FORWARD ACCEPT

上例表示将filter表中FORWARD链的默认策略修改为ACCEPT

4、保存规则

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

service iptables save

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

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

iptables-save > /etc/sysconfig/iptables

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

iptables-restore < /etc/sysconfig/iptables

5、条件匹配

1、基本匹配条件总结

-s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。

#示例如下
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT

-d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。

#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT

-p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)。

#示例如下
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT

-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。

#示例如下
iptables -t filter -I INPUT -p icmp -i eth4 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP

-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。

#示例如下
iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP
2、扩展匹配条件总结

1.tcp扩展模块

常用的扩展匹配条件如下:

-p tcp -m tcp –sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

-p tcp -m tcp –dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

2.multiport扩展模块

常用的扩展匹配条件如下:

-p tcp -m multiport –sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开

-p udp -m multiport –dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开

#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

3.udp扩展

常用的扩展匹配条件

–sport:匹配udp报文的源地址

–dport:匹配udp报文的目标地址

#示例
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT
#可以结合multiport模块指定多个离散的端口

4.icmp扩展

常用的扩展匹配条件

–icmp-type:匹配icmp报文的具体类型

img

从上图可以看出,所有表示”目标不可达”的icmp报文的type码为3,而”目标不可达”又可以细分为多种情况,是网络不可达呢?还是主机不可达呢?再或者是端口不可达呢?所以,为了更加细化的区分它们,icmp对每种type又细分了对应的code,用不同的code对应具体的场景, 所以,我们可以使用type/code去匹配具体类型的ICMP报文,比如可以使用”3/1″表示主机不可达的icmp报文。上图中的第一行就表示ping回应报文,它的type为0,code也为0,从上图可以看出,ping回应报文属于查询类(query)的ICMP报文,从大类上分,ICMP报文还能分为查询类与错误类两大类,目标不可达类的icmp报文则属于错误类报文。

而我们发出的ping请求报文对应的type为8,code为0。

#示例
  iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
  iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
  iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT
  iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT
  iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

5.state模块

可以让iptables实现”连接追踪”机制。对于state模块而言的”连接”并不能与tcp的”连接”画等号,在TCP/IP协议簇中,UDP和ICMP是没有所谓的连接的,但是对于state模块来说,tcp报文、udp报文、icmp报文都是有连接状态的,我们可以这样认为,对于state模块而言,只要两台机器在”你来我往”的通信,就算建立起了连接,如下图所示:

img

对于state模块的连接而言,”连接”其中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED

NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。

ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。

img

RELATED

例如:FTP服务,FTP服务端会建立两个进程,一个命令进程,一个数据进程。

命令进程负责服务端与客户端之间的命令传输(我们可以把这个传输过程理解成state中所谓的一个”连接”,暂称为”命令连接”)。

数据进程负责服务端与客户端之间的数据传输 ( 我们把这个过程暂称为”数据连接” )。

但是具体传输哪些数据,是由命令去控制的,所以,”数据连接”中的报文与”命令连接”是有”关系”的。

那么,”数据连接”中的报文可能就是RELATED状态,因为这些报文与”命令连接”中的报文有关系。

(注:如果想要对ftp进行连接追踪,需要单独加载对应的内核模块nf_conntrack_ftp,如果想要自动加载,可以配置/etc/sysconfig/iptables-config文件)

INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。

UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。

可使用state扩展模块解决,我们只要放行状态为ESTABLISHED的报文即可,因为如果报文的状态为ESTABLISHED,那么报文肯定是之前发出的报文的回应,如果你还不放心,可以将状态为RELATED或ESTABLISHED的报文都放行,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙

[root@zabbix-agent ~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

当前主机IP为104,当放行ESTABLISHED与RELATED状态的包以后,并没有影响通过本机远程ssh到IP为77的主机上,但是无法从77上使用22端口主动连接到104上。

对于其他端口与IP来说,也是相同的,可以从104主动发送报文,并且能够收到响应报文,但是其他主机并不能主动向104发起请求。

#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

6、自定义链

自定义链并不能直接使用,而是需要被默认链引用才能够使用

创建自定义链:

#示例:在filter表中创建IN_WEB自定义链
iptables -t filter -N IN_WEB

引用自定义链:

#示例:在INPUT链中引用刚才创建的自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

重命名自定义链:

#示例:将IN_WEB自定义链重命名为WEB
iptables -E IN_WEB WEB

删除自定义链:

删除自定义链需要满足两个条件

1、自定义链没有被引用

2、自定义链中没有任何规则

#示例:删除引用计数为0并且不包含任何规则的WEB链
iptables -X WEB

7、网络防火墙

防火墙从逻辑上讲,可以分为主机防火墙与网络防火墙。

主机防火墙:针对于单个主机进行防护。

网络防火墙: 往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。

网络防火墙往往处于网络的入口或者边缘,那么,如果想要使用iptables充当网络防火墙,iptables所在的主机则需要处于网络入口处,示意图如下:

img

上图中,橘黄色主机为iptables所在主机,此时iptables充当的角色即为网络防火墙,上图中的浅蓝色圆形表示网络防火墙所防护的网络区域,圆形内的蓝色矩形表示网络内的主机。

当外部网络中的主机与网络内部主机通讯时,不管是由外部主机发往内部主机的报文,还是由内部主机发往外部主机的报文,都需要经过iptables所在的主机,由iptables所在的主机进行”过滤并转发”,所以,防火墙主机的主要工作就是”过滤并转发”,iptables报文流程图,如下:

img

iptables都是作为”主机防火墙”的角色出现的,所以我们举例时,只用到了上图中的INPUT链与OUTPUT链,因为拥有”过滤功能”的链只有3条,INPUT、OUTPUT、FORWARD,当报文发往本机时,如果想要过滤,只能在INPUT链与OUTPUT链中实现,而此时,iptables的角色发生了转变,我们想要将iptables所在的主机打造成”网络防火墙”,而刚才已经说过,网络防火墙的职责就是”过滤并转发”,要想”过滤”,只能在INPUT、OUTPUT、FORWARD三条链中实现,要想”转发”,报文则只会经过FORWARD链(发往本机的报文才会经过INPUT链),所以,综上所述,iptables的角色变为”网络防火墙”时,规则只能定义在FORWARD链中。

#如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文。
#使用如下命令查看当前主机是否已经开启了核心转发,0表示未开启,1表示已开启
cat /proc/sys/net/ipv4/ip_forward
#使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。
方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
方法二:sysctl -w net.ipv4.ip_forward=1
#使用如下方法开启核心转发功能,重启网络服务后永久生效。
配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1

#由于iptables此时的角色为"网络防火墙",所以需要在filter表中的FORWARD链中设置规则。
#可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。
#配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。
#示例为允许网络内主机访问网络外主机的web服务与sshd服务。
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT

#可以使用state扩展模块,对上述规则进行优化,使用如下配置可以省略许多"回应报文放行规则"。
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注