Linux(安全篇-下),但数字形式的IP地址


一、域名系统 DNS

1 名字解析介绍和DNS

当前TCP/IP网络中的设备之间进行通信,是利用和依赖于IP地址实现的。但数字形式的IP地址是很难记忆的。当网络设备众多,想要记住每个设备的IP地址,可以说是"不可能完成的任务"。那么如何解决这一难题呢?我们可以给每个网络设备起一个友好的名称,如:www.willoneday.org,这种由文字组成的名称,显而易见要更容易记忆。但是计算机不会理解这种名称的,我们可以利用一种名字解析服务将名称转化成(解析)成IP地址。从而我们就可以利用名称来直接访问网络中设备了。除此之外还有一个重要功能,利用名称解析服务可以实现主机和IP的解耦,即:当主机IP变化时,只需要修改名称服务即可,用户仍可以通过原有的名称进行访问而不受影响。

实现此服务的方法是多样的。如下面所述:

本地名称解析配置文件:hosts

Linux: /etc/hosts
windows: %WINDIR%/system32/drivers/etc/hosts
#格式
122.10.117.2 www.willoneday.org. www
93.46.8.89   www.google.com. google

DNS:Domain Name System 域名系统,应用层协议,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,基于C/S架构,服务器端:53/udp, 53/tcp

TCP53端口可以用于数据库的主从同步
UDP53端口用于客户端向服务端的查询和数据库的主从同步

BIND:Bekerley Internet Name Domain,由 ISC (www.isc.org)提供的DNS软件实现DNS域名结构

  • 根域: 全球根服务器节点只有13个,10个在美国,1个荷兰,1个瑞典,1个日本
  • 一级域名:顶级域(Top Level Domain: tld)

   三类:组织域、国家域(.cn, .ca, .hk, .tw)、反向域

   com, edu, mil, gov, net, org, int,arpa

  • 二级域名:willoneday.com
  • 三级域名:study.willoneday.com
  • 最多可达到127级域名

ICANN(The Internet Corporation for Assigned Names and Numbers)互联网名称与数字地址分配机构,负责在全球范围内对互联网通用顶级域名(gTLD)以及国家和地区顶级域名(ccTLD)系统的管理、以及根服务器系统的管理

 


1.1 DNS服务工作原理

 


1.2 DNS查询类型

  • 递归查询

是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果DNS服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结构提交给用户。

一般客户机和本地DNS服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到最终的肯定或否定的结果后转交给客户机。此查询的源和目标保持不变,为了查询结果只需要发起一次查询

递归算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道->他代为帮客户端去查找-->最后再返回最终结果

  • 迭代查询

是指DNS服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的地址,用户再向这台DNS服务器提交请求,这样依次反复,直到返回查询结果。

一般情况下(有例外)本地的DNS服务器向其它DNS服务器的查询属于迭代查询,如:若对方不能返回权威的结果,则它会向下一个DNS服务器(参考前一个DNS服务器返回的结果)再次发起进行查询,直到返回查询的结果为止。此查询的源不变,但查询的目标不断变化,为查询结果一般需要发起多次查询

迭代算法︰客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道并推荐客户端应该找谁-->客户端自己去找它

  • DNS缓存:

DNS缓存是将解析数据存储在靠近发起请求的客户端的位置,也可以说DNS数据是可以缓存在任意位置,最终目的是以此减少递归查询过程,可以更快的让用户获得请求结果。

 


1.3 解析类型

  • FQDN --> IP 正向解析
  • IP --> FQDN 反向解析

FQDN(全称域名)

注意:正反向解析是两个不同的名称空间,是两棵不同的解析树

 


1.4 完整的查询请求经过的流程

Client -->hosts文件 --> Client DNS Service Local Cache --> DNS Server (recursion递归) --> DNS Server Cache -->DNS iteration(迭代) --> 根--> 顶级域名DNS-->二级域名DNS…

 


范例: Windows 客户端DNS缓存

C:\Users\Administrator>ipconfig/displaydns | findstr  redhat
C:\Users\Administrator>ping www.redhat.com
正在 Ping e3396.ca2.s.tl88.net [117.177.243.181] 具有 32 字节的数据:
来自 117.177.243.181 的回复: 字节=32 时间=29ms TTL=53
来自 117.177.243.181 的回复: 字节=32 时间=30ms TTL=53
来自 117.177.243.181 的回复: 字节=32 时间=29ms TTL=53
来自 117.177.243.181 的回复: 字节=32 时间=31ms TTL=53
117.177.243.181 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 29ms,最长 = 31ms,平均 = 29ms
C:\Users\Administrator>ipconfig/displaydns | findstr  redhat
    www.redhat.com
    记录名称. . . . . . . : www.redhat.com
    CNAME 记录  . . . . . : ds-www.redhat.com.edgekey.net
    记录名称. . . . . . . : ds-www.redhat.com.edgekey.net
    CNAME 记录  . . . . . : ds-www.redhat.com.edgekey.net.globalredir.akadns.net
    记录名称. . . . . . . : ds-www.redhat.com.edgekey.net.globalredir.akadns.net
C:\Users\Administrator>ipconfig/flushdns
Windows IP 配置
已成功刷新 DNS 解析缓存。
C:\Users\Administrator>ipconfig/displaydns | findstr  redhat
C:\Users\Administrator>

 


2 DNS 服务相关概念和技术

2.1 DNS服务器的类型

  • 主DNS服务器
  • 从DNS服务器
  • 缓存DNS服务器(转发器)

2.1.1 主DNS服务器

管理和维护所负责解析的域内解析库的服务器

2.1.2 从DNS服务器

从主服务器或从服务器"复制"(区域传输)解析库副本

  • 序列号:解析库版本号,主服务器解析库变化时,其序列递增
  • 刷新时间间隔:从服务器从主服务器请求同步解析的时间间隔
  • 重试时间间隔:从服务器请求同步失败时,再次尝试时间间隔
  • 过期时长:从服务器联系不到主服务器时,多久后停止服务
  • 通知机制:主服务器解析库发生变化时,会主动通知从服务器

 


2.2 各种资源记录

区域解析库:由众多资源记录RR(Resource Record)组成

记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX

  • SOA:Start Of Authority,起始授权记录;一个区域解析库有且仅能有一个SOA记录,必须位于解析库的第一条记录
  • A:internet Address,作用,FQDN --> IP
  • AAAA:FQDN(全程域名) --> IPv6
  • PTR:PoinTeR,IP --> FQDN
  • NS:Name Server,专用于标明当前区域的DNS服务器
  • CNAME : Canonical Name,别名记录
  • MX:Mail eXchanger,邮件交换器
  • TXT:对域名进行标识和说明的一种方式,一般做验证记录时会使用此项,如:SPF(反垃圾邮件)记录,https验证等,如下示例:

2.2.1 资源记录定义

name [TTL] IN rr_type value

