
这种DDoS与SYN洪水攻击非常相似,利用用户数据报协议(UDP)和UDP数据包。攻击者向用户已打开端口发送大量的垃圾 UDP数据包。主机以为这些是合法的UDP通信尝试,试图在该端口上侦听,如果没找到数据包,主机将别无选择的回复ICMP无法抵达。这种情况会一直持续下去,直至主机的网络资源被耗尽。
在网络时间协议(NTP)攻击中,威胁分子会向NTP服务器发送大量的UDP数据包,以达到DoS的目的。当NTP服务器的资源无法支撑解析所收到的查询请求时,它就会崩溃。
这是一种非常有效的DDoS攻击方式,利用了GET或POST响应机制。攻击者向服务器发送尽可能多的合法GET或POST查询,迫使服务器回答每一个查询。这种资源密集型回复过程会耗尽服务器资源,从而导致服务中断。
Fast Flux攻击目的主要用于掩盖僵尸网络,严格上来讲它不是一种攻击,而是僵尸网络运营商用来逃避检测的一种规避方法。借助Fast Flux,威胁分子可以在受感染的主机之间快速切换,从而使他们无法被检测工具发觉。
这类是有硬件处理、软件处理等,其主要功能实现是限制对 IP:Port 的访问。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。FW可以拦截低层攻击行为,但对应用层的深层攻击行为无能为力。 FW部署位置一般为外联出口或者区域性出口位置,对内外流量进行安全隔离。部署方式常见如下 :

基础类防火墙是介于在外网和内网之间的安全设备,用于过滤外网的数据包信息。例如可以访问80,443的端口,但是不能访问 3306 的端口。基础类防火墙会书写对应的规则,通过规则匹配的方式去放行或者拒绝对应的连接,到达安全赋予的目的。
互联网中发起的数据报文无外乎是TCP或者是UDP,那么数据报文就是有一定是特征,例如端口,IP地址,数据包状态。基础类防火墙就是通过这些特征来进行相应的放行和过滤操作。以人的因素攻击信息安全链中,最薄弱的环节,通过欺骗的手段,入侵被骗者的计算机系统的一种攻击方式。
此类产品基本上以旁路为主,特点是不阻断任何网络访问,主要以提供报告和事后监督为主,少量的类似产品还提供TCP阻断等功能,但少有使用。

IDS 类防火墙会放在网络的网关处,所有数据包的经过,所有数据包的流向,都会被IDS 类防火墙监控到。并不会在事发的时候进行拒绝或者其他的操作。
解决了IDS无法阻断的问题,基本上以在线模式为主,系统提供多个端口,以透明模式工作。在一些传统防火墙的新产品中也提供了类似功能,其特点是可以分析到数据包的内容,解决传统防火墙只能工作在4层以下的问题。和IDS一样,IPS也要像防病毒系统定义N种已知的攻击模式,并主要通过模式匹配去阻断非法访问,致命缺点在于不能主动的学习攻击方式,对于模式库中不能识别出来的攻击,默认策略是允许 访问的! IPS类设备,常被串接在主干路上,对内外网异常流量进行监控处理,部署位置常见如下 :

