主要内容:

iptables防火墙(4表、5链)、filter表控制、扩展匹配、nat表典型应用

一、防火墙概述

1)防火墙技术:隔离内部网络和外部网络的隔离技术;

① 从逻辑上讲,防火墙可以大体分为主机防火墙和网络防火墙:

  • a) 主机防火墙:针对于单个主机进行防护
  • b) 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网;

网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体),主机防火墙主内(个人)

② 从物理上讲,防火墙可以分为硬件防火墙和软件防火墙:

  • a) 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高;
  • b) 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低;

2)Linux的防火墙体系主要针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙;

3)Linux防火墙相互调用关系:firewalld工具--->iptables工具--->netfilter安全框架;

  • a) RHEL7默认使用firewalld作为防火墙,但firewalld底层还是调用包过滤防火墙iptables;
  • b) iptables其实不是真正的防火墙,是一个命令行工具,位于用户空间,可把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”netfilter安全框架”中,而这个”安全框架”才是真正的防火墙;
  • c) netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间;

netfilter是Linux操作系统核心层内部的一个数据包处理模块,具有如下功能:

  • ① 网络地址转换(Network Address Translate)
  • ② 数据包内容修改;
  • ③ 数据包过滤的防火墙功能;

netfilter和iptables都用来指Linux防火墙,区别如下:

1)netfilter:

  • - 位于Linux内核中的包过滤功能体系
  • - 称为Linux防火墙的“内核态”

2)iptables:

  • - 位于/sbin/iptables,用来管理防火墙规则的工具
  • - 称为Linux防火墙的“用户态”
  • - iptables防火墙默认的规则表,链结构

二、iptables防火墙基础

iptables是按照规则来办事的,规则就是网络管理员预定义的条件,一般的定义为”假设数据包符合定义的条件,就按条件处理该数据包”;规则存储在内核空间的信息包过滤表中,配置iptabls防火墙的主要工作就是添加、修改和删除这些规则;

1)iptables的表、链结构

iptables防火墙具有“四表五链”,防火墙规则要求写在特定表的特定链中;

① 表的概念(“四表”)

概念:将具有相同功能的规则的集合叫做”表”,不同功能的规则放置在不同的表中进行管理;

  • - filter数据过滤表:负责过滤功能,防火墙(内核模块:iptables_filter)
  • - nat地址转换表:负责网络地址转换功能(内核模块:iptable_nat)
  • - mangle包标记表:负责拆解报文,做出修改,并重新封装的功能(内核模块:iptable_mangle)
  • - raw状态跟踪表:关闭nat表上启用的连接追踪机制(内核模块:iptable_raw)

② 链的概念(“五链”)

概念:配置的规则不止一条,将这些规则串到一个链条上的时候,就形成了”链”,当防火墙对经过的数据报文匹配规则时,都要将”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作;

  • - INPUT链:处理入站数据包
  • - OUTPUT链:处理出站数据包
  • - FORWARD链:处理转发数据包
  • - POSTROUTING链:在进行路由选择后处理数据包
  • - PREROUTING链:在进行路由选择前处理数据包

2)数据包过滤的匹配流程:

规则表之间的顺序:raw > mangle > nat > filter

规则链之间的顺序:

  • 入站:PREROUTING > INPUT
  • 出站:OUTPUT > POSTROUTING
  • 转发:PREROUTING > FORWARD > POSTROUTING

规则链内的匹配顺序:

  • ① 按顺序依次检查,匹配规则即停止(LOG策略例外)
  • ② 若找不到相匹配的规则,则按规则链的默认策略处理

3)iptables基本语法

管理程序位置: /sbin/iptables

  • 格式:iptables  [-t 表名]  链选项  [链名]  [条件]  [-j 控制类型]

规则表的常用选项:

[-t]  指定规则表(filter、nat、mangle、raw)

规则链的常用选项:(增、删、查)

类别

选项

描述

添加规则

-A

在规则链的末尾加一条规则

-I

在规则链的开头(或指定序号)插入一条规则

查看规则

-L

列出所有的规则条目

-n

以数字形式显示地址、端口等信息

--line-numbers

查看规则时,显示规则的序号

删除规则

-D

删除规则链内指定序号(或内容)的一条规则

-F

清空当前表的所有规则

默认策略

-P