注意:

  1. TTL可从全局继承
  2. 使用 "@" 符号可用于引用当前区域的域名
  3. 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
  4. 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机

2.2.2 SOA记录

name: 当前区域的名字,例如"willoneday.org."

value: 有多部分组成

注意:

  1. 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字,只是注释功能,可以不需要配置对应的NS记录和A记录
  2. 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般用.替换,例如:791270697.qq.com
  3. 主从服务区域传输相关定义以及否定的答案的统一的TTL
范例:写法
willoneday.org. 86400 IN SOA ns.willoneday.org. nsadmin.willoneday.org. (
 2022       ;序列号
 2H         ;刷新时间
 10M        ;重试时间
 1W         ;过期时间
 1D         ;否定答案的TTL值
)

2.2.3 NS记录

name: 当前区域的名字

value: 当前区域的某DNS服务器的名字,例如: ns.willoneday.org.

注意:

  1. 相邻的两个资源记录的name相同时,后续的可省略
  2. 对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录
  3. 一个区域可以有多个NS记录
范例:写法
willoneday.org. IN NS ns1.willoneday.org.
willoneday.org. IN NS ns2.willoneday.org.

2.2.4 MX记录

name: 当前区域的名字

value: 当前区域的某邮件服务器(smtp服务器)的主机名

注意:

  1. 一个区域内,MX记录可有多个;但每个记录的value之前应该有一个数字(0-99),表示此服务器的优先级;数字越小优先级越高
  1. 对MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录

范例:写法

willoneday.org. IN MX 10 mx1.willoneday.org.
                IN MX 20 mx2.willoneday.org.
mx1 A   10.0.0.100
mx2 A   10.0.0.200

2.2.5 A记录

name: 某主机的FQDN,例如:www.willoneday.org.

value: 主机名对应主机的IP地址

避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址

范例:写法
www.willoneday.org. IN    A 1.1.1.1
www.willoneday.org. IN    A 2.2.2.2
mx1.willoneday.org. IN    A 3.3.3.3
mx2.willoneday.org. IN    A 4.4.4.4
$GENERATE 1-254 HOST$  IN A 1.2.3.$
*.willoneday.org.   IN    A 5.5.5.5
willoneday.org.     IN    A 6.6.6.6
#注意:如果有和DNS的IP相同的多个同名的A记录,优先返回DNS的本机IP
范例:阿里云

2.2 6 AAAA记录

name: FQDN
value: IPv6

2.2.7 PTR记录

name: IP,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而有特定后缀:inaddr.arpa.,所以完整写法为:4.3.2.1.in-addr.arpa.
value: FQDN

#注意:网络地址及后缀可省略;主机地址依然需要反着写
#例如:
4.3.2.1.in-addr.arpa. IN PTR www.willoneday.org.
#如1.2.3为网络地址,可简写成:
4 IN PTR www.willoneday.org.

2.2.8 CNAME别名记录

name: 别名的FQDN
value: 真正名字的FQDN

#例如
www.willoneday.org. IN CNAME   websrv.willoneday.org.

 


2.3 子域授权

每个域的名称服务器,都是通过其上级名称服务器在解析库进行授权,类似根域授权tld

.com. IN NS ns1.com.
.com. IN NS ns2.com.
ns1.com. IN A 2.2.2.1
ns2.com. IN A 2.2.2.2
#willoneday.org. 在.com的名称服务器上,解析库中添加资源记录
willoneday.org. IN NS ns1.willoneday.org.
willoneday.org. IN NS ns2.willoneday.org.
willoneday.org. IN NS ns3.willoneday.org.
ns1.willoneday.org. IN A 3.3.3.1
ns2.willoneday.org. IN A 3.3.3.2
ns3.willoneday.org. IN A 3.3.3.3

 


2.4 whois

范例: whois 查询域名信息

[root@rocky01 ~]# yum install -y whois
[root@rocky01 ~]# whois aliyun.com
   Domain Name: ALIYUN.COM
   Registry Domain ID: 1244776076_DOMAIN_COM-VRSN
   Registrar WHOIS Server: grs-whois.hichina.com
   Registrar URL: http://www.net.cn
   Updated Date: 2022-05-18T16:36:00Z
   Creation Date: 2007-09-28T11:09:56Z
   Registry Expiry Date: 2023-09-28T11:09:56Z
   Registrar: Alibaba Cloud Computing (Beijing) Co., Ltd.
   Registrar IANA ID: 420
   Registrar Abuse Contact Email: DomainAbuse@service.aliyun.com
   Registrar Abuse Contact Phone: +86.95187
   Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
   Domain Status: serverDeleteProhibited https://icann.org/epp#serverDeleteProhibited
   Domain Status: serverTransferProhibited https://icann.org/epp#serverTransferProhibited
   Domain Status: serverUpdateProhibited https://icann.org/epp#serverUpdateProhibited
   Name Server: NS3.ALIYUN.COM
   Name Server: NS4.ALIYUN.COM
   Name Server: NS5.ALIYUN.COM
   DNSSEC: unsigned
   URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
>>> Last update of whois database: 2022-10-20T16:50:33Z <<<
...省略...

 


3 DNS软件 bind

DNS服务器软件:bind,powerdns,dnsmasq,unbound,coredns

3.1 bind 相关程序包

  • bind:服务器
  • bind-utils: 客户端
  • bind-libs:相关库,依赖关系自动安装
  • bind-chroot: 安全包,将dns相关文件放至 /var/named/chroot/

范例:安装bind软件

[root@rocky01 ~]# dnf -y install bind bind-utils
[root@ubuntu2004 ~]# apt -y install bind9 bind9-utils

 


3.2 BIND包相关文件

  • BIND主程序:/usr/sbin/named
  • 服务脚本和Unit名称:/etc/rc.d/init.d/named,/usr/lib/systemd/system/named.service
  • 主配置文件:/etc/named.conf, /etc/named.rfc1912.zones, /etc/rndc.key
  • 管理工具:/usr/sbin/rndc:remote name domain controller,默认与bind安装在同一主机,且只能通过127.0.0.1连接named进程,提供辅助性的管理功能;953/tcp
  • 解析库文件:/var/named/ZONE_NAME.ZONE

注意:

(1) 一台物理服务器可同时为多个区域提供解析

(2) 必须要有根区域文件;named.ca

(3) 应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址的解析库

 


3.3 主配置文件

  • 全局配置:options { };
  • 日志子系统配置:logging { };
  • 区域定义:本机能够为哪些zone进行解析,就要定义哪些zone

zone "ZONE_NAME" IN { };

注意:

  • 任何服务程序如果期望其能够通过网络被其它主机访问,至少应该监听在一个能与外部主机通信的IP地址上
  • 缓存名称服务器的配置:监听外部地址即可
  • dnssec: 建议关闭dnssec,设为no

 


4 实现主DNS服务器

4.1 主DNS服务器配置