IPS 功能就是分析数据包的内容,根据模式匹配,阻断非法访问。几乎所有的服务功能都能做,但是不过精确,简而言之就是全而不精,所以就是出现后面的主动安全类防火墙。
是以上三者的结合体,按照IDC提出“统一威胁管理”的概念来看,UTM是将防病毒、入侵检测和防火墙安全设备划归到一起“统一管理”的新类别。 IDC将防病毒、防火墙和入侵检测等概念融合到被称为统一威胁管理的新类别中,该概念引起了业界的广泛重视,并推动了以整合式安全设备为代表的市场细分的诞生。由IDC提出的UTM是指由硬件、软件和网络技术组成的具有专门用途的设备,它主要提供一项或多项安全功能,将多种安全特性集成于一个硬设备里,构成一个标准的统一管理平台。 由于性能要求出众,导致造价一般比较高,目前一般只有大型企业会有使用。 UTM的优点主要有以下几条 1.整合所带来的成本降低(一身兼多职嘛!) 2.降低信息安全工作强度 (减轻管理员负担) 3.降低技术复杂度 UTM也不能一劳永逸的解决所有安全问题,总结下来,有如下缺点 1.网关防御的弊端 网关防御在防范外部威胁的时候非常有效,但是在面对内部威胁的时候就无法发挥作用了。有很多资料表明造成组织信息资产损失的威胁大部分来自于组织内部,所以以网关型防御为主的UTM设备目前尚不是解决安全问题的万灵药。 2.过度集成带来的风险 3.性能和稳定性
和前面的产品均不同,主动安全产品的特点是协议针对性非常强,比如WAF就是专门负责HTTP协议的安全处理,DAF就是专门负责数据库Sql 查询类的安全处理。在主动安全产品中通常会处理到应用级的访问流程。对于不认识的业务访问全部隔离(以下以WAF为重点说明这一类安全设备)。
WAF:Web应用防护系统(Web Application Firewall, 简称:WAF)代表了一类新兴的信息安全技术,用以解决诸如防火墙一类传统设备束手无策的Web应用安全问题。与传统防火墙不同,WAF工作在应用层,因此对Web应用防护具有先天的技术优势。基于对Web应用业务和逻辑的深刻理解,WAF对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,从而对各类网站站点进行有效防护。
主动安全类可以理解为 IPS 类下的子类,都是这个子类又十分的庞大。IPS 设备可以理解为各种流量都能进行监控和规则匹配,但是不精。而主动安全类设备就是专门处理某一类服务访问的规则匹配和监控报警。WAF 就是Web应用防火墙,DAF 就是数据库应用防火墙。
因为是专精的防火墙,所以会对一些已知的漏洞,或者是刚爆发的漏洞更新的速度会比较快,防御的手段也是会比较完善。
小总结:
在IDS类、IPS类 和主动安全类防火墙都是需要企业付费进行购买服务后,由对应的防火墙厂家提供对应的技术支持,并不需要太多的管理的。而基础类防火墙是最底层的限制也是最有效的防御手段,Linux系统就是iptables 和 firewalld 服务。

防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。
工作在主机边缘或者网络边缘处对数据报文进行检测,并且能够根据事先定义好的规则,对数据报文 进行相应处理(放行,删除,拒绝)的模块。防火墙一般都是防进不防出,进来的所有数据报文都任务是不安全的,都需要防火墙过滤一遍,出去的数据报文,基本上认为是安全的。
软件防火墙是工作在内核的最外围 ( 或者是安装在内核以及应用空间的中间层 ) ,即通过机器的所有流量都需要经过防火墙。作用:信息安全防护。
构造:
工作机制:

模块:
Linux 本身的 iptables。
iptables 工作结构
众多的路由规则(Rule)和预设的规则(policy)组成了一个功能链(chain),多个链组成一个表,多个表就组成了防火墙iptables。
最常用的就是filter表,nat表。