为指定的规则链设置默认规则(策略)

数据包的常见控制类型:

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息(过了超时时间才会有回应)
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息
  • LOG:记录日志信息,然后传给下一条规则继续匹配
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题
  • DNAT:目标地址转换
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上(伪装IP)
  • REDIRECT:在本机做端口映射;

可查看相关帮助:man ipatables、iptables-apply、iptables-save、iptables-restore、iptables-extensions

注意事项:

  • 1)不指定表名时,默认指filter表
  • 2)不指定链名时,默认指表内的所有链
  • 3)除非设置链的默认策略,否则必须指定匹配条件(按顺序匹配,匹配即停止,如果没有找到匹配条件,则执行防火墙默认策略)
  • 4)选项、链名、控制类型使用大写字母,其余均为小写
  • 5)iptables规则都是临时规则,仅仅保存在内存中,下次重启后又默认重新载/etc/sysconfig/iptables防火墙配置文件。若想把当前添加的规则在重启后仍能使用,可以先通过/sbin/service iptables save命令,将当前规则保存至配置文件中。


案例:iptables的基本使用方法

案例要求:练习iptables命令的使用,按照要求完成以下任务:

  • 1)关闭firewalld,开启iptables服务
  • 2)查看防火墙规则
  • 3)追加、插入防火墙规则
  • 4)删除、清空防火墙规则

实验网络拓扑:

实验准备:关闭firewalld服务

[root@proxy ~]# systemctl stop firewalld.service   //停止服务
[root@proxy ~]# systemctl disable firewalld.service   //关闭服务

例如1:查看并添加规则(使client无法Ping访问proxy)

[root@proxy ~]# iptables -t filter -L    //列出filter表所有规则
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

补充:不指定规则表默认为filter表、不指定规则链默认为该表的所有规则链;

[root@proxy ~]# iptables -t filter -I INPUT -p icmp -j REJECT    //添加规则
[root@proxy ~]# iptables -t filter -L   
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  anywhere             anywhere             reject-with icmp-port-unreachable
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination       
  
[root@proxy ~]# iptables -t filter -nL   //以数字形式列出规则的地址、端口信息
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

 测试:

[root@client ~]# ping 192.168.4.5    //添加规则前(正常ping通)
PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data.
64 bytes from 192.168.4.5: icmp_seq=1 ttl=255 time=0.492 ms
64 bytes from 192.168.4.5: icmp_seq=2 ttl=255 time=0.387 ms
...
[root@client ~]# ping 192.168.4.5    //添加规则后(目标网络不可达)
PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data.
From 192.168.4.5 icmp_seq=1 Destination Port Unreachable
From 192.168.4.5 icmp_seq=2 Destination Port Unreachable
...

 更换数据包控制类型DROP

[root@proxy ~]# iptables -F    //清空filter表规则
[root@proxy ~]# iptables -t filter -I INPUT -p icmp -j DROP   //添加规则
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0           

测试:

[root@client ~]# ping 192.168.4.5     //添加规则后(访问目标地址无响应)
PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data.
^C
--- 192.168.4.5 ping statistics ---
50 packets transmitted, 0 received, 100% pa  cket loss, time 48999ms

例如2:追加、插入规则(-A、-I)

[root@proxy ~]# iptables -F    //清空filter表规则
[root@proxy ~]# iptables -nL INPUT   //列出INPUT链的规则
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
[root@proxy ~]# iptables -A INPUT -p tcp -j ACCEPT
[root@proxy ~]# iptables -A INPUT -p udp -j ACCEPT
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0   
  • 解释1:追加规则至filter表中INPUT链的末尾,允许任何人使用TCP协议访问本机;
  • 解释2:追加规则至filter表中INPUT链的末尾,允许任何人使用UDP协议访问本机;
[root@proxy ~]# iptables -I INPUT -p icmp -j ACCEPT
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0        
  • 解释3:插入规则至filter表中INPUT链的开头,允许任何人使用ICMP协议访问本机;
[root@proxy ~]# iptables -I INPUT 2 -p icmp -j ACCEPT           
[root@proxy ~]# iptables -nL INPUT --line-numbers   //查看规则,显示规则的序号
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0   
  • 解释4:插入规则至filter表中INPUT链的编号为2(第2行),允许任何人使用ICMP协议访问本机;

