• 【Linux集群教程】12 集群安全防御 - 安全防御概述和Linux防火墙


    1 安全防御概述

    1.1 常见的攻击手段

    img

    1. 拒绝服务(DOS): 通过大量访问请求使服务器资源耗尽,无法向正常用户处理请求连接。常见解决手段将提供服务的机器配置的足够多,性能足够好 或者 使用云服务商的流量清洗服务功能(在访问企业页面时会导入到云服务商的清洗池中,云服务商的清洗池会对请求进行TCP握手,云服务商会分析握手进行判断哪些请求是正常,哪些请求是恶意的;经过云服务商的清洗后分析出的正常流量会导入到企业的服务中)。
    2. 分布式拒绝服务(DDOS)类攻击:与简单的DoS攻击相比,DDoS攻击发生的频率更高。因为僵尸机器和僵尸网络在暗网上很容易获得;与DoS相比,DDoS类攻击得逞的概率更高。常见解决手段使用执行深度数据包检查;应用流量清理过滤器;抑制ICMP数据包的系统响应率;执行定期流量分析;及时关注IP 的安全声誉;严格执行JavaScript解析;验证IP来源;禁用monlist;实施访问控制;加强员工网络安全意识教育,不点击可疑链接和邮件;正确使用Web应用程序防火墙。
    • UDP洪水

    这种DDoS与SYN洪水攻击非常相似,利用用户数据报协议(UDP)和UDP数据包。攻击者向用户已打开端口发送大量的垃圾 UDP数据包。主机以为这些是合法的UDP通信尝试,试图在该端口上侦听,如果没找到数据包,主机将别无选择的回复ICMP无法抵达。这种情况会一直持续下去,直至主机的网络资源被耗尽。

    • NTP放大

    在网络时间协议(NTP)攻击中,威胁分子会向NTP服务器发送大量的UDP数据包,以达到DoS的目的。当NTP服务器的资源无法支撑解析所收到的查询请求时,它就会崩溃。

    • HTTP洪水

    这是一种非常有效的DDoS攻击方式,利用了GET或POST响应机制。攻击者向服务器发送尽可能多的合法GET或POST查询,迫使服务器回答每一个查询。这种资源密集型回复过程会耗尽服务器资源,从而导致服务中断。

    • Fast Flux

    Fast Flux攻击目的主要用于掩盖僵尸网络,严格上来讲它不是一种攻击,而是僵尸网络运营商用来逃避检测的一种规避方法。借助Fast Flux,威胁分子可以在受感染的主机之间快速切换,从而使他们无法被检测工具发觉。

    1. 口令破解: 常用攻击手法俗称“跑字典”,暴力破解,常用解决方案设置登录错误次数限制,并且将密码规则设置的足够复杂和足够长度。(SSH协议)
    2. 已知漏洞: 通过已知漏洞进行数据获取或提权,是存在紧急漏洞或者是高危漏洞,就很容易被利用,通过漏洞能够实现多种攻击,比如盗取数据库信息,植入木马、篡改页面等,常见解决手段定时更新防御性补丁,升级更新相关系统可以修复一部分的已知漏洞和BUG。
    3. 欺骗权限用户: 又称社会工程学,通过欺骗权限用户得到授权资格的方式。以人的因素攻击信息安全链中,最薄弱的环节,通过欺骗的手段,入侵被骗者的计算机系统的一种攻击方式。
    4. 网站篡改:常见的攻击,很多时候我们浏览网站的时候发现网站变成了违法网站,但是域名还是之前的,其实这时候网站已经被篡改了,常见的就是企业网站、政府网站等,被篡改以后不仅影响形象,同时也会造成业务停滞
    5. 钓鱼邮件:比较常见的攻击方式,或许我们每个人的邮箱中都躺着几个钓鱼邮件,钓鱼邮件中存在恶意链接,常见的就是模仿正规网站,比如qq盗号,就是模仿qq登录的网站,一旦输入了账号密码,就会被盗取信息,如果是银行卡支付的界面就更危险了,一旦输入了取款密码,资金就会被盗用,所以在陌生的网站千万不要输入账号密码
    6. 木马后门:黑客通过在网站系统中植入木马后门能够轻易地再次对木马实现利用,就相当于在你家门上弄了一个备用钥匙,想要进出就非常轻松了

    1.2 常见的安全防御设备

    1.2.1 基础类防火墙: 主要实现包过滤防火墙

    这类是有硬件处理、软件处理等,其主要功能实现是限制对 IP:Port 的访问。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。FW可以拦截低层攻击行为,但对应用层的深层攻击行为无能为力。 FW部署位置一般为外联出口或者区域性出口位置,对内外流量进行安全隔离。部署方式常见如下 :

    img

    基础类防火墙是介于在外网和内网之间的安全设备,用于过滤外网的数据包信息。例如可以访问80,443的端口,但是不能访问 3306 的端口。基础类防火墙会书写对应的规则,通过规则匹配的方式去放行或者拒绝对应的连接,到达安全赋予的目的。

    互联网中发起的数据报文无外乎是TCP或者是UDP,那么数据报文就是有一定是特征,例如端口,IP地址,数据包状态。基础类防火墙就是通过这些特征来进行相应的放行和过滤操作。以人的因素攻击信息安全链中,最薄弱的环节,通过欺骗的手段,入侵被骗者的计算机系统的一种攻击方式。

    1.2.2 IDS 类防火墙: 入侵检测系统,提供报告和事后监督为主

    此类产品基本上以旁路为主,特点是不阻断任何网络访问,主要以提供报告和事后监督为主,少量的类似产品还提供TCP阻断等功能,但少有使用。

    img

    IDS 类防火墙会放在网络的网关处,所有数据包的经过,所有数据包的流向,都会被IDS 类防火墙监控到。并不会在事发的时候进行拒绝或者其他的操作。

    1.2.3 IPS 类防火墙: 入侵防御系统,分析数据包内容,根据模式匹配去阻断非法访问

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

    img

    IPS 功能就是分析数据包的内容,根据模式匹配,阻断非法访问。几乎所有的服务功能都能做,但是不过精确,简而言之就是全而不精,所以就是出现后面的主动安全类防火墙。

    1.2.4 UTM类安全设备

    是以上三者的结合体,按照IDC提出“统一威胁管理”的概念来看,UTM是将防病毒、入侵检测和防火墙安全设备划归到一起“统一管理”的新类别。 IDC将防病毒、防火墙和入侵检测等概念融合到被称为统一威胁管理的新类别中,该概念引起了业界的广泛重视,并推动了以整合式安全设备为代表的市场细分的诞生。由IDC提出的UTM是指由硬件、软件和网络技术组成的具有专门用途的设备,它主要提供一项或多项安全功能,将多种安全特性集成于一个硬设备里,构成一个标准的统一管理平台。 由于性能要求出众,导致造价一般比较高,目前一般只有大型企业会有使用。 UTM的优点主要有以下几条 1.整合所带来的成本降低(一身兼多职嘛!) 2.降低信息安全工作强度 (减轻管理员负担) 3.降低技术复杂度 UTM也不能一劳永逸的解决所有安全问题,总结下来,有如下缺点 1.网关防御的弊端 网关防御在防范外部威胁的时候非常有效,但是在面对内部威胁的时候就无法发挥作用了。有很多资料表明造成组织信息资产损失的威胁大部分来自于组织内部,所以以网关型防御为主的UTM设备目前尚不是解决安全问题的万灵药。 2.过度集成带来的风险 3.性能和稳定性

    1.2.5 主动安全类防火墙: 对特定服务类型进行专项防御,常见设备有 WAF、DAF

    和前面的产品均不同,主动安全产品的特点是协议针对性非常强,比如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 服务。

    2 防火墙(基础类)

    2.1 何为防火墙

    img

    防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。

    防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。

    工作在主机边缘或者网络边缘处对数据报文进行检测,并且能够根据事先定义好的规则,对数据报文 进行相应处理(放行,删除,拒绝)的模块。防火墙一般都是防进不防出,进来的所有数据报文都任务是不安全的,都需要防火墙过滤一遍,出去的数据报文,基本上认为是安全的。

    软件防火墙是工作在内核的最外围 ( 或者是安装在内核以及应用空间的中间层 ) ,即通过机器的所有流量都需要经过防火墙。作用:信息安全防护。

    2.2 防火墙的分类

    构造:

    • 硬件:深信服,网御(联想),华为,华三,启明星辰,安恒
    • 软件:Windows 自带的防火墙,Linux 自带的 iptables

    工作机制:

    • 包过滤防火墙:源地址SIP,目的地址DIP,源端口SPORT,目的端口DPORT,IP层所承载的上层协议的协议号

    img

    • 应用层防火墙:URL,Hostname

    模块:

    • Linux 本身的 iptables。

      • 应用态:iptables(配置防火墙的工具,是netfilter的配置工具),内核态:netfilter(真正防火墙生效)。
      • 扩展:和 ipvs 类似,应用态:ipvsadm,内核态:ipvs。
      • CentOS 6使用的是 iptables 应用态,而CentOS 7使用的是 firewalld 应用态,但操作的底层依旧是 netfilter。firewalld 分类方式比较简单,但是iptables 更加便于理解。

    iptables 工作结构

    众多的路由规则(Rule)和预设的规则(policy)组成了一个功能链(chain),多个链组成一个表,多个表就组成了防火墙iptables。
    最常用的就是filter表,nat表。

    img

    iptables 历经的构造变化

    内核版本内核态用户态
    kernel 2.0.xfirewallipfw
    kernel 2.2.xfirewallipchains
    kernel 2.4.xnetfilteriptables(CentOS 6/CentOS 7都是可以工作的)
    kernel 3.13.xnetfilterfirewal

    2.3 iptables 的原理

    参考文献:[ https://blog.csdn.net/weixin_45186298/article/details/122910466 ]

    img

    四表五链功能性介绍

    iptables是(4张)表的集合:filter、nat、mangle、raw

    表是(5条)链的集合:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING

    1. INPUT

    img

    客户端发起连接到Apache服务器的时候,数据报文到服务器的网卡处,首先判断 Router Table 的路由表信息,判断该用户的请求是不是本机的,如果不是则丢弃;如果是本机就会交给 netfilter 进行下一步处理。netfilter 会寻找匹配相应的规则,例如:如果目标端口是80的话,就允许放行,这样用户的数据报文就可以到 Http 应用进行处理并得到响应数据报文。

    即 INPUT (入站)链。iptables 的规则就是写在 链上的。可以理解为所有入站的数据报文都要经过 iptables 的 INPUT 链,才能到达上层的用户空间。这就要看 INPUT 链的规则是如何编写的,需要匹配规则,如果是放行就放行,如果是拒绝就是拒绝。

    1. OUTPUT

    img

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

    OUTPUT (出站)链的主要功能就是对机器出去的数据报文进行对应的过滤操作。

    1. FORWORD

    img

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

    FORWORD (转发)链的主要功能就是处理机器的转发数据报文进行规则匹配。

    1. PREROUTING

    img

    PREROUTING 链在还没有路由表判断之前就对数据报文进行对应的修改。

    PREROUTING (路由前)链翻译过来就是路由表之前对数据报文处理的一个接口

    1. POSTROUTING

    img

    POSTROUTING 是先经过路由表判断之后,才到POSTROUTING 进行下一步的处理。

    POSTROUTING (路由后)链翻译过来就是路由表之后对数据报文处理的一个接口

    链的作用是承载防火墙的规则,链则是存放在表中。

    规则链:承载防火墙规则

    处理入站数据包:INPUT

    处理出站数据包:OUTPUT

    处理转发数据包:FORWARD

    在进行路由选择前应用规则(处理数据包):修改目标地址 PREROUTING

    在进行路由选择后应用规则(处理数据包):修改源地址 POSTROUTING

    规则表:承载防火墙链

    raw 表:确定是否对该数据包进行状态跟踪

    • 一旦我们的数据包经过防火墙以后,正常情况下会对数据包进行跟踪,跟踪会消耗资源。可以通过 raw 表将这些数据包进行跳出,不进行状态跟踪。

    mangle 表:为数据包设置标记,例如:TTL MARK

    • 可以在数据包打上固定标签的 mangle 表

    nat 表:修改数据包中的源、目的IP地址或者端口(实现地址转换)

    • 功能可以有端口映射,SNAT,DNAT

    filter 表:确定是否放行该数据包(过滤)

    • 基础类防火墙最主要的表,会对数据包进行过滤

    主要的是 nat 表和 filter 表,raw 表和mangle 表的使用较少。

    防火墙链表结构

    img

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

    img

    2.4 防火墙顺序

    ① 防火墙是一层一层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的;

    ② 如果匹配上规则,即明确表明阻止还是通过,此时数据包就不再向下匹配新规则了;

    ③ 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,则按照默认策略进行处理;

    ④ 防火墙的默认规则是对应的链的所有的规则执行完成后才会执行的;

    规则匹配顺序:

    • 按顺序依次由上至下检查,匹配即停止(LOG策略 [ 相当于打了一个日志,并不做任何处理 ] 例外)
    • 若找不到相匹配规则,则按该链的默认策略(Default)处理

    表应用顺序: raw > mangle > nat > filter

    链应用顺序

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

    数据链表匹配顺序:

    img

    1. 网络A入站到应用程序顺序:网络A→raw-PREROUTING→mangle-PREROUTING→nat-PREROUTING→RouteTable→mangle-INPUT→filter-INPUT→应用程序
    2. 出战到网络B顺序:路由选择→raw-OUTPUT→mangle-OUTPUT→nat-OUTPUT→filter-OUTPUT→mangle-POSTROUTING→nat-POSTROUTING→网络B
    3. 网络A转发网络B:网络A→raw-PREROUTING→mangle-PREROUTING→nat-PREROUTING→RouteTable→mangle-FORWARD→filter-FORWARD→RouteTable→mangle-POSTROUTING→nat-POSTROUTING→网络B

    进来标记转换过滤标记,出去也一样

    2.5 iptables 语法规则

    2.5.1 书写规则

    语法构成

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

    几个注意事项

    • 不指定表名时,默认指filter表
    • 不指定链名时,默认指表内的所有链
    • 除非设置链的默认策 略,否则必须指定匹配条件
    • 选项、链名、控制类型使用大写字母,其余均为小写

    指定的表要有相对应的链,才能进行操作

    2.5.2 常见动作类型

    • ACCEPT :允许通过
    • DROP :直接丢弃,不给出任何回应
    • REJECT :拒绝通过,必要时会给出提示
    • LOG :记录日志信息,然后传给下一条规则继续匹配
    • SNAT :修改数据包源地址
    • DNAT :修改数据包目的地址
    • REDIRECT :重定向

    SNAT 作用是内网用户通过同一个公网IP,访问公网的能力。

    DNAT 作用是将公网中的访问映射到内网的服务器上

    2.5.3 常见选项

    类别选项用途
    添加新的规则-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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    示例:查看规则列表

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例:删除,清空规则

    # 删除filter表的INPUT链的编号3的规则
    iptables -D INPUT 3
    iptables -n -L INPUT
    # 清空所有的规则(默认是filter表)
    iptables -F 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例:设置默认策略

    iptables -t filter -P FORWORD DROP
    iptables -P OUTPUT ACCEPT
    
    • 1
    • 2

    操作 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132

    注意:默认规则只有两种执行动作,1.ACCEPT,2.DROP

    书写规则的时候,应该将匹配规则频繁的放在链的最上面。是十分重要的优化策略。这样消耗的性能就较少。

    2.5.4 匹配类型

    通用匹配

    • 可直接使用,不依赖于其他条件或扩展
    • 包括网络协议、IP地址、网络接口等条件

    隐含匹配

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

    显式匹配

    • 要求以“-m 扩展模块”的形式明确指出类型
    • 包括多端口、MAC地址、IP范围、数据包状态等条件

    三者的区别就是使用的条件不一致而已。

    2.5.4.1 通用匹配

    协议匹配 :-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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    范例: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是需要一定的资源,因为需要返回信息给客户端
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    2.5.4.2 隐含匹配

    常用的隐含匹配条件:

    端口匹配:–sport 源端口、–dport 目的端口

    ICMP类型匹配:–icmp-type ICMP类型

    img

    示例

    #在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    范例:实现机器可以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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    2.5.4.3 显式匹配
    • 多端口匹配

      • -m multiport --sport 源端口列表
      • -m multiport --dport 目的端口列表
    • IP 范围匹配

      • -m iprange --src-range IP 范围
    • MAC 地址匹配

      • -m mac –mac1-source MAC 地址
    • 状态匹配

      • -m state --state 连接状态
    #在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    2.5.4.4 SNAT 规则

    SNAT 策略的典型应用环境: 局域网主机共享单个公网 IP 地址接入 Internet

    SNAT 策略的原理

    • 源地址转换,Source Network Address Translation
    • 修改数据包的源地址

    SNAT 网络拓扑
    img

    未启用 SNAT

    img

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

    启用 SNAT

    img

    启用 SNAT,并且网关服务器开启路由转发,那么在发送数据报文时会将其源地址进行修改,当Web服务器发送过来的数据报文时,网关服务器再利用 SNAT 根据去的时候那个源和目的转换的记录更改的目的地址。

    启动 SNAT 转换代码记录

    前提条件

    • 局域网各主机正确设置 IP 地址/子网掩码
    • 局域网各主机正确设置默认网关地址
    • Linux 网关支持 IP 路由转发

    实现方法:编写 SNAT 转换规则

    POSTROUTING 路由后
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
    
    • 1
    • 2
    2.5.4.4.1 实验操作:SNAT 规则

    实验环境

    #10.10.10.11 作为内网

    #10.10.10.12 作为网关服务器(和10.10.10.11一块网卡,并且还与本机NAT模式 = 两块网卡)

    • 配置10.10.10.11机器网络
    #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
    
    #开启图形化功能
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 配置10.10.10.12机器网络
    #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  ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 测试 10.10.10.11 机器就可以进行上网
    $ 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    img

    MASQUERADE —— 地址伪装

    • 适用于外网 IP 地址非固定的情况
    • 对于 ADSL 拨号连接,接口通常为 ppp0、ppp1
    • 将 SNAT 规则改为 MASQUERADE 即可

    实现代码

    POSTROUTING 路由后
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
    
    • 1
    • 2
    2.5.4.4.2 实验操作: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
    #网络依旧可以正常访问
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    浏览器打开外网网址,可以正常访问

    img

    2.5.4.5 DNAT 规则

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

    DNAT 策略的原理

    • 目标地址转换,Destination Network Address Translation
    • 修改数据包的目标地址

    img

    DNAT 策略

    img

    启动 DNAT 转换代码记录

    前提条件

    • 局域网的 Web 服务器能够访问 Internet
    • 网关的外网 IP 地址有正确的 DNS 解析记录
    • Linux 网关支持 IP 路由转发

    实现方法:编写 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
    
    • 1
    • 2
    2.5.4.5.1 实验操作:DNAT 规则

    实验环境:

    • 10.10.10.11 是内网的Web服务器
    • 10.10.10.12 是网关服务器(20.20.20.12 模拟公网IP)
    • 20.20.20.13 是公网的Client

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试访问

    #在20.20.20.13 Client 端访问
    $ curl 20.20.20.12
    This is Apache Server
    
    • 1
    • 2
    • 3
    2.5.4.5.2 SNAT & DNAT 为什么分别使用对应的POSTROUTING和PREROUTING

    imgimg

    2.5.4 iptables 选项小总结

    参数作用
    -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匹配来源端口号

    2.6 防火墙脚本

    导出(备份)规则: 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    常用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
  • 相关阅读:
    Linux 中的 comm 命令及示例
    特斯拉2年内实现全自动驾驶,无人驾驶时代还远吗?丨曼孚科技
    头歌的数据库的第三次作业的答案
    玩转Jetson Nano(三):安装Pytorch GPU版
    【Datawhale】动手学数据分析
    2022年7月小结
    Netty 如何高效接收网络数据?一文聊透 ByteBuffer 动态自适应扩缩容机制
    《Star Atlas》 Game Jam 来啦!
    【.Net实用方法总结】 整理并总结System.IO中TextWriter类及其方法介绍
    化妆品用乙基己基甘油全球市场总体规模2023-2029
  • 原文地址:https://blog.csdn.net/weixin_40274679/article/details/127449917