iptables 历经的构造变化
| 内核版本 | 内核态 | 用户态 |
|---|---|---|
| kernel 2.0.x | firewall | ipfw |
| kernel 2.2.x | firewall | ipchains |
| kernel 2.4.x | netfilter | iptables(CentOS 6/CentOS 7都是可以工作的) |
| kernel 3.13.x | netfilter | firewal |
参考文献:[ https://blog.csdn.net/weixin_45186298/article/details/122910466 ]

四表五链功能性介绍
iptables是(4张)表的集合:filter、nat、mangle、raw
表是(5条)链的集合:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING

客户端发起连接到Apache服务器的时候,数据报文到服务器的网卡处,首先判断 Router Table 的路由表信息,判断该用户的请求是不是本机的,如果不是则丢弃;如果是本机就会交给 netfilter 进行下一步处理。netfilter 会寻找匹配相应的规则,例如:如果目标端口是80的话,就允许放行,这样用户的数据报文就可以到 Http 应用进行处理并得到响应数据报文。
即 INPUT (入站)链。iptables 的规则就是写在 链上的。可以理解为所有入站的数据报文都要经过 iptables 的 INPUT 链,才能到达上层的用户空间。这就要看 INPUT 链的规则是如何编写的,需要匹配规则,如果是放行就放行,如果是拒绝就是拒绝。

当用户在服务器上操作时,执行 curl 命令请求到 WebServer 的时候,数据报文会向到 netfilter 进行处理,netfilter 将数据报文先后转发到服务器的网卡处,通过 Router Table 路由表中进行转发到 WebServer 进行处理。则 netfilter 的 OUTPUT 链就是用来处理出站的规则匹配。
OUTPUT (出站)链的主要功能就是对机器出去的数据报文进行对应的过滤操作。

将Linux服务器充当是路由器。并且Linux 服务器开启 net.ipv4.ip_forward = 1 路由转发功能,当 Client 客户端发起请求到目标地址是 WebServer,Client 发送的数据包会到路由器(Linux服务器)eth0网卡,因为开启了路由转发功能,所以会将数据包转发到 eth1网卡。只要涉及到转发,那么就会经过 netfilter 的 FORWORD 链。
FORWORD (转发)链的主要功能就是处理机器的转发数据报文进行规则匹配。

PREROUTING 链在还没有路由表判断之前就对数据报文进行对应的修改。
PREROUTING (路由前)链翻译过来就是路由表之前对数据报文处理的一个接口

POSTROUTING 是先经过路由表判断之后,才到POSTROUTING 进行下一步的处理。
POSTROUTING (路由后)链翻译过来就是路由表之后对数据报文处理的一个接口
链的作用是承载防火墙的规则,链则是存放在表中。
规则链:承载防火墙规则
处理入站数据包:INPUT
处理出站数据包:OUTPUT
处理转发数据包:FORWARD
在进行路由选择前应用规则(处理数据包):修改目标地址 PREROUTING
在进行路由选择后应用规则(处理数据包):修改源地址 POSTROUTING
规则表:承载防火墙链
raw 表:确定是否对该数据包进行状态跟踪
mangle 表:为数据包设置标记,例如:TTL MARK
nat 表:修改数据包中的源、目的IP地址或者端口(实现地址转换)
filter 表:确定是否放行该数据包(过滤)
主要的是 nat 表和 filter 表,raw 表和mangle 表的使用较少。
防火墙链表结构

不同表下面拥有的链也是不同的。只要知道要做的防火墙规则是怎么样的,只需要匹配对应的功能,再来选择对应的入站和出站。这样就知道 netfilter 的规则是写在哪张表的哪条链上。(红色标记是重点),例如在NAT表中的PREROUTING 链和 POSTROUTING 链是各自实现SNAT和DNAT的功能。

① 防火墙是一层一层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的;
② 如果匹配上规则,即明确表明阻止还是通过,此时数据包就不再向下匹配新规则了;
③ 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,则按照默认策略进行处理;
④ 防火墙的默认规则是对应的链的所有的规则执行完成后才会执行的;
规则匹配顺序:
表应用顺序: raw > mangle > nat > filter
链应用顺序
数据链表匹配顺序:

进来标记转换过滤标记,出去也一样
语法构成
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
几个注意事项
指定的表要有相对应的链,才能进行操作
SNAT 作用是内网用户通过同一个公网IP,访问公网的能力。
DNAT 作用是将公网中的访问映射到内网的服务器上
| 类别 | 选项 | 用途 |
|---|---|---|
| 添加新的规则 | -A | 在链的末尾追加一条规则 |
| -I | 在链的开头(或者指定序号)插入一条规则 | |
| 查看规则列表 | -L | 列出所有的规则条目 |
| -n | 以数字形式形式地址,端口等信息 | |
| -v | 以更加详细的方式显示规则信息(显示当前过滤的数据包和过滤的字节数) | |
| –line-numbers | 查看规则时,显示规则的序号 | |
| 删除、清空规则 | -D | 删除链内指定序号(或者内容)的一条规则 |
| -F | 清空所有的规则 | |
| 设置默认策略 | -P | 为指定的链设置默认规则 |
示例:添加新的规则
#指定filter表中的INPUT入站链的末尾添加,协议为TCP执行的动作是ACCEPT允许通过
iptables -t filter -A INPUT -p tcp -j ACCEPT
#如果没有写表名的话,默认是filter表
#指定filter表中的INPUT入站链开头添加,协议为UDP执行的动作是ACCEPT允许通过
iptables -I INPUT -p udp -j ACCEPT
#指定filter表中的INTPUT入站链第2个序号上添加,协议为ICMP执行的动作是ACCEPT允许通过
iptables -I INPUT 2 -p icmp -j ACCEPT
示例:查看规则列表
iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere udp dpt:domain
2 ACCEPT tcp -- anywhere anywhere tcp dpt:domain
3 ACCEPT udp -- anywhere anywhere udp dpt:bootps
4 ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
示例:删除,清空规则
# 删除filter表的INPUT链的编号3的规则
iptables -D INPUT 3
iptables -n -L INPUT
# 清空所有的规则(默认是filter表)
iptables -F
示例:设置默认策略
iptables -t filter -P FORWORD DROP
iptables -P OUTPUT ACCEPT
操作 iptables 防火墙
#CentOS 6打开防火墙
service iptables start
chkconfig iptables on
#CentOS 7打开防火墙
systemctl enable --now firewalld
###清空所有的规则
$ iptables -F
$ iptables -L
Chain INPUT (policy ACCEPT) #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
$ iptables -t filter -A INPUT -p tcp -j ACCEPT
$ iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
#pkts 这条规则过滤的数据报文的大小
#bytes 这条规则过滤的数据报文的字节大小
num pkts bytes target prot opt in out source destination
1 190 10288 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 240 packets, 25488 bytes)
num pkts bytes target prot opt in out source destination
$ iptables -t filter -I INPUT -p udp -j ACCEPT
$ iptables -vnL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
2 1711 86776 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 124 packets, 12560 bytes)
num pkts bytes target prot opt in out source destination
## -I 默认是插入链的第一行,-A 默认是插入链的最后一行
$ iptables -t filter -A INPUT -p icmp -j ACCEPT
$ iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
2 2121 109K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 20 packets, 2224 bytes)
num pkts bytes target prot opt in out source destination
#指定序号插入链的规则
$ iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
$ iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1 229 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 2443 126K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 9 packets, 1016 bytes)
num pkts bytes target prot opt in out source destination
#删除规则(删除固定规则)
$ iptables -t filter -D INPUT 4
$ iptables -vnL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1 229 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 2959 153K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 10 packets, 1088 bytes)
num pkts bytes target prot opt in out source destination
#删除规则(删除所有规则)
$ iptables -t filter -F
$ iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 108 packets, 6240 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 103 packets, 10584 bytes)
num pkts bytes target prot opt in out source destination
#设置默认规则
#安装Httpd服务并开启服务
#CentOS 6执行
$ yum install -y httpd && service httpd start && chkconfig httpd on
#CentOS 7执行
$ yum install -y httpd && systemctl enable --now httpd
#需求:放行80端口和放行22端口,其他的全部拒绝
#--dport指定目标端口
$ iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
$ iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
$ iptables -t filter -P INPUT DROP
$ iptables -vnL --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
2 265 14104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 9 packets, 968 bytes)
num pkts bytes target prot opt in out source destination
#测试ICMP协议是否可以ping通该机器
$ ping -c 1 -W 1 10.0.0.101
PING 10.0.0.101 (10.0.0.101) 56(84) bytes of data.
--- 10.0.0.101 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
注意:默认规则只有两种执行动作,1.ACCEPT,2.DROP
书写规则的时候,应该将匹配规则频繁的放在链的最上面。是十分重要的优化策略。这样消耗的性能就较少。
通用匹配
隐含匹配
显式匹配
三者的区别就是使用的条件不一致而已。
协议匹配 :-p 协议名
地址匹配 :-s 源地址、-d 目的地址
接口匹配 :-i 入站网卡、-o 出站网卡
可以相互重叠使用,加的条件越多,匹配则越精确。
示例:
#在filter表中最后插入FORWARD转发链中源地址是192.168.1.11,执行动作是REJECT拒绝并告警
iptables -A FORWARD -s 192.168.1.11 -j REJECT
#在filter表中开头插入INPUT入站链中源网段是10.20.30.0/24,执行动作是DROP丢弃
iptables -I INPUT -s 10.20.30.0/24 -j DROP
#在filter表中开头插入INPUT入站链协议为ICMP,执行动作是DROP丢弃
iptables -I INPUT -p icmp -j DROP
#在filter表中最后插入FORWARD转发链协议非ICMP的,执行动作是ACCEPT允许通过
#即除了ICMP协议执行动作是拒绝,其他的协议则是允许通过
iptables -A FORWARD -p ! icmp -j ACCEPT
#在filter表中最后插入INPUT入站链,入站网卡是eth1并且源网段是172.16.0.0/12,执行动作是DROP丢弃
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
范例:DROP 和 REJECT 的区别
#Web服务器的设置
$ yum install -y httpd && systemctl enable --now httpd
$ echo "123456" > /var/www/html/index.html
$ curl 10.0.0.102
123456
#Web服务器的iptables规则设置为DROP丢弃
$ iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
### DROP是不需要消耗资源,因为过来的数据包直接丢弃,并不需要返回信息给对方
#客户端访问
$ curl 10.0.0.102
#连接会超时
#Web服务器的iptables规则设置为REJECT拒绝
$ iptables -F
$ iptables -t filter -A INPUT -p tcp --dport 80 -j REJECT
$ iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 356 packets, 21600 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 342 packets, 35392 bytes)
num pkts bytes target prot opt in out source destination
#客户端再次访问
$ curl 10.0.0.102
curl: (7) Failed connect to 10.0.0.102:80; Connection refused
### REJECT是需要一定的资源,因为需要返回信息给客户端
常用的隐含匹配条件:
端口匹配:–sport 源端口、–dport 目的端口
ICMP类型匹配:–icmp-type ICMP类型