注意:添加规则中的条件,使用[-p]指定协议名或协议号(4层协议)

例如3:查看规则(-L、-nL)

[root@proxy ~]# iptables -L INPUT   //列出filter表的INPUT链所有规则
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            
ACCEPT     udp  --  anywhere             anywhere   
 
[root@proxy ~]# iptables -nL INPUT   //以数字形式列出规则的地址、端口信息
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0
 
[root@proxy ~]# iptables -nL INPUT --line-numbers   //查看规则,显示规则的序号
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0      

例如4:删除规则(-D、-F)

[root@proxy ~]# iptables -D INPUT 2    //删除filter表中INPUT链的第2条规则
[root@proxy ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0  
 
[root@proxy ~]# iptables -F     //不指定表,默认为filter表
解释:清空filter表中所有链的防火墙规则
[root@proxy ~]# iptables -t nat -F
解释:清空nat表中所有链的防火墙规则
[root@proxy ~]# iptables -t mangle -F
解释:清空mangle表中所有链的防火墙规则
[root@proxy ~]# iptables -t raw -F
解释:清空raw表中所有链的防火墙规则

例如5:设置防火墙默认规则(-P)

如果没有找到可匹配的规则条件,则执行防火墙默认策略

注意:默认规则只能设置DROP和ACCEPT(不需要[-j]指定)

[root@proxy ~]# iptables -F
[root@proxy ~]# iptables -t filter -P INPUT DROP   //设置INPUT默认规则为DROP
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target     prot opt source      destination  

注意:此时修改默认规则为DROP,且规则下并未设置其它允许SSH数据包访问,则导致SSH访问中断,需要通过virt-manager打开虚拟机终端进行默认规则修改;

[root@proxy ~]# iptables -t filter -P INPUT ACCEPT   /设置INPUT默认规则为ACCEPT
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination  

补充:按照匹配顺序:先匹配规则,若没有找到可匹配的规则,再执行防火墙默认策略;

例如1:有可匹配的规则,则执行ACCEPT规则,默认规则(policy DROP)忽略

[root@proxy ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
[root@proxy ~]# iptables -t filter -P INPUT DROP
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

例如2:按照匹配顺序,由于第一条规则未有操作类型,最终执行可匹配的规则ACCEPT;

[root@proxy ~]# iptables -F
[root@proxy ~]# iptables -A INPUT -p icmp    //不指定操作类型,按默认规则处理
[root@proxy ~]# iptables -A INPUT -p icmp -j ACCEPT
[root@proxy ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
           icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

例如3:按照匹配顺序,最终执行可匹配的规则ACCEPT;

[root@proxy ~]# iptables -F
[root@proxy ~]# iptables -A INPUT -p icmp -j ACCEPT
[root@proxy ~]# iptables -A INPUT -p icmp -j DROP
[root@proxy ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
DROP       icmp --  0.0.0.0/0            0.0.0.0/0  

二、filter过滤和转发控制

根据防火墙保护的对象不同,防火墙可以分为主机型防火墙与网络型防火墙,

  • 主机型防火墙:主要保护的是服务器本机(过滤威胁本机的数据包)
  • 网络型防火墙:主要保护的是防火墙后面的其他服务器(如web服务器、FTP服务器等)

1)基本的匹配条件

通用匹配:可直接使用,不依赖于其它条件或扩展;(包括网络协议、IP地址、网络接口等条件)

隐含匹配:要求以特定的协议匹配作为前提;(包括端口、TCP标记、ICMP类型等条件)

类别

选项

用法

通用匹配

协议匹配

-p 协议名

地址匹配

-s 源地址、-d目标地址

接口匹配

-i 接收数据的网卡、-o 发送数据的网卡

隐含匹配

端口匹配

--sport 源端口、--dport 目标端口

ICMP类型匹配

--icmp-type ICMP类型(reguest请求、reply回应)

需要取反条件时,用叹号【!】

补充:生产环境中,假设客户端浏览器访问目标WEB服务器,防火墙设置了浏览器服务的源端口限制,由于浏览器服务的源端口是随机的,设了限制也会失效,所以一般情况下不会限制--sport端口,除非源端口固定;

案例1:主机型防火墙案例

插入过滤规则,拒绝所有主机使用tcp协议访问本机的80端口

[root@proxy ~]# iptables -I INPUT -p tcp --dport 80 -j REJECT

插入过滤规则,拒绝192.168.2.100访问本机

[root@proxy ~]# iptables -I INPUT -s 192.168.2.100 -j REJECT

插入过滤规则,拒绝使用tcp协议访问本机192.168.2.5的80端口

[root@proxy ~]# iptables -I INPUT -d 192.168.2.5 -p tcp --dport 80 -j REJECT

插入过滤规则,拒绝eth0网卡接收数据是使用tcp协议访问本机的80端口

[root@proxy ~]# iptables -I INPUT -i eth0 -p tcp --dport 80 -j REJECT

追加过滤规则,丢弃192.168.2.0/24网络中所有主机发送给本机的所有数据包

[root@proxy ~]# iptables -A INPUT -s 192.168.2.0/24 -j DROP

追加过滤规则,拒绝114.212.33.12使用tcp协议远程连接本机ssh(22端口)

[root@proxy ~]# iptables -A INPUT -s 114.212.33.12 -p tcp --dport 22 -j REJECT


案例2:网络型防火墙案例

网络型防火墙的网络拓扑:

注意:由于跨不同网段,proxy主机的路由转发功能需要打开;

步骤1:网络环境准备

1)client主机配置IP、添加网关

[root@client ~]# nmcli connection modify eth0 ipv4.method manual \
ipv4.addresses 192.168.4.10/24 autoconnect yes
[root@client ~]# nmcli connection modify eth0 ipv4.gateway 192.168.4.5
[root@client ~]# nmcli connection up eth0
[root@client ~]# iptables -F

2)proxy主机配置两个不同网段的IP,并开启路由转发

[root@proxy ~]# nmcli connection modify eth0 ipv4.method manual \
ipv4.addresses 192.168.4.5/24 autoconnect yes
[root@proxy ~]# nmcli connection up eth0
[root@proxy ~]# nmcli connection modify eth1 ipv4.method manual \
ipv4.addresses 192.168.2.5/24 autoconnect yes
[root@proxy ~]# nmcli connection up eth1
[root@proxy ~]# iptables -F

Linux内核默认支持软路由功能,通过修改内核参数即可开启或关闭路由转发功能

[root@proxy ~]# echo 0 > /proc/sys/net/ipv4/ip_forward     //关闭路由转发
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward     //开启路由转发

补充:以上操作仅当前有效,计算机重启后无效;

[root@proxy ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf

补充:修改/etc/sysctl.conf配置文件,可以实现永久有效规则;

3)web1主机配置IP、添加网关

[root@web1 ~]# nmcli connection modify eth0 ipv4.method manual \
ipv4.addresses 192.168.2.100/24 autoconnect yes
[root@web1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.2.5
[root@web1 ~]# nmcli connection up eth0

测试:使用client访问web1确定网络连通性(192.168.4.10 --> 192.168.2.100)

[root@client ~]# ping 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=254 time=0.775 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=254 time=1.01 ms

4)web1主机上启动http服务

[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "test page" > /var/www/html/index.html
[root@web1 ~]# cat /var/www/html/index.html
test page
[root@web1 ~]# systemctl restart httpd
[root@web1 ~]# ss -nlptu | grep :80
tcp    LISTEN     0      128      :::80                   :::*                   users:(("httpd",pid=649,fd=4),("httpd",pid=648,fd=4),("httpd",pid=647,fd=4),("httpd",pid=646,fd=4),("httpd",pid=645,fd=4),("httpd",pid=644,fd=4))

测试:没有防火墙规则的情况下client访问web服务

[root@client ~]# curl http://192.168.2.100    //正常访问
test page

步骤2:设置proxy主机的防火墙规则,保护防火墙后面的Web服务器

[root@proxy ~]# iptables -I FORWARD -s 192.168.4.10 -p tcp --dport 80 -j REJECT     //使用FORWARD链,处理转发数据包
[root@proxy ~]# iptables -nL FORWARD
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  192.168.4.10         0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable

测试:有防火墙规则的情况下client访问web服务

[root@client ~]# curl http://192.168.2.100    //拒绝访问
curl: (7) Failed connect to 192.168.2.100:80; 拒绝连接

 


案例3:禁ping的相关策略

ping的流程(A主机—ping—B主机)如图所示:

1)思考:直接禁ICMP所导致问题

[root@proxy ~]# iptables -I INPUT -p icmp -j DROP    //拒绝所有使用ICMP协议访问的主机
  • 问题1:设置规则后,其他主机确实无法ping本机,本机也无法ping其他主机;
  • 问题2:当本机ping其他主机,其他主机回应也是使用icmp,导致对方的回应被丢弃;

2)禁止其他主机ping本机,允许本机ping其他主机(--icmp-type ICMP类型)