(1)在主配置文件中定义区域

vim /etc/named.conf             
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query     { localhost; };
zone "ZONE_NAME" IN {
   type {master|slave|hint|forward};
   file "ZONE_NAME.zone";
};

(2)定义区域解析库文件

范例:区域数据库文件
[root@rocky8 named]# cat willoneday.org.zone
$TTL 1D
@           IN  SOA master.willoneday.org. admin.willoneday.org ( 20220117 3H 10M 1D 6H  )
                NS  master.willoneday.org.
master.willoneday.org.   A   10.0.0.8
www                      A   10.0.0.18
db                       A   10.0.0.200
node1                    A   1.1.1.1

 


4.2 主配置文件语法检查

[root@rocky01 ~]# named-checkconf

 


4.3 解析库文件语法检查

[root@rocky01 ~]# named-checkzone willoneday.org /var/named/willoneday.org.zone
zone willoneday.org/IN: loaded serial 0
OK

 


4.4 配置生效 

#三种方式
[root@rocky01 ~]# rndc reload 
[root@rocky01 ~]# #systemctl reload named
[root@rocky01 ~]# service named reload

 


4.5 DNS 测试和管理工具

4.5.1 dig 命令

dig只用于测试dns系统,不会查询hosts文件进行解析

命令格式:

dig [-t type] name [@SERVER] [query options]
query options:
 +[no]trace:跟踪解析过程 : dig +trace willoneday.org
 +[no]recurse:进行递归解析
范例:使用方法
#测试反向解析
dig -x IP = dig –t ptr reverseip.in-addr.arpa
#模拟区域传送
dig -t axfr ZONE_NAME @SERVER
dig -t axfr willoneday.org @10.10.10.11
dig –t axfr 100.1.10.in-addr.arpa @172.16.1.1
dig -t NS . @114.114.114.114
dig -t NS . @a.root-servers.net

4.5.2 host命令

命令格式:

host [-t type] name [SERVER]
范例:使用方法
host -t NS willoneday.org 172.16.0.1
host -t soa willoneday.org
host -t mx willoneday.org
host -t axfr willoneday.org
host 1.2.3.4

4.5.3 nslookup命令

nslookup [-option] [name | -] [server]

4.5.4 rndc 命令

利用rndc工具可以实现管理DNS功能

rndc 监听端口: 953/tcp

命令格式:

rndc COMMAND

COMMAND:

  • status: 查看状态
  • reload: 重载主配置文件和区域解析库文件
  • reload zonename: 重载区域解析库文件
  • retransfer zonename: 手动启动区域传送,而不管序列号是否增加
  • notify zonename: 重新对区域传送发通知
  • reconfig: 重载主配置文件
  • querylog: 开启或关闭查询日志文件/var/log/message
  • trace: 递增debug一个级别
  • trace LEVEL: 指定使用的级别
  • notrace:将调试级别设置为 0
  • flush:清空DNS服务器的所有缓存记录

 


4.6 实战案例:实现DNS正向主服务器

实验目的

  • 搭建DNS正向主服务器,实现web服务器基于FQDN的访问

环境要求

  • 需要三台主机
  • DNS服务端:10.0.0.101
  • web服务器:10.0.0.102
  • DNS客户端:10.0.0.103

前提准备

  • 关闭SELinux
  • 关闭防火墙
  • 时间同步

(1)在DNS服务端安装bind

yum install bind bind-utils -y

(2)修改bind 配置文件

[root@101 ~]# vim /etc/named.conf             
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query     { localhost; };

[root@101 ~]# vim /etc/named.rfc1912.zones    
#加上下面内容
zone "willoneday.org" IN {
        type master;
        file "willoneday.org.zone";
};

(3)DNS区域数据库文件

[root@101 ~]# cp -p /var/named/named.localhost /var/named/willoneday.org.zone
#如果没有加-p选项,需要修改所有者或权限。chgrp named willoneday.org.zone

[root@101 ~]# vim /var/named/willoneday.org.zone 
$TTL 1D
@       IN SOA  master admin.willoneday.org. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      master
master  A       10.0.0.101
www     A       10.0.0.102

(4)检查配置文件和数据库文件格式,并启动服务

[root@101 ~]# named-checkconf 
[root@101 ~]# named-checkzone willoneday.org /var/named/willoneday.org.zone

[root@101 ~]# systemctl start named          #第一次启动服务
[root@101 ~]# rndc reload                    #不是第一次启动服务

(5)实现WEB服务

#安装http服务
[root@102 ~]# yum install httpd -y                     
#配置主页面
[root@102 ~]# echo "https://www.cnblogs.com/Willoneday" > /var/www/html/index.html
#启动服务
[root@102 ~]# systemctl enable --now httpd

(6)在客户端实现测试