示例
#在filter表的FORWARD转发链最后插入源地址是192.168.4.0/24,协议是TCP,协议端口为53,执行动作是ACCEPT放行
# UDP 53号端口即DNS服务
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
#在filter表的INPUT入站链最后插入协议为TCP,端口号为20和21,执行动作ACCEPT放行
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
#在filter表的INPUT入站链最后插入协议为ICMP,ICMP类型为8,执行动作DROP丢弃
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
#在filter表的INPUT入站链最后插入协议为ICMP,ICMP类型为0,执行动作ACCEPT放行
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
#在filter表的INPUT入站链最后插入协议为ICMP,ICMP类型为3,执行动作ACCEPT放行
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
#在filter表的INPUT入站链最后插入协议为ICMP,执行动作为DROP丢弃
iptables -A INPUT -p icmp -j DROP
范例:实现机器可以ping别的机器,但别的机器不能ping本机
$ iptables -F
$ iptables -A INPUT -p icmp -j DROP
#测试
$ ping -c 1 -W 1 10.0.0.102
PING 10.0.0.102 (10.0.0.102) 56(84) bytes of data.
--- 10.0.0.102 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
#只要添加以下两条规则即可
$ iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
$ iptables -I INPUT -p icmp --icmp-type 3 -j ACCEPT
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- anywhere anywhere icmp destination-unreachable
ACCEPT icmp -- anywhere anywhere icmp echo-reply
DROP icmp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
$ iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 150 packets, 8304 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 3
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
3 1 84 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 184 packets, 19024 bytes)
num pkts bytes target prot opt in out source destination
#这样就实现了机器可以ping别的机器,但别的机器不能ping本机
$ ping -c 1 -W 1 10.0.0.103
PING 10.0.0.103 (10.0.0.103) 56(84) bytes of data.
64 bytes from 10.0.0.103: icmp_seq=1 ttl=64 time=0.533 ms
--- 10.0.0.103 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.533/0.533/0.533/0.000 ms
$ ping -c 1 -W 1 10.0.0.102
PING 10.0.0.102 (10.0.0.102) 56(84) bytes of data.
--- 10.0.0.102 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
多端口匹配
IP 范围匹配
MAC 地址匹配
状态匹配
#在filter表的INPUT入站链中最后插入协议为TCP,引入的模块是multiport,
#目标端口是25,80,110,143,执行动作是ACCEPT放行
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
# 这样做的目的就可以实现该四个端口都可以添加再同一个编号中,即若这4个端口的访问流量都非常大,
# 之前的操作才能一条条添加,这不太好;使用 -m multiport 的模块就可以同时将这4个端口添加到
# 同一个规则中,岂不美哉。
#在filter表的FORWARD转发链中最后插入协议为TCP,引入模块是iprange
#源地址范围是192.168.4.21 到 192.168.4.28,执行动作是ACCEPT放行
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
#在filter表的INPUT入站链中最后插入协议为TCP,引入的模块是mac
#源MAC地址是00:0c:29:c0:55:3f,执行动作是DROP丢弃
iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
#在filter表的INPUT入站链中默认执行动作DROP丢弃
iptables -P INPUT DROP
#在filter表的INPUT入站链中开头插入协议为TCP,引入的模块是multiport,
#目标端口是80 到 82,85,执行动作是ACCEPT放行
iptables -I INPUT -p tcp -m multiport --dport 80-82,85 -j ACCEPT
#在filter表的INPUT入站链中开头插入协议为TCP,引用的模块是stats,
#连接的是NEW,ESTABLISHED,RELATED,则执行动作是ACCEPT放行
#NEW 新建连接;ESTABLISHED 有数据参数;RELATED 相关联
iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#示例:
#表示在INPUT入站链中开头插入协议为TCP,端口号为21,引用模块stats
#连接的是NEW 新建连接的话,则执行动作是DROP丢弃,这样就可以保留之前旧用户的连接请求
#拒绝新用户的新的连接,从而等旧用户请求处理完毕后,再实现对后续软件的升级
iptables -I INPUT -p tcp -dport 21 -m state --state NEW -j DROP
SNAT 策略的典型应用环境: 局域网主机共享单个公网 IP 地址接入 Internet
SNAT 策略的原理
SNAT 网络拓扑