[root@proxy ~]# iptables -F
[root@proxy ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8

解释:仅禁止入站的ping请求(reguest请求),但 不拒绝入站的ping回应包(reply回应)

验证:使用client通过ping访问proxy

[root@client ~]# ping 192.168.4.5    //Ping失败
PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data.
^C
--- 192.168.4.5 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms

验证:使用proxy通过ping访问client

[root@proxy ~]# ping 192.168.4.10   //Ping成功
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
64 bytes from 192.168.4.10: icmp_seq=1 ttl=255 time=0.413 ms
64 bytes from 192.168.4.10: icmp_seq=2 ttl=255 time=0.506 ms

 

 补充:关于ICMP的类型,可以参考help帮助

[root@proxy ~]# iptables -p icmp --help
echo-reply (pong)
echo-request (ping)
...

三、防火墙扩展规则

前提:有对应的防火墙模块支持

常见的扩展条件类型:

类别

选项

用法

扩展匹配

MAC地址匹配

-m mac --mac-source MAC地址

多端口匹配

-m multiport --sports 源端口列表

-m multiport --dports 目标端口列表

IP范围匹配

-m iprange --src-range IP1-IP2

-m iprange --drc-range IP1-IP2

案例要求:熟悉使用iptables的扩展规则,实现更丰富的过滤功能,完成以下任务:

  • 1)根据MAC地址封锁主机
  • 2)在一条规则中开放多个TCP服务
  • 3)根据IP范围设置封锁规则

