Linux云计算 |【第二阶段】SECURITY-DAY5
iptables防火墙(4表、5链)、filter表控制、扩展匹配、nat表典型应用
主要内容:
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:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解
更多推荐
所有评论(0)