未启用 SNAT

未启用 SNAT,并且网关服务器开启路由转发,那么在发送数据报文时会直接发送出去,但是,私有地址是在公网中无法找到的。
启用 SNAT

启用 SNAT,并且网关服务器开启路由转发,那么在发送数据报文时会将其源地址进行修改,当Web服务器发送过来的数据报文时,网关服务器再利用 SNAT 根据去的时候那个源和目的转换的记录更改的目的地址。
启动 SNAT 转换代码记录
前提条件
实现方法:编写 SNAT 转换规则
POSTROUTING 路由后
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
实验环境
#10.10.10.11 作为内网
#10.10.10.12 作为网关服务器(和10.10.10.11一块网卡,并且还与本机NAT模式 = 两块网卡)
#10.10.10.11 操作
#修改网卡配置
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="none"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="10.10.10.11"
PREFIX="24"
#主要配置网卡地址指向网关服务器并且配置DNS服务器
GATEWAY="10.10.10.12"
DNS1=223.5.5.5
DNS2=223.6.6.6
#重启网络服务
$ systemctl restart network
#查看路由表
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.10.12 0.0.0.0 UG 0 0 0 eth0
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
#开启图形化功能
#10.10.10.12 操作
#修改网卡配置(配置公网网卡)
$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="10.0.0.102"
PREFIX="24"
GATEWAY="10.0.0.2"
DNS1="114.114.114.114"
DNS2="8.8.8.8"
IPV6_PRIVACY="no"
#重启网络服务
$ systemctl restart network
#查看路由表
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 eth1
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
#访问公网网址
$ ping -c 1 -W 1 www.baidu.com
PING www.baidu.com (183.232.231.174) 56(84) bytes of data.
64 bytes from 183.232.231.174: icmp_seq=1 ttl=128 time=16.7 ms
--- www.baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 16.736/16.736/16.736/0.000 ms
#开启路由转发功能
$ cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward = 1
EOF
$ sysctl -p
net.ipv4.ip_forward = 1
#开启防火墙功能
#CentOS6
$ service iptables start && chkconfig iptables on
#CentOS7
$ systemctl stop firewalld && yum install -y iptables-services
#清空防火墙规则并进行配置
$ iptables -F
$ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j SNAT --to-source 10.0.0.102
$ iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.10.10.0/24 anywhere to:10.0.0.102
#保存iptables规则
$ systemctl enable iptables && systemctl start iptables
$ service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
$ ping -c 1 -W 1 www.baidu.com
PING www.a.shifen.com (183.232.231.172) 56(84) bytes of data.
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=1 ttl=128 time=15.9 ms
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 15.937/15.937/15.937/0.000 ms
#已经可以正常的访问了
$ curl -kv www.baidu.com