iptables防火墙在基本过滤条件的基础上还扩展了很多其他条件,需使用[-m]参数来启动扩展功能;

  • 格式:iptables 选项 链名称 -m 扩展模块 --具体扩展条件 -j 操作类型
  • 查看帮助:man ipatables、iptables-extensions


案例1:根据MAC地址过滤(mac)

1)思考:根据IP过滤的规则,当对方修改IP后,防火墙会失效

[root@proxy ~]# iptables -I INPUT -s 192.168.4.10 -p tcp --dport 22 -j DROP

解释:禁止192.168.4.10使用ssh远程本机,但当client主机修改IP地址后,该规则就会失效;所以可根据MAC地址过滤,可以防止这种情况的发生;

2)根据MAC地址,设置规则过滤

方法1:使用nmap扫描对方主机的MAC地址(软件包:nmap-6.40-13.el7.x86_64)

[root@proxy ~]# nmap -n -sP 192.168.4.10
Starting Nmap 6.40 ( http://nmap.org ) at 2021-05-11 15:45 CST
Nmap scan report for 192.168.4.10
Host is up (0.00030s latency).
MAC Address: 52:54:00:75:08:5D (QEMU Virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

方法2:查看client的MAC地址信息

[root@client ~]# ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:75:08:5d brd ff:ff:ff:ff:ff:ff

添加防火墙规则,过滤MAC地址,使用扩展模块mac,条件--mac-source

[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 52:54:00:75:08:5D -j REJECT

解释:拒绝mac地址是52:54:00:75:08:5D的主机使用tcp协议远程本机ssh(22端口)

验证:使用client通过SSH访问proxy,查看效果

[root@client ~]# ssh 192.168.4.5
ssh: connect to host 192.168.4.5 port 22: Connection refused


案例2:基于多端口设置过滤规则(multiport)

1)添加防火墙规则,一次过滤多端口,使用扩展模块multiport,条件--dports

[root@proxy ~]# iptables -A INPUT -p tcp -m multiport --dports 20,25,80,110,143,16501:16800 -j DROP
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 20,25,80,110,143,16501:16800

解释:一次性拒绝TCP协议是20,25,80,110,143,16501到16800的所有端路口

注意:由于限制的是个多个目的端口,--dport需加s(即--dports,--sports同理)

提示:多端口还可限制多个源端口,但因为源端口不固定,一般不会使用,限制多个源端口的参数是--sports.


案例3:根据IP地址范围设置规则(iprange)

1)禁止从 192.168.4.0/24 网段其他的主机ssh远程登录本机

[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP

2)允许从 192.168.4.10-192.168.4.20 主机ssh远程登录本机

[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEPT
[root@proxy ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 source IP range 192.168.4.10-192.168.4.20

常见报错:设置IP范围顺序要从小到大

xt_iprange: range 192.168.4.255-10.7.5.20 is reversed and will never match

正常输入:

[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 10.7.5.20-192.168.4.255 -j ACCEPT

四、配置SNAT实现共享上网

案例要求:设置防火墙规则,允许位于局域网中的主机可以访问外网,主要包括下列服务:

  • 1)搭建内外网案例环境
  • 2)配置SNAT策略实现共享上网访问

实验拓扑图:

假设192.168.2.0/24网络为外部网络,192.168.4.0/24为内部网络;

在外部网络中有一台web1服务器192.168.2.100,因都设置了网关,client可以访问此web服务器。但如果查看web1的日志就会发现,日志里记录的是192.168.4.10在访问网页,并没有实现NAT的地址转换(生产环境中,外网web服务器收到的应该是proxy的地址,而不是proxy不做NAT转换,直接转发出来的web1私网地址)

[root@web1 ~]# cat /var/log/httpd/access_log
192.168.4.10 - - [11/May/2021:14:49:45 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.4.10 - - [11/May/2021:14:52:43 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"

所以需要实现的效果是client访问web1服务器,要将192.168.4.10数据包源地址NAT通过proxy转换为地址192.168.2.5后再访问web服务器(模拟公司内部的电脑使用的是私有IP,访问外网就需要NAT转换为公司的外网IP后才可以访问公网的服务)

步骤1:设置防火墙规则,实现IP地址的伪装

1)确保proxy主机开启了路由转发功能

[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward      //开启路由转发
[root@proxy ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf

2)设置防火墙规则,实现SNAT地址转换

[root@proxy ~]# iptables -F
[root@proxy ~]# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j SNAT --to-source 192.168.2.5
[root@proxy ~]# iptables -t nat -nL POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       tcp  --  192.168.4.0/24       0.0.0.0/0            tcp dpt:80 to:192.168.2.5

解释:SNAT源地址转换,--to-source外网接口的源IP地址;

测试:Client访问web1网页,并登陆web1主机查看HTTPD访问日志

[root@client ~]# curl 192.168.2.100
test page
[root@web1 ~]# cat /var/log/httpd/access_log
192.168.4.10 - - [11/May/2021:14:49:45 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.2.5 - - [11/May/2021:17:17:19 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"

通过日志会发现,客户端是先转化成192.168.2.5之后访问web服务器!

扩展知识:地址伪装策略

主要针对外网接口的IP不固定的情况,可以执行下面的地址伪装,动态伪装IP

[root@proxy ~]# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE

补充:iptables规则都是临时规则,如果需要永久保留规则需要执行如下命令:

安装iptables-services并启动服务,保存防火墙规则。

[root@proxy ~]# yum -y install iptables-services
[root@proxy ~]# systemctl start iptables.service
[root@proxy ~]# systemctl enable iptables.service
[root@proxy ~]# service iptables save    //保存防火墙规则
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

例如:

[root@proxy ~]# iptables -I FORWARD -s 192.168.4.10 -p tcp --dport 80 -j REJECT
[root@proxy ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@proxy ~]# cat /etc/sysconfig/iptables     //查看
# Generated by iptables-save v1.4.21 on Tue May 11 17:33:28 2021
*nat
:PREROUTING ACCEPT [28:3252]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Tue May 11 17:33:28 2021
# Generated by iptables-save v1.4.21 on Tue May 11 17:33:28 2021
*filter
:INPUT ACCEPT [14:1024]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [8:1216]
-A FORWARD -s 192.168.4.10/32 -p tcp -m tcp --dport 80 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Tue May 11 17:33:28 2021

思维导图:

小结:

本篇章节为【第二阶段】SECURITY-DAY5 的学习笔记,这篇笔记可以初步了解到 iptables防火墙(4表、5链)、filter表控制、扩展匹配、nat表典型应用。除此之外推荐参考相关学习网址:


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