[root@103 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=10.0.0.101

#重启网络
#centos7 以上版执行现下面命令生效
[root@103 ~]# nmcli con reload
[root@103 ~]# nmcli con up eth0
#centos 6 执行下面命令生效
service network restart
#有以下记录,算是重启成功
[root@103 ~]# cat /etc/resolv.conf                    
# Generated by NetworkManager
nameserver 10.0.0.101

#测试网页,能显示就是成功
[root@103 ~]# curl www.willoneday.org          
https://www.cnblogs.com/Willoneday

 


4.7 启用DNS客户端缓存功能

 在高并发的服务器场景中,对DNS的服务器查询性能有较高的要求,如果在客户端启用DNS缓存功能,可以大幅减轻DNS服务器的压力,同时也能提高DNS客户端名称解析速度

4.7.1 nscd命令 CentOS 启用DNS客户端缓存

CentOS 默认没有启用DNS客户端缓存,安装nscd(Name Service Cache Daemon,名称服务缓存守护进程)包可以支持DNS缓存功能

减少DNS服务器压力,提高DNS查询速度

[root@centos7 ~]# yum -y install nscd
[root@centos7 ~]# systemctl enable --now nscd
#查看缓存统计信息
[root@centos7 ~]# nscd -g

4.7.2 Ubuntu 启用DNS客户端缓存

#ubuntu 默认会启用DNS客户端缓存
[root@ubuntu01 ~]# systemctl status systemd-resolved.service
● systemd-resolved.service - Network Name Resolution
     Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-10-18 17:14:08 CST; 2 days ago
       Docs: man:systemd-resolved.service(8)
             https://www.freedesktop.org/wiki/Software/systemd/resolved
             https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
             https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
   Main PID: 70372 (systemd-resolve)
     Status: "Processing requests..."
      Tasks: 1 (limit: 2236)
     Memory: 4.2M
     CGroup: /system.slice/systemd-resolved.service
             └─70372 /lib/systemd/systemd-resolved

Oct 18 20:10:12 ubuntu01 systemd-resolved[70372]: Using degraded feature set (UDP) for DNS server 10.0.0.2.
Oct 18 20:44:51 ubuntu01 systemd-resolved[70372]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 10.0.0.2.
Oct 18 20:44:51 ubuntu01 systemd-resolved[70372]: Using degraded feature set (UDP) for DNS server 10.0.0.2.
Oct 20 19:34:57 ubuntu01 systemd-resolved[70372]: Using degraded feature set (UDP) for DNS server 10.0.0.2.
Oct 20 19:45:27 ubuntu01 systemd-resolved[70372]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 10.0.0.2.
Oct 20 19:45:27 ubuntu01 systemd-resolved[70372]: Using degraded feature set (UDP) for DNS server 10.0.0.2.
Oct 20 20:09:24 ubuntu01 systemd-resolved[70372]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 10.0.0.2.
Oct 20 20:09:24 ubuntu01 systemd-resolved[70372]: Using degraded feature set (UDP) for DNS server 10.0.0.2.
Oct 20 20:52:26 ubuntu01 systemd-resolved[70372]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 10.0.0.2.
Oct 20 20:52:26 ubuntu01 systemd-resolved[70372]: Using degraded feature set (UDP) for DNS server 10.0.0.2.
#清空缓存
[root@ubuntu1804 ~]# systemd-resolve --flush-caches

#查看
[root@ubuntu1804 ~]# systemd-resolve --statistics

 


5 实现反向解析区域

5.1 反向解析配置

反向区域:即将IP反向解析为FQDN

区域名称:网络地址反写.in-addr.arpa.

示例:

172.16.100. --> 100.16.172.in-addr.arpa.
(1)定义区域
zone "ZONE_NAME" IN {
     type {master|slave|forward};
     file "网络地址.zone"
};
(2)定义区域解析库文件

注意:不需要A记录,以PTR记录为主

$TTL 1D
@       IN SOA  master admin.willoneday.org. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      master.
111     PTR     www.willoneday.org.
222     PTR     db.willoneday.org.

5.2 实战案例: 反向解析

(1)操作
[root@101 ~]#  cat /etc/named.conf 
options {
 ......
 listen-on port 53 { localhost; };
 ......
 allow-query     { any; };
 ......
}

[root@101 ~]# vim /etc/named.rfc1912.zones
zone "0.0.10.in-addr.arpa" {
   type master;
   file "10.0.0.zone";
};

[root@101 ~]# cd /var/named
[root@101 named]# cp -p named.loopback 10.0.0.zone
[root@101 named]# cat 10.0.0.zone 
$TTL 1D
@       IN SOA  master admin.willoneday.org. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      master. #NS记录必须以点结束,否则需要配置A记录才可以启动
111     PTR     www.willoneday.org.
222     PTR     db.willoneday.org.

[root@101 named]# named-checkzone 0.0.10.in-addr.arpa 10.0.0.zone 
zone 0.0.10.in-addr.arpa/IN: loaded serial 0
OK
(2)测试
[root@103 ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.0.101
[root@103 ~]#  
[root@103 ~]# dig -t ptr 111.0.0.10.in-addr.arpa.    

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> -t ptr 111.0.0.10.in-addr.arpa.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17985
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;111.0.0.10.in-addr.arpa.       IN      PTR

;; ANSWER SECTION:
111.0.0.10.in-addr.arpa. 86400  IN      PTR     www.willoneday.org.

;; AUTHORITY SECTION:
0.0.10.in-addr.arpa.    86400   IN      NS      master.

;; Query time: 1 msec
;; SERVER: 10.0.0.101#53(10.0.0.101)
;; WHEN: Fri Oct 21 10:29:03 CST 2022
;; MSG SIZE  rcvd: 104

 


6 实现从服务器

只有一台主DNS服务器,存在单点失败的问题,可以建立主DNS服务器的备份服务器,即从服务器来实现DNS服务的容错机制。从服务器可以自动和主服务器进行单向的数据同步,从而和主DNS服务器一样,也可以对外提供查询服务,但从服务器不提供数据更新服务。

6.1 DNS从服务器

  1. 应该为一台独立的名称服务器
  2. 主服务器的区域解析库文件中必须有一条NS记录指向从服务器
  3. 从服务器只需要定义区域,而无须提供解析库文件;解析库文件应该放置于/var/named/slaves/目录中
  4. 主服务器得允许从服务器作区域传送
  5. 主从服务器时间应该同步,可通过ntp进行
  6. bind程序的版本应该保持一致;否则,应该从高,主低

6.2 定义从区域

格式:

zone "ZONE_NAME" IN {
     type slave;
     masters { MASTER_IP; };
     file "slaves/ZONE_NAME.zone";
};

6.3 实战案例:实现DNS从服务器

实验目的

  • 搭建DNS主从服务器架构,实现DNS服务冗余

环境要求

  • 需要四台主机
  • DNS主服务器:10.0.0.101
  • DNS从服务器:10.0.0.104
  • web服务器:10.0.0.102
  • DNS客户端:10.0.0.103

前提准备

  • 关闭SElinux
  • 关闭防火墙
  • 时间同步

(1)主DNS服务端配置

[root@101 ~]# yum install bind -y

[root@101 ~]# vim /etc/named.conf
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query     { localhost; };
#只允许从服务器进行区域传输
allow-transfer { 从服务器IP;}; 

[root@101 ~]# vim /etc/named.rfc1912.zones    
#加上这段
zone "willoneday.org" IN {
        type master;
        file "willoneday.org.zone";
};

[root@101 ~]# cp -p /var/named/named.localhost /var/named/willoneday.org.zone
#如果没有-p,需要改权限。chgrp named willoneday.org.zone

[root@101 ~]# vim /var/named/willoneday.org.zone 
$TTL 1D
@       IN SOA  master admin.willoneday.org. (
                                        4       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      master
        NS      slave
master  A       10.0.0.101
slave   A       10.0.0.104
www     A       1.1.1.1
db      A       2.2.2.2

[root@101 ~]# systemctl start named      #第一次启动服务
[root@101 ~]# rndc reload                #不是第一次启动服务

(2)从DNS服务器配置

[root@104 ~]# yum install -y bind

[root@104 ~]# vim /etc/named.conf
// listen-on port 53 { 127.0.0.1; };
// allow-query     { localhost; };
#不允许其它主机进行区域传输
allow-transfer { none;};

[root@104 ~]# vim /etc/named.rfc1912.zones
zone "willoneday.org" {
       type slave;
       masters { 主服务器IP;};                                                               
       file "slaves/willoneday.org.slave";
};

[root@104 ~]# systemctl start named #第一次启动服务
[root@104 ~]# rndc reload        #不是第一次启动服务

[root@104 ~]# ll /var/named/slaves/willoneday.org.slave #查看区域数据库文件是否生成

 (3)客户端测试主从DNS服务架构

[root@103 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=主服务器
DNS2=从服务器
[root@103 ~]# systemctl restart network

#验证从DNS服务器是否可以查询
[root@103 ~]# dig www.willoneday.org
[root@103 ~]# curl www.willoneday.org

#在主服务器上停止DNS服务
[root@101 ~]# systemctl stop named

#验证从DNS服务器仍然可以查询
[root@103 ~]# dig www.willoneday.org 
[root@103 ~]# curl www.willoneday.org

 


7 实现子域

7.1 子域委派授权

 将子域委派给其它主机管理,实现分布式DNS数据库

正向解析区域子域方法

范例:定义两个子域区域

shanghai.willoneday.org. IN NS ns1.ops.willoneday.org.
shanghai.willoneday.org. IN NS ns2.ops.willoneday.org.
shenzhen.willoneday.org. IN NS ns1.shenzhen.willoneday.org.
shenzhen.willoneday.org. IN NS ns2.shenzhen.willoneday.org.
ns1.shanghai.willoneday.org. IN A 1.1.1.1
ns2.shanghai.willoneday.org. IN A 1.1.1.2
ns1.shenzhen.willoneday.org. IN A 1.1.1.3
ns2.shenzhen.willoneday.org. IN A 1.1.1.4

7.2 实战范例:实现DNS父域和子域服务

实验目的

  • 搭建DNS父域和子域服务器

环境要求

  • 需要五台主机
  • DNS父域服务器:10.0.0.101
  • DNS子域服务器:10.0.0.104
  • 父域的web服务器:10.0.0.102,www.willoneday.org
  • 子域的web服务器:10.0.0.105,www.shanghai.willoneday.org
  • DNS客户端:10.0.0.103

前提准备

  • 关闭SElinux
  • 关闭防火墙
  • 时间同步

(1)在父域DNS服务器上实现主willoneday.org域的主DNS服务

[root@101 ~]# yum install bind -y

[root@101 ~]# vim /etc/named.conf
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query     { localhost; };
#只允许从服务器进行区域传输
allow-transfer { 从服务器IP;}; 
#建议关闭加密验证
dnssec-enable no; 
dnssec-validation no;

[root@101 ~]# vim /etc/named.rfc1912.zones
#加上这段
zone "willoneday.org" IN {
        type master;
        file "willoneday.org.zone";
};

[root@101 ~]# cp -p /var/named/named.localhost /var/named/willoneday.org.zone
#如果没有-p,需要改权限。chgrp named willoneday.org.zone

[root@101 ~]# vim /var/named/willoneday.org.zone 
$TTL 1D
@       IN SOA  master admin.willoneday.org. (
                                        4       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
                NS      master
shanghai        NS      shanghains
master          A       10.0.0.101
shanghains      A       10.0.0.104
www             A       10.0.0.102                

[root@101 ~]# systemctl start named          #第一次启动服务
[root@101 ~]# rndc reload                    #不是第一次启动服务

(2)实现子域的DNS服务器

[root@104 ~]# yum install bind -y

[root@104 ~]# vim /etc/named.conf             
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query     { localhost; };
allow-transfer { none;}; 

[root@104 ~]# vim /etc/named.rfc1912.zones
zone "shanghai.willoneday.org" {
       type master;
       file "shanghai.willoneday.org.zone";
};

[root@104 ~]# cp -p /var/named/named.localhost /var/named/shanghai.willoneday.org.zone
#如果没有-p,需要改权限。chgrp named willoneday.org.zone
[root@104 ~]# vim /var/named/shanghai.willoneday.org.zone 
$TTL 1D
@       IN SOA  master admin.willoneday.org. (
                                        4       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
                NS      master
master          A       10.0.0.101
www             A       10.0.0.102                

[root@104 ~]# systemctl start named   #第一次启动服务
[root@104 ~]# rndc reload             #不是第一次启动服务

(3)在父域和子域的web服务器上安装httpd服务

#父域的web服务器利用上面案例(略)
#在子域的web服务器上安装http服务
yum install httpd                        
#配置主页面
echo www.shanghai.willoneday.org > /var/www/html/index.html
#启动服务
systemctl start httpd

(4)客户端测试

dig www.shanghai.willoneday.org

 


8 实现 DNS 转发(缓存)服务器

8.1 DNS转发

利用DNS转发,可以将用户的DNS请求,转发至指定的DNS服务,而非默认的根DNS服务器,并将指定服务器查询的返回结果进行缓存,提高效率

注意:

  1. 被转发的服务器需要能够为请求者做递归,否则转发请求不予进行
  2. 在/etc/named.conf的全局配置块中,关闭dnssec功能

8.2 转发方式

8.2.1 全局转发

对非本机所负责解析区域的请求,全转发给指定的服务器

在全局配置块中实现:

Options {
       forward first|only;
       forwarders { ip;};
};

8.2.2 特定区域转发

仅转发对特定的区域的请求,比全局转发优先级高

zone "ZONE_NAME" IN {
     type forward;
     forward first|only;
     forwarders { ip;};
};

first:先转发至指定DNS服务器,如果无法解析查询请求,则本服务器再去根服务器查询

only: 先转发至指定DNS服务器,如果无法解析查询请求,则本服务器将不再去根服务器查询

8.3 实战案例:实现DNS forward(缓存)服务器

 


9 实现智能 DNS

9.1 GSLB

GSLB:Global Server Load Balance全局负载均衡

GSLB 是对服务器和链路进行综合判断来决定由哪个地点的服务器来提供服务,实现异地服务器群服务质量的保证

GSLB主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域)

GSLB分为基于DNS实现、基于重定向实现、基于路由协议实现,其中最通用的是基于DNS解析方式

 

9.2 CDN 内容分发网络

9.2.1 CDN工作原理

  1. 用户向浏览器输入www.a.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS服务器请求
  2. 网站的DNS域名解析器设置了CNAME,指向了www.a.tbcdn.com,请求指向了CDN网络中的智能DNS负载均衡系统
  3. 智能DNS负载均衡系统解析域名,把对用户响应速度最快的IP节点返回给用户;
  4. 用户向该IP节点(CDN服务器)发出请求
  5. 由于是第一次访问,CDN服务器会通过Cache内部专用DNS解析得到此域名的原web站点IP,向原站点服务器发起请求,并在CDN服务器上缓存内容
  6. 请求结果发给用户

 

9.3 智能DNS相关技术

 


10 综合实战案例:实现 Internet 的 DNS 服务架构

 


二、Linux 防火墙

1 安全技术和防火墙

1.1 安全技术

  • 入侵检测系统(Intrusion Detection Systems)

特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类似于监控系统一般采用旁路部署方式

  • 入侵防御系统(Intrusion Prevention System)

以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式

  • 防火墙( FireWall )

隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ(demilitarized zone)网络中.

 

1.2 防火墙的分类

按保护范围划分:

  • 主机防火墙:服务范围为当前一台主机
  • 网络防火墙:服务范围为防火墙一侧的局域网

按实现方式划分:

  • 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:华为,山石hillstone,天融信,启明星辰,绿盟,深信服, PaloAlto , fortinet飞塔, Cisco, Checkpoint,NetScreen(2004年被 Juniper 用40亿美元收购)等
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows 防火墙 ISA --> ForefrontTMG

按网络协议划分:

  • 网络层防火墙:OSI模型下四层,又称为包过滤防火墙
  • 应用层防火墙/代理服务器:proxy 代理网关,OSI模型七层

 


2 Linux 防火墙的基本认识

2.1 Netfilter

Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中

Netfilter 是Linux 2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作

[root@rocky01 ~]# grep -m 10 NETFILTER /boot/config-4.18.0-372.9.1.el8.x86_64
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_FAMILY_BRIDGE=y
CONFIG_NETFILTER_FAMILY_ARP=y
# CONFIG_NETFILTER_NETLINK_ACCT is not set
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m

#y表示集成在内核中
[root@rocky01 ~]# ll /boot/vmlinuz-4.18.0-372.9.1.el8.x86_64

#m表示在模块中
[root@rocky01 ~]# ll /lib/modules/4.18.0-372.9.1.el8.x86_64/
[root@rocky01 ~]# modinfo bridge

 

2.2 防火墙工具介绍

2.2.1 iptables

由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包

[root@rocky01 ~]# ll `which iptables`
lrwxrwxrwx. 1 root root 17 Apr 20  2022 /usr/sbin/iptables -> xtables-nft-multi
范例:安装iptables的service包
[root@rocky01 ~]# dnf -y install iptables-services

 

2.2.2 firewalld

从CentOS 7 版开始引入了新的前端管理工具,到Centos8取消

软件包:

  • firewalld
  • firewalld-config

管理工具:

  • firewall-cmd 命令行工具
  • firewall-config 图形工作

 

2.2.3 nftables

此软件是CentOS 8 新特性,Nftables最初在法国巴黎的Netfilter Workshop 2008上发表,然后由长期的netfilter核心团队成员和项目负责人Patrick McHardy于2009年3月发布。

范例:CentOS 8 支持三种防火墙服务

[root@rocky01 ~]# systemctl status iptables
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

[root@rocky01 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

[root@rocky01 ~]# systemctl status nftables
● nftables.service - Netfilter Tables
   Loaded: loaded (/usr/lib/systemd/system/nftables.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:nft(8)

 


2.3 netfilter 中五个勾子函数和报文流向

Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则

由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上

 


2.4 iptables的组成

iptables由五个表table和五个链chain以及一些规则组成

chain

  • 内置链:每个内置链对应于一个钩子函数
  • 自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效

五个内置链chain:

  • INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

五个表tablefilter、nat、mangle、raw、security

  • filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
  • nat:network address translation 地址转换规则表
  • mangle:修改数据标记位规则表
  • raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
  • security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现

优先级由高到低的顺序为:

security -->raw-->mangle-->nat-->filter

范例:查询表和链的对应关系

[root@rocky01 ~]# iptables -t filter -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (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

[root@rocky01 ~]# iptables -t nat -vnL
[root@rocky01 ~]# iptables -t mangle -vnL
[root@rocky01 ~]# iptables -t raw -vnL
[root@rocky01 ~]# iptables -t security -vnL

 


2.5 netfilter 完整流程

 


3 iptables

3.1 iptables 规则说明

3.1.1 iptables 规则组成

规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理,规则在链接上的次序即为其检查时的生效次序

匹配条件:默认为与条件,同时满足

基本匹配:IP,端口,TCP的Flags(SYN,ACK等)

扩展匹配:通过复杂高级功能匹配

处理动作:称为target,跳转目标

  • 内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...
  • 自定义处理动作:自定义chain,利用分类管理复杂情形

规则要添加在链上,才生效;添加在自定义链上不会自动生效

白名单:只有指定的特定主机可以访问,其它全拒绝

黑名单:只有指定的特定主机拒绝访问,其它全允许,默认方式

3.1.2 iptables规则添加时考量点

  • 要实现哪种功能:判断添加在哪张表上
  • 报文流经的路径:判断添加在哪个链上
  • 报文的流向:判断源和目的
  • 匹配规则:业务需要

3.1.3 环境准备

systemctl stop firewalld.service

只是不使用系统的防火墙规则,并不是真正的关闭了firewalld

#CentOS 7,8:
systemctl stop firewalld.service 
systemctl disable firewalld. service
#或者
systemctl disable --now firewalld. service

#CentOS 6:
service iptables stop
chkconfig iptables off

 

3.2 iptables 用法说明

格式:iptables [-t table] {-A|-C|-D} chain rule-specification

命令详解:

iptables   [-t table]   SUBCOMMAND   chain   [-m matchname [per-match-options]] -j targetname [per-target-options]

1-t table:指定表

security,raw, mangle, nat, [filter]默认

2SUBCOMMAND:子命令

链管理类

  • -N:new, 自定义一条新的规则链
  • -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
  • -X:delete,删除自定义的空的规则链
  • -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受, DROP:丢弃
#创建
[root@rocky01 ~]# iptables -N web
#改名
[root@rocky01 ~]# iptables -E web WEB
#添加规则
[root@rocky01 ~]# iptables -A WEB -p tcp -m multiport --dports 80,443 -j ACCEPT
#删除
[root@rocky01 ~]# iptables -X WEB

查看类

  • -L:list, 列出指定鏈上的所有规则,本选项须置后
  • -n:numberic,以数字格式显示地址和端口号
  • -v:verbose,详细信息
  • -vv 更详细
  • -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
  • --line-numbers:显示规则的序号
  • -S selected,以iptables-save 命令格式显示链上规则

常用组合

  • -vnL
  • -vvnxL --line-numbers

规则管理类:

  • -A:append,追加
  • -I:insert, 插入,要指明插入至的规则编号,默认为第一条
  • -D:delete,删除  (1) 指明规则序号 (2) 指明规则本身
  • -R:replace,替换指定链上的指定规则编号
  • -F:flush,清空指定的规则链
  • -Z:zero,置零
  •   iptables的每条规则都有两个计数器(1) 匹配到的报文的个数(2) 匹配到的所有报文的大小之和

范例:Filter表中INPUT规则

#一、丢弃从10.0.0.101发送过来的包
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.101 -j DROP
#二、拒绝从10.0.0.101发送过来的包
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.101 -j REJECT
#三、拒绝从10.0.0.0/24发送过来的包
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.0/24 -j REJECT
#四、插入一条允许10.0.0.1的规则(这里指定了插入在第2条)
[root@rocky01 ~]# iptables -I INPUT 2 -s 10.0.0.1 -j ACCEPT
#四、删除第2条规则
[root@rocky01 ~]# iptables -D INPUT 2
#五、允许从lo回环网卡发进来的数据
[root@rocky01 ~]# iptables -I INPUT -i lo -j ACCEPT

#查看规则
[root@rocky01 ~]# iptables -vnL --line-numbers
#查看收到的icmp包
[root@rocky01 ~]# tcpdump -i eth0 -nn icmp

 


3.3 iptables 基本匹配条件

基本匹配条件:无需加载模块,由iptables/netfilter自行提供

  • [!] -s, --source address[/mask][,...]:源IP地址或者不连续的IP地址
  • [!] -d, --destination address[/mask][,...]:目标IP地址或者不连续的IP地址
  • [!] -p, --protocol protocol:指定协议,可使用数字如0(all)protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“  参看:/etc/protocols
  • [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
  • [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链

范例:使用方法

#-s
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.6,10.0.0.10 -j REJECT

#-i
[root@rocky01 ~]# iptables -I INPUT -i lo -j ACCEPT

#-p
[root@rocky01 ~]# iptables -I INPUT 2 -s 10.0.0.6 ! -p icmp -j ACCEPT

 


3.4 iptables 扩展匹配条件

扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效

扩展模块的查看帮助 :man iptables-extensions

扩展匹配条件:

  • 隐式扩展
  • 显式扩展

3.4.1 隐式扩展

iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块

tcp 协议的扩展选项

  • [!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
  • [!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
  • [!] --tcp-flags mask comp

udp 协议的扩展选项

  • [!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
  • [!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围

 icmp 协议的扩展选项

  • [!] --icmp-type {type[/code]|typename}

    type/code

    0/0   echo-reply     icmp应答

    8/0   echo-request icmp请求

范例:端口规则
#允许10.0.0.6能访问80端口
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.6 -p tcp --dport 80 -j ACCEPT

#允许10.0.0.6能访问80-100的端口
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.6 -p tcp --dport 80:100 -j ACCEPT

#我能ping通10.0.0.6,10.0.0.6不能ping通我
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.6 -p icmp --icmp-type 0 -j ACCEPT
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.6 -j REJECT

 

3.4.2 显式扩展及相关模块

显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块

 扩展模块的使用帮助:

  • CentOS 7,8: man iptables-extensions
  • CentOS 6: man iptables
3.4.2.1 multiport扩展

以离散方式定义多端口匹配,最多指定15个端口

#指定多个源端口

  • [!] --source-ports,--sports port[,port|,port:port]...

# 指定多个目标端口

  • [!] --destination-ports,--dports port[,port|,port:port]...

#多个源或目标端

  • [!] --ports port[,port|,port:port]...
范例:端口规则
#允许10.0.0.6能访问80和443端口
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.6 -p tcp -m multiport --dports 80,443 -j ACCEPT

 

3.4.2.2 iprange扩展

指明连续的(但一般不是整个网络)ip地址范围

  • [!] --src-range from[-to] 源IP地址范围
  • [!] --dst-range from[-to] 目标IP地址范围

范例

[root@rocky01 ~]# iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP

 

3.4.2.3 mac扩展

mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT chains

  • [!] --mac-source XX:XX:XX:XX:XX:XX

范例

#允许MAC地址为00:50:56:12:34:56
[root@rocky01 ~]# iptables -A INPUT -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT

 

3.4.2.4 string扩展
  • 对报文中的应用层数据做字符串模式匹配检测
  • --algo {bm|kmp} 字符串匹配检测算法

  bm:Boyer-Moore

  kmp:Knuth-Pratt-Morris

  • --from offset 开始偏移
  • --to offset   结束偏移
  • [!] --string pattern 要检测的字符串模式
  • [!] --hex-string pattern 要检测字符串模式,16进制格式

范例

#如果index.html含"google",就拒绝
[root@rocky01 ~]# iptables -A OUTPUT -m string --algo bm --from 62 --string "google" -j REJECT

 

3.4.2.5 time扩展

注意:CentOS 8 此模块有问题

  • --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
  • --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  • --timestart hh:mm[:ss]       时间
  • --timestop hh:mm[:ss]
  • [!] --monthdays day[,day...]   每个月的几号
  • [!] --weekdays day[,day...]   星期几,1 – 7 分别表示星期一到星期日
  • --kerneltz:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC

注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

范例

[root@centos7 ~]# iptables -A INPUT -m time --timestart 14:30 --timestop 18:30 --weekdays 1,2,3,4,5 -j REJECT

 

3.4.2.6 connlimit扩展

根据每客户端IP做并发连接数数量匹配

可防止Dos(Denial of Service,拒绝服务)攻击

  • --connlimit-upto N #连接的数量小于等于N时匹配
  • --connlimit-above N #连接的数量大于N时匹配

范例

#连接数量大于10就拒绝
[root@rocky01 ~]# iptables -A INPUT -m connlimit --connlimit-above 10 -j REJECT

 

3.4.2.7 limit扩展

基于收发报文的速率做匹配 , 令牌桶过滤器

  • --limit-burst number #前多少个包不限制
  • --limit #[/second|/minute|/hour|/day]

范例

#1分钟限制10个报文,前5个不限制,第5个之后开始限流
[root@rocky01 ~]# iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
[root@rocky01 ~]# iptables -I INPUT 2 -p icmp -j REJECT
[root@rocky01 ~]# hostname -I
10.0.0.128

#测试
[root@ubuntu01 ~]# ping 10.0.0.128
PING 10.0.0.128 (10.0.0.128) 56(84) bytes of data.
64 bytes from 10.0.0.128: icmp_seq=1 ttl=64 time=0.512 ms
64 bytes from 10.0.0.128: icmp_seq=2 ttl=64 time=0.728 ms
64 bytes from 10.0.0.128: icmp_seq=3 ttl=64 time=0.479 ms
64 bytes from 10.0.0.128: icmp_seq=4 ttl=64 time=0.876 ms
64 bytes from 10.0.0.128: icmp_seq=5 ttl=64 time=0.587 ms
From 10.0.0.128 icmp_seq=6 Destination Port Unreachable
64 bytes from 10.0.0.128: icmp_seq=7 ttl=64 time=0.662 ms
From 10.0.0.128 icmp_seq=8 Destination Port Unreachable
From 10.0.0.128 icmp_seq=9 Destination Port Unreachable
From 10.0.0.128 icmp_seq=10 Destination Port Unreachable
From 10.0.0.128 icmp_seq=11 Destination Port Unreachable
From 10.0.0.128 icmp_seq=12 Destination Port Unreachable
64 bytes from 10.0.0.128: icmp_seq=13 ttl=64 time=0.392 ms
From 10.0.0.128 icmp_seq=14 Destination Port Unreachable

 

3.4.2.8 state扩展

state 扩展模块,可以根据”连接追踪机制“去检查连接的状态,较耗资源

conntrack机制:追踪本机上的请求和响应之间的关系

状态类型

  • NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
  • ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
  • RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
  • INVALID:无效的连接,如flag标记不正确
  • UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
调整连接追踪功能所能够容纳的最大连接数量
[root@centos8 ~]# cat /proc/sys/net/netfilter/nf_conntrack_max
65536
[root@centos8 ~]# cat /proc/sys/net/nf_conntrack_max
65536
范例: 面试题
[root@centos8 ~]# echo 1 > /proc/sys/net/netfilter/nf_conntrack_max
[root@centos8 ~]# tail /var/log/messages 
Jul  8 10:03:53 centos8 kernel: nf_conntrack: nf_conntrack: table full, dropping packet
[root@centos6 ~]# tail /var/log/messages
Jul  8 09:51:16 centos6 kernel: nf_conntrack: table full, dropping packet.

#问:在日志中发现Jul  8 10:03:53 centos8 kernel: nf_conntrack: nf_conntrack: table full, dropping packet
#这条记录出现,为什么?

#解:连接过多的解决方法两个:
(1) 加大nf_conntrack_max 值
vim /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
vim /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
范例: 单向通讯
#我能访问你,你不能访问我
#方法一:单个
[root@rocky01 ~]# iptables -A INPUT -s 10.0.0.129 -m state --state NEW -j REJECT

#方法二:多个
[root@rocky01 ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
[root@rocky01 ~]# iptables -A INPUT -j REJECT

 


3.5 Target

target 包括以下类型:

  • 自定义链, ACCEPT, DROP, REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE
  • LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系统日志中
  • --log-level level   级别: debug,info,notice, warning, error, crit, alert,emerg
  • --log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符

 


3.6 规则优化最佳实践

  1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
  2. 谨慎放行入站的新请求
  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
  4. 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
  5. 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
  6. 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
  7. 设置默认策略,建议白名单(只放行特定连接)
    • iptables -P,不建议,容易出现“自杀现象”
    • 规则的最后定义规则做为默认策略,推荐使用,放在最后一条

 


3.7 iptables规则保存

使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限

持久保存规则

  • CentOS 7,8
iptables-save > /PATH/TO/SOME_RULES_FILE
  • CentOS 6
#将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save

 

 

加载规则

  • CentOS 7,8 重新载入预存规则文件中规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE
  • iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
  •  CentOS 6
#会自动从/etc/sysconfig/iptables 重新载入规则
service iptables restart

 

 

开机自动重载规则

  • 用脚本保存各个iptables命令;让此脚本开机后自动运行/etc/rc.d/rc.local文件中添加脚本路径 /PATH/TO/SOME_SCRIPT_FILE
  • 用规则文件保存各个规则,开机时自动载入此规则文件中的规则在/etc/rc.d/rc.local文件添加
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
  • 定义Unit File, CentOS 7,8 可以安装 iptables-services 实现iptables.service

范例: CentOS 7,8 使用 iptables-services

#安装服务
[root@centos8 ~]# yum -y install iptables-services

#备份
[root@centos8 ~]# cp /etc/sysconfig/iptables{,.bak}

#保存现在的规则到文件中方法1
[root@centos8 ~]# /usr/libexec/iptables/iptables.init save

#保存现在的规则到文件中方法2
[root@centos8 ~]# iptables-save > /etc/sysconfig/iptables

#开机启动
[root@centos8 ~]# systemctl enable iptables.service    
[root@centos8 ~]# systemctl mask firewalld.service nftables.service

 


3.8 网络防火墙

iptables/netfilter 利用filter表的FORWARD链,可以充当网络防火墙

3.8.1 FORWARD 链实现内外网络的流量控制

范例: 实现内网访问可以访问外网,反之禁止

#一、从10.0.0.0/24网段到除了10.0.0.0/24网段的第一个包接收
[root@firewall ~]# iptables -I FORWARD 1 -s 10.0.0.0/24 ! -d 10.0.0.0/24 -m state --state NEW -j ACCEPT

#二、接收所有ESTABLISHED的包
[root@firewall ~]# iptables -I FORWARD 2 -m state --state ESTABLISHED -j ACCEPT

#三、外部网络到的10.0.0.7允许
[root@firewall ~]# iptables -I FORWARD 3 ! -s 10.0.0.0/24 -d 10.0.0.7 -m state --state NEW -j ACCEPT

#四、
[root@firewall ~]# iptables -I FORWARD 4 -j REJECT

 


3.8.2 NAT 表

NAT: network address translation,支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链

请求报文:修改源/目标IP,由定义如何修改

响应报文:修改源/目标IP,根据跟踪机制自动实现

NAT的实现分为下面类型:

  • SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
  • DNAT:destination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
  • PNAT: port nat,端口和IP都进行修改

 


3.8.3 SNAT

SNAT:基于nat表的target,适用于固定的公网IP。适用于专线网络

SNAT选项:

  • --to-source [ipaddr[-ipaddr]][:port[-port]]
  • --random

格式:

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP

注意: 需要开启 ip_forward

范例:

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! –d 10.0.0.0/24 -j SNAT --tosource 172.18.1.6-172.18.1.9

 

 

MASQUERADE:基于nat表的target,适用于动态的公网IP,如:拨号网络。专线适用

MASQUERADE选项:

  • --to-ports port[-port]
  • --random

格式:

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE

范例:

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE
范例:查看本地主机访问公网时使用的IP
[root@centos8 ~]#curl http://ifconfig.me
111.199.191.204

[root@centos8 ~]#curl -L http://tool.lu/ip
当前IP: 111.199.191.204
归属地: 中国 北京 北京

[root@firewall ~]#curl cip.cc
IP : 39.164.140.134
地址 : 中国 河南 鹤壁
运营商 : 移动
数据二 : 河南省郑州市 | 移动
数据三 : 
URL : http://www.cip.cc/39.164.140.134

 


3.8.4 DNAT

DNAT:nat表的target,适用于端口映射,即可重定向到本机,也可以支持重定向至不同主机的不同端口,但不支持多目标,即不支持负载均衡功能

DNAT选项:

--to-destination [ipaddr[-ipaddr]][:port[-port]]

格式:

iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --todestination InterSeverIP[:PORT]

注意: 需要开启 ip_forward

范例:

#启用路由转发
[root@firewall ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=1
[root@firewall ~]# sysctl -p

#公网6.6.6.8访问内网10.0.0.7:80转发到内网10.0.0.7:8080
[root@firewall ~]# iptables -t nat -A PREROUTING -d 6.6.6.8 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.7:8080

 

3.8.5 REDIRECT 转发

REDIRECT,是NAT表的 target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口,可用于PREROUTING OUTPUT链

REDIRECT选项:

  • --to-ports port[-port]

范例:

[root@rocky01 ~]# hostname -I
10.0.0.128

#将访问本机的80端口转到8080端口
[root@rocky01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.128 -p tcp --dport 80 -j REDIRECT --to-ports 8080

 

4 firewalld服务

 

5 nft

 

相关内容

    暂无相关文章