MASQUERADE —— 地址伪装
实现代码
POSTROUTING 路由后
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
#利用2.5.4.4.1的环境
#在网关服务器进行操作
#清空iptables规则
$ iptables -t nat -F
#配置iptables规则
$ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE
$ iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth1 10.10.10.0/24 0.0.0.0/0
#在10.10.10.11再次执行
$ ping -c 1 -W 1 www.baidu.com
PING www.a.shifen.com (183.232.231.174) 56(84) bytes of data.
64 bytes from 183.232.231.174 (183.232.231.174): icmp_seq=1 ttl=128 time=24.9 ms
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 24.900/24.900/24.900/0.000 ms
$ curl -v www.baidu.com
#网络依旧可以正常访问
浏览器打开外网网址,可以正常访问

DNAT 策略的典型应用环境: 在 Internet 中发布位于企业局域网内的服务器
DNAT 策略的原理

DNAT 策略

启动 DNAT 转换代码记录
前提条件
实现方法:编写 DNAT 转换规则
PREROUTING 路由前
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
实验环境:
10.10.10.11 实验操作
#Web服务器
$ yum install -y httpd
$ systemctl enable --now httpd
#CentOS 6操作:service httpd start && chkconfig httpd on
#配置网页信息
$ echo "This is Apache Server" >> /var/www/html/index.html
#访问
$ curl 127.0.0.1
This is Apache Server
#网关配置
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="none"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="10.10.10.11"
PREFIX="24"
#配置网关
GATEWAY="10.10.10.12"
$ systemctl restart network
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.10.12 0.0.0.0 UG 0 0 0 eth0
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.10.10.12 实验操作
#开启路由转发功能
$ cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward = 1
EOF
$ sysctl -p
net.ipv4.ip_forward = 1
#开启防火墙功能
#CentOS6
$ service iptables start && chkconfig iptables on
#CentOS7
$ systemctl stop firewalld
$ yum install -y iptables-services
#清空防火墙规则
$ iptables -F
#配置iptables规则
# eth1 是公网网卡的入站网卡
$ iptables -t nat -A PREROUTING -i eth1 -d 20.20.20.0/24 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.11
$ iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- eth1 * 0.0.0.0/0 20.20.20.0/24 tcp dpt:80 to:10.10.10.11
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
#保存配置
$ service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
#配置网络
$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="none"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="20.20.20.12"
PREFIX="24"
IPV6_PRIVACY="no"
$ systemctl restart network
$ ip addr show
...省略部分输出...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:70:8a:d6 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.12/24 brd 10.10.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe70:8ad6/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:70:8a:e0 brd ff:ff:ff:ff:ff:ff
inet 20.20.20.12/24 brd 20.20.20.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe70:8ae0/64 scope link
valid_lft forever preferred_lft forever
20.20.20.13 实验操作
#配置网络
$ vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="20.20.20.13"
PREFIX="24"
$ systemctl restart network
$ ip addr show
测试访问
#在20.20.20.13 Client 端访问
$ curl 20.20.20.12
This is Apache Server


