【Linux】Iptables 详解与实战案例
netfilter/iptables(简称为iptables)组成 Linux 平台下的网络数据包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。...
目录
五、IPtables中SNAT、DNAT和MASQUERADE的详细含义
一、iptables简介
netfilter/iptables(简称为iptables)组成 Linux 平台下的网络数据包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的 主要工作就是添加、修改和删除这些规则。
二、iptables的表tables与链chains
iptables有Filter, NAT, Mangle, Raw四种内建表。
2.1 四种内建表
2.1.1 Filter表
Filter是iptables的默认表,它有以下三种内建链(chains):
- INPUT链 – 处理来自外部的数据。
- OUTPUT链 – 处理向外发送的数据。
- FORWARD链 – 将数据转发到本机的其他网卡设备上。
2.1.2 NAT表
NAT表有三种内建链:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT), MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat。
OUTPUT链 – 处理本机产生的数据包。
2.1.3 Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链(chains):
- PREROUTING
- OUTPUT
- FORWARD
- INPUT
- POSTROUTING
2.1.4 Raw表
Raw表用于处理异常,它具有2个内建链:
- PREROUTING chain
- OUTPUT chain
2.2 五种规则链
规则链名包括(也被称为五个钩子函数(hook functions)):
- INPUT链 :处理输入数据包。
- OUTPUT链 :处理输出数据包。
- FORWARD链 :处理转发数据包。
- PREROUTING链 :用于目标地址转换(DNAT)。
- POSTOUTING链 :用于源地址转换(SNAT)。
2.3 iptables和netfilter的关系
Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。
2.4 iptables传输数据包的过程
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
2.5 iptables的规则表和链总结
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
三、iptables使用
3.1 iptables的基本语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。
3.2 iptables命令的管理控制选项
- -A 在指定链的末尾添加(append)一条新的规则
- -D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
- -I 在指定链中插入(insert)一条新的规则,默认在第一行添加
- -R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
- -L 列出(list)指定链中所有的规则进行查看
- -E 重命名用户定义的链,不改变链本身
- -F 清空(flush)
- -N 新建(new-chain)一条用户自己定义的规则链
- -X 删除指定表中用户自定义的规则链(delete-chain)
- -P 设置指定链的默认策略(policy)
- -Z 将所有表的所有链的字节和数据包计数器清零
- -n 使用数字形式(numeric)显示输出结果
- -s 原地址(source)
- -o 数据包输出,输出(out interface)
- -v 查看规则表详细信息(verbose)的信息
- -V 查看版本(version)
- -h 获取帮助(help)
3.3 防火墙处理数据包的四种方式
- ACCEPT 允许数据包通过
- DROP 直接丢弃数据包,不给任何回应信息
- REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
- LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
3.4 常用命令使用
1.查看iptables规则
iptables -L # 查看iptables规则
iptables -L -vn # 查看iptables规则(详细信息)
2.清空iptables规则
iptables -F # 清除所有规则,不会处理默认的规则
iptables -X # 删除用户自定义的链
iptables -Z # 链的计数器清零(数据包计数器与数据包字节计数器)
3.配置允许ssh端口连接
# 22为你的ss·h端口(可修改), -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
iptables -A INPUT -s 192.168.2.0/24 -p tcp --dport 22 -j ACCEPT
4.允许本地回环地址可以正常使用
# 本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
5.禁止某个IP访问
iptables -A INPUT -s 192.168.2.3 -i ens33 -j DROP
iptables -A INPUT -s 192.168.2.4 -i ens33 -j DROP
iptables -I INPUT -p tcp -s 192.168.2.1 -i ens33 -j DROP
选项解释:
-s # 指定源地址或网段(192.168.1.0/24)。 ! 取反;
-d # 指定目的地址(nat表prerouting);
-i # 进入的网络接口(ens33,ens37);
-o # 出去的网络接口(ens33,ens37);
6.匹配端口范围
##限制默认端口访问
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT
##允许访问默认 22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
##本机访问本机
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
##允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
##允许FTP服务的20端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
7.匹配ICMP类型
CMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
8.端口映射
--------------
iptables -t nat -A PREROUTING -d 192.168.1.111 -p tcp --dport 9999 -j DNAT --to-destination 192.168.1.112:22
命令拆解:
===> 规则表:NAT
===> 匹配链:PREROUTING
===> 源IP:10.0.1.61
===> 源端口:9000
===> 协议:tcp
===> 动作:DNAT
===> 目标IP:172.16.1.7
===> 目标端口:22
-------------
# 本机的 2222 端口映射到内网 虚拟机的22 端口
iptables -t nat -A PREROUTING -d 192.168.1.113 -p tcp --dport 2222 -j DNAT --to-dest 192.168.1.115:22
9.IP映射
# 将 192.168.1.116 的访问请求转发到 192.168.1.117
iptables -t nat -A PREROUTING -d 192.168.1.114 -j DNAT --to-destination 192.168.1.115
10.阻止Windows蠕虫
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
11.防止SYN洪水
DoS是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。
SYN Flood(半开放攻击)是一种拒绝服务(DDoS)攻击,其目的是通过消耗所有可用的服务器资源使服务器不可用于合法流量。通过重复发送初始连接请求(SYN)数据包(三次握手中),攻击者能够压倒目标服务器机器上的所有可用端口,导致目标设备根本不响应合法流量。
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
四、实战需求
4.1 Zookeeper禁用默认端口
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Zookeeper的默认开放端口是2181。Zookeeper 安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用 Zookeeper,通过服务器收集敏感信息或者在 Zookeeper 集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许由管理员运行的命令。
##禁用2181端口
iptables -A INPUT -p tcp --dport 2181 -j DROP
##禁用2181端口
#是因为有dnat,不走input链,直接走forward链了, 在forward链配置就生效了禁用2181端口
iptables -A FORWARD -p tcp --dport 2181 -j DROP
###放开2181
iptables -I INPUT -s 192.168.3.0/24 -p tcp --dport 2181 -j ACCEPT
4.2 导出 iptables
[root@docker ~]# iptables-save > iptables
[root@docker ~]# cat iptables
###Generated by iptables-save v1.4.21 on Sat Jun 18 14:55:56 2022
*filter
:INPUT ACCEPT [67:5935]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [165:17764]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -s 192.168.3.0/24 -p tcp -m tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 21,22,23,24 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 21,22,23,24 -j DROP
-A INPUT -s 192.168.2.1/32 -i ens33 -p tcp -j DROP
-A INPUT -s 192.168.82.0/24 -p tcp -m tcp --dport 2181 -j ACCEPT
-A INPUT -s 192.168.85.239/32 -p tcp -m tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2181 -j DROP
-A INPUT -s 192.168.2.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.2.3/32 -i ens33 -j DROP
-A INPUT -s 192.168.2.4/32 -i ens33 -j DROP
-A INPUT -p tcp -m tcp --dport 2181 -j DROP
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-8a1f463a23de -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-8a1f463a23de -j DOCKER
-A FORWARD -i br-8a1f463a23de ! -o br-8a1f463a23de -j ACCEPT
-A FORWARD -i br-8a1f463a23de -o br-8a1f463a23de -j ACCEPT
-A FORWARD -s 192.168.2.111/32 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -p tcp -m tcp --dport 2181 -j DROP
-A FORWARD -p tcp -m tcp --dport 2181 -j DROP
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-8a1f463a23de ! -o br-8a1f463a23de -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-8a1f463a23de -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Sat Jun 18 14:55:56 2022
# Generated by iptables-save v1.4.21 on Sat Jun 18 14:55:56 2022
*nat
:PREROUTING ACCEPT [14:2300]
:INPUT ACCEPT [14:2300]
:OUTPUT ACCEPT [50:3800]
:POSTROUTING ACCEPT [50:3800]
:DOCKER - [0:0]
###如果请求的目标地址是本机的地址, 那么将请求转到 DOCKER 链处理
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A PREROUTING -d 192.168.1.111/32 -p tcp -m tcp --dport 9999 -j DNAT --to-destination 192.168.1.112:22
-A PREROUTING -d 192.168.1.113/32 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 192.168.1.115:22
###如果请求的目标地址不匹配 127.0.0.0/8, 并且目标地址属于本机地址, 那么将请求跳转到 DOCKER 链处理
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
###不用指定SNAT的目标ip了,不管现在eth0的出口获得了怎样的动态ip,
### MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。-o 出去的网络接口
###对于来自于 172.17.0.0/16 的请求, 目标地址不是 docker0 所在的网段的地址, POSTROUTING 链将会将该请求伪装成宿主机的请求转发到外网
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-8a1f463a23de -j MASQUERADE
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.5.3
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-8a1f463a23de -j RETURN
COMMIT
五、IPtables中SNAT、DNAT和MASQUERADE的详细含义
5.1 SNAT
IPtables中可以灵活的做各种网络地址转换(NAT),网络地址转换主要有两种:SNAT和DNAT。
SNAT是source network address translation的缩写,即源网络地址转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器 比如 网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了,所以叫做SNAT,基于源地址的地址转换。
MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat。
在iptables中有着和SNAT相近的效果,但也有一些区别,但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:
如下命令表示把10.8.0.0/24网段的数据包SNAT成192.168.5.3的ip然后发出去,
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.5.3
如下命令表示把10.8.0.0/24网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip,假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变,而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址,这个时候如果按照现在的方式来配置iptables就会出现问题了,因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip,这样是非常不好用的。
MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。
比如下边的命令:
iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的话,不用指定SNAT的目标ip了,不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。
5.2 DNAT
DNAT是destination network address translation的缩写,即目标网络地址转换,典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。
# 将10.0.1.62的访问请求转发到172.16.1.7
iptables -t nat -A PREROUTING -d 10.0.1.62 -j DNAT --to-destination 172.16.1.7
参考:————————————————
原文链接:iptables详解(图文)_董筱杰的博客-CSDN博客_iptables
原文链接:IPtables中SNAT、DNAT和MASQUERADE的含义_siaisjack的博客-CSDN博客_iptables masquerade
原文链接:iptables_人间不值得-的博客-CSDN博客
原文链接:syn flood攻击原理及防范_Seajunnn的博客-CSDN博客_synflood攻击的原理
--------------------------- 感谢点赞!-------------------------------
更多推荐
所有评论(0)