| 参数 | 作用 |
|---|---|
| -P | 设置默认策略:iptables -P INPUT(DROP) |
| -F | 清空所有的规则(清空规则链) |
| -L | 列出所有的规则条目(查看规则链) |
| -n | 以数字形式形式地址,端口等信息 |
| -v | 以更加详细的方式形式规则信息 |
| –line-numbers | 查看规则时,显示规则的序号 |
| -A | 在规则链的末尾加入新规则 |
| -I num | 在规则链的头部(或者指定序号)加入新规则 |
| -D num | 删除链内指定序号(或者内容)的一条规则删除某一条规则 |
| -s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 |
| -d | 匹配目标地址 |
| -i | 网卡名称 匹配从这块网卡流入的数据 |
| -o | 网卡名称 匹配从这块网卡流出的数据 |
| -p | 匹配协议,如tcp,udp,icmp |
| –dport num | 匹配目标端口号 |
| –sport num | 匹配来源端口号 |
导出(备份)规则: iptables-save 工具,可结合重定向输出保存到指定文件
导入(还原)规则: iptables-restore 工具,可结合重定向输入指定规则来源
范例:
$ iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
$ iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 68 packets, 4400 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 40 packets, 3696 bytes)
num pkts bytes target prot opt in out source destination
#持久化保存
$ service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
#备份iptables规则
$ iptables-save > 1.iptables
$ cat 1.iptables
# Generated by iptables-save v1.4.21 on Sun Sep 4 12:35:43 2022
*nat
:PREROUTING ACCEPT [2:458]
:INPUT ACCEPT [2:458]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Sun Sep 4 12:35:43 2022
# Generated by iptables-save v1.4.21 on Sun Sep 4 12:35:43 2022
*filter
:INPUT ACCEPT [168:11226]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [97:8648]
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT
# Completed on Sun Sep 4 12:35:43 2022
#清空规则
$ iptables -F && iptables -vnL
#还原规则
$ iptables-restore < 1.iptables && iptables -vnL
iptables 服务
脚本位置:/etc/init.d/iptables
规则文件位置:/etc/sysconfig/iptables
防火墙规则只在计算机处于开启状态时才有效。如果系统被重新引导,这些规则就会自动被清除并重 设。要保存规则以便今,请使用以下命令:后载入 /usr/sbin/service iptables save 保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时) 被应用
Centos7 使用 Iptables 为 netfilter 应用层工具
$ systemctl disable --now firewalld
$ systemctl status firewalld
#rpm -e --nodeps firewalld
$ yum -y install iptables-services
$ systemctl start iptables && systemctl enable iptables
$ iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
$ iptables -vnL --line-number
Chain INPUT (policy ACCEPT 14 packets, 896 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 8 packets, 800 bytes)
num pkts bytes target prot opt in out source destination
$ service iptables save
常用 Iptables 配置脚本分享
$ vim new.iptalbes
#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function support_distro(){
if [ -z "`egrep -i "centos" /etc/issue`" ];then
echo "Sorry,iptables script only support centos system now."
exit 1
fi
}
support_distro
echo "====================iptablesconfigure====================="
# Only support CentOS system
# 获取 SSH 端口
if grep "^Port" /etc/ssh/sshd_config>/dev/null;then
sshdport=`grep "^Port" /etc/ssh/sshd_config | sed "s/Port\s//g" `
else
sshdport=22
fi
# 获取 DNS 服务器 IP
if [ -s /etc/resolv.conf ];then
nameserver1=`cat /etc/resolv.conf |grep nameserver |awk 'NR==1{print $2 }'`
nameserver2=`cat /etc/resolv.conf |grep nameserver |awk 'NR==2{print $2 }'`
fi
IPT="/sbin/iptables"
# 删除已有规则
$IPT --delete-chain
$IPT --flush
# 禁止进,允许出,允许回环网卡
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
# 允许已建立的或相关连接的通行
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 限制 80 端口单个 IP 的最大连接数为 10
# 可以简单的防御DOS攻击
# $IPT -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
# 允许 80(HTTP)/873(RSYNC)/443(HTTPS)/20,21(FTP)/25(SMTP)端口的连接
# 生产环境可以自己定义
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# 允许 SSH 端口的连接,脚本自动侦测目前的 SSH 端口,否则默认为 22 端口
$IPT -A INPUT -p tcp -m tcp --dport $sshdport -j ACCEPT
# 允许 ping
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
$IPT -A INPUT -p icmp -m icmp --icmp-type 11 -j
# 允许 DNS
[ ! -z "$nameserver1" ] && $IPT -A OUTPUT -p udp -m udp -d $nameserver1 --dport 53 -j ACCEPT
[ ! -z "$nameserver2" ] && $IPT -A OUTPUT -p udp -m udp -d $nameserver2
# 保存规则并重启 IPTABLES
service iptables save
service iptables restart
echo "====================iptables configure completed============================"
$ bash new.iptables