第五周作业

目录

1. 总结openssh服务安全加固和总结openssh免密认证原理,及免认证实现过程。

1.1 OpenSSH服务安全加固

1.2 openssh免密认证原理

2. 总结sudo配置文件格式,总结相关示例。

3. 总结PAM架构及工作原理

PAM架构

PAM相关文件

PAM工作原理

4. 总结PAM配置文件格式,总结相关示例, nologin.so, limits,等模块的使用。

4.1、PAM配置文件格式说明

 4.2 总结nologin.so, limits,等模块的使用

pam_nologin.so 模块

 pam_limits.so模块

5. 实现私有时间服务器

6. 总结DNS域名三级结构

7. 总结DNS服务工作原理,涉及递归和迭代查询原理

7.1 DNS服务的工作原理

7.2 域名解析的两种查询方式

8. 实现私有DNS, 供本地网络主机作DNS递归查询。

8.1 DNS主DNS服务器配置

8.2 客户端配置并测试

9. 总结DNS服务器类型,解析答案,正反解析域,资源记录定义。

9.1 DNS服务器的类型

9.2 解析答案

9.3 正反解析域

9.4 资源记录定义

9.4.1 资源记录定义的

9.4.2 SOA记录

9.4.3 NS记录

9.4.4 MX记录

9.4.5 A记录

9.4.6 AAAA记录

9.4.7 PTR记录

9.4.8 CNAME别名记录

10. 实现DNS主从同步

10.1 DNS主DNS服务器配置

10.2 DNS从服务器配置

10.3 客户端测试主从DNS服务架构

11. 实现DNS子域授权

11.1在父域DNS服务器上实现主wang.org域的主DNS服务

11.2 实现子域的DNS服务器

12. 基于acl实现智能DNS

13. 总结防火墙分类

按保护范围划分:

按实现方式划分:

按网络协议划分:

14. 总结iptable 5表5链, 基本使用,扩展模块。

14.1 五表:

14.2 五链:

14.3 常见的场景:

14.4 扩展模块:

14.4.1 隐性扩展

14.4.2 显性扩展

multiport扩展

 iprange扩展

string扩展

 limit扩展

 state扩展

16. 总结NAT转换原理, DNAT/SDNAT原理,并自行设计架构实现DNAT/SNAT。

16.1 SNAT

 16.2 DNAT

17. 使用REDIRECT将90端口重定向80,并可以访问到80端口的服务

18. firewalld常见区域总结。

19. 通过ntftable来实现暴露本机80/443/ssh服务端口给指定网络访问"


1. 总结openssh服务安全加固和总结openssh免密认证原理,及免认证实现过程。

1.1 OpenSSH服务安全加固

1、禁用不安全的加密算法:在sshd_config文件中禁用不安全的加密算法,如DES和RC4等,建议只使用AES和ChaCha20等安全加密算法。
2、限制用户登录:可以通过修改sshd_config文件中的AllowUsers或DenyUsers选项来限制哪些用户可以登录,也可以使用PAM模块限制用户登录。
3、使用强密码策略:可以通过修改sshd_config文件中的PasswordAuthentication选项来启用强密码策略,建议设置密码最小长度、密码复杂度等。
4、防止暴力破解:可以通过修改sshd_config文件中的MaxAuthTries选项来限制用户登录失败的次数,也可以使用Fail2ban等软件来防止暴力破解。
5、使用公钥认证:使用公钥认证可以减少密码泄露的风险,建议禁用密码认证并启用公钥认证。
6、修改SSH默认端口:将SSH默认端口修改为非常用端口,可以减少暴力破解的风险。
7、定期更新OpenSSH版本:及时更新OpenSSH版本可以修复安全漏洞和提升安全性能。
8、配置防火墙:使用防火墙可以限制SSH服务的访问范围,只允许必要的IP地址访问SSH服务端口。

1.2 openssh免密认证原理

1. 首先在客户端生成一对密钥(ssh-keygen)

2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

3. 当客户端再次发送一个连接请求,包括ip、用户名

4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:magedu

5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

免认证实现过程如下:

第一步:生成自己的公钥私钥对

[root@huang ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vlGQvyK8yCq5kchgtLQItu1MNwOnUKPwQV4cZVZUubk root@huang
The key's randomart image is:
+---[RSA 3072]----+
|..o+oo+oo...     |
|.ooooo   ..      |
|.*o. .  o  o     |
|* * +    oo      |
|o= + +  S o.     |
|=.+ ..o. .E.     |
|+o o  o + .      |
|o. . . o +       |
|.o..o . .        |
+----[SHA256]-----+
[root@huang ~]# ll .ssh
total 8
-rw------- 1 root root 2590 Mar 21 16:36 id_rsa
-rw-r--r-- 1 root root  564 Mar 21 16:36 id_rsa.pub
[root@huang ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDPusvQlxyMvBt7fo6ALqPnEHDG8rOhHhgVy/CwwZHYPdOJS1BC6mnSs6phXkSfLQx8Vui3EC0d716/ImB9BPP58mHNmj5pnXQaKx/EKkSRNw3SzBAV3R/SiDHBui2vXzn9bfmYTCuykqeusmUNlR0tikou0I/33os+cZPpCcdPc0MMSAWrTifcL6uZC5hCJ+rZptoV9Rfm7c4a7tpowgYxvcbiHFS9jvP6ssQQQaLduVZGc6fktMvc+l+iompNjtfCrC8QhZnV/WJoaLbfkcRSsyK3hyTHtl52patb5ctUDPlhjmaEoN81sW7AuhgB2L/w/LuwSF8zY7IS59uTgxq7Oq3gidBhogneb2JRMRh3tLlTzldTtSOUmYLtmCFL3l1Twd1/9aQgpFv9w7oLz+PG2fVDebYLnob2JV5oKLZGwDNJFLCBQaKmmrF2Rh1UuEnmjA2dTQzZXK9s6gY23gpzXDl7w/vbl+72fQwsK2DZK8QgV6aPWrhvlpIQ5m0QnHU= root@huang
 

第二步:把自己的公钥复制到对方的服务器的家目录下的authorized.keys文件中

[root@huang ~]# ssh-copy-id 10.0.0.8
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.8 (10.0.0.8)' can't be established.
ECDSA key fingerprint is SHA256:KpczBJoCArcp+mflZ2q3LL2w6KM8rB0T5u7iE5ZHvFQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.8's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '10.0.0.8'"
and check to make sure that only the key(s) you wanted were added.

[root@rocky8 ~]$ ls .ssh
authorized_keys
[root@rocky8 ~]$ cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDPusvQlxyMvBt7fo6ALqPnEHDG8rOhHhgVy/CwwZHYPdOJS1BC6mnSs6phXkSfLQx8Vui3EC0d716/ImB9BPP58mHNmj5pnXQaKx/EKkSRNw3SzBAV3R/SiDHBui2vXzn9bfmYTCuykqeusmUNlR0tikou0I/33os+cZPpCcdPc0MMSAWrTifcL6uZC5hCJ+rZptoV9Rfm7c4a7tpowgYxvcbiHFS9jvP6ssQQQaLduVZGc6fktMvc+l+iompNjtfCrC8QhZnV/WJoaLbfkcRSsyK3hyTHtl52patb5ctUDPlhjmaEoN81sW7AuhgB2L/w/LuwSF8zY7IS59uTgxq7Oq3gidBhogneb2JRMRh3tLlTzldTtSOUmYLtmCFL3l1Twd1/9aQgpFv9w7oLz+PG2fVDebYLnob2JV5oKLZGwDNJFLCBQaKmmrF2Rh1UuEnmjA2dTQzZXK9s6gY23gpzXDl7w/vbl+72fQwsK2DZK8QgV6aPWrhvlpIQ5m0QnHU= root@huang
 

第三步:再次连接进行操作就不需要密码认证了

[root@huang ~]# ssh 10.0.0.8
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Thu Mar 21 16:20:43 2024 from 10.0.0.1
[root@rocky8 ~]$ hostname -i
fe80::20c:29ff:fef4:963d%eth0 10.0.0.8 192.168.122.1
[root@rocky8 ~]$ 
 

2. 总结sudo配置文件格式,总结相关示例。

sudo组成:

包:sudo

配置文件:/etc/sudo.conf

授权规则配置文件:

/etc/sudoers

/etc/sudoers.d

安全编辑授权规则文件和语文检查工具

/usr/sbin/visudo

范例:

#检查语法

visudo -c

#检查指定配置文件语法

visuso -f /etc/sudoers.d/test

授权编辑规则文件的工具:/usr/bin/sudoedit

执行授权命令:/usr/bin/sudo

时间戳文件:/var/db/sudo

日志文件:/var/log/secure

范例:

[root@rocky8 ~]$ vim /etc/sudoers

## Allow root to run any commands anywhere 
root    ALL=(ALL)   ALL
huang   ALL=(root)  /usr/bin/cat /etc/shadow 

[root@rocky8 ~]$ su huang
[huang@rocky8 root]$ sudo cat /etc/shadow
[sudo] password for huang: 
root:$6$ZUqAAd0hdJDBlkgz$bTHxpdDvV9ri/rjtnixTIEuus2I3G04YQ//XEIFNIH/cPPnhkQFiUW8HAP8Kcp.IMVj16Yu9weBzi47in3I.i0::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
adm:*:18700:0:99999:7::

3. 总结PAM架构及工作原理

PAM Pluggable Authentication Modules ,插件式的验证模块, Sun 公司于 1995 年开发的一种与认证
相关的通用框架机制。 PAM 只关注如何为服务验证用户的 API ,通过提供一些动态链接库和一套统一的
API ,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配
置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证

PAM架构

 

PAM相关文件

包名: pam

模块文件目录:/lib64/security/*.so

特定模块相关的设置文件:/etc/security/

应用程序调用PAM模块的配置文件:

  • 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
  • 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
  • 注意:如/etc/pam.d存在,/etc/pam.conf将失效

PAM工作原理

  1. PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)pam_.s0
  2. PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于lib64/security下)进行安全认证

PAM认证过程:

1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件股是
在/ete/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)

4. 总结PAM配置文件格式,总结相关示例, nologin.so, limits,等模块的使用。

4.1、PAM配置文件格式说明

1.通用配置文件/etc/pam.conf格式,此格式不使用

2.专用配置文件/etc/pam.d/格式

**PAM专有配置文件格式**

1  type    control     module-path     arguments

**各部分含义解释**
1)application:指服分名,如,telnet、login、ftp等,服务名P"OTHER”代表所有没有在该文件中明确配置的其它服务
2)type:指模块类型,即功能
3)control ;PAM车该如何处理与该服务相关的PAM模统的成功战失败情况,一个关健词实现
4)module-path: 用来指明本模块对应的程序文件的路径名
5)Arguments;用来传递给该模块的参数
 

模块类型( module-type
  • Auth 账号的认证和授权
  • Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
  • Password 用户修改密码时密码复杂度检查机制等功能
  • Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
  • -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有
Control:
  • required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应 用程序,即为必要条件
  • requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
  • sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其 它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的requiredrequisite
  • optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略 include: 调用其他的配置文件中定义的配置信息

module-path:

  • 模块文件所在绝对路径:
  • 模块文件所在相对路径:/lib64/security目录下的模块可使用相对路径,如:pam_shells.so
  • pam_limits.so
  • 有些模块有自已的专有配置文件,在/etc/security/*.conf目录下
Arguments
  • debug :该模块应当用syslog( )将调试信息写入到系统日志文件中
  • no_warn :表明该模块不应把警告信息发送给应用程序
  • use_first_pass :该模块不能提示用户输入密码,只能从前一个模块得到输入密码
  • try_first_pass :该模块首先用前一个模块从用户得到密码,如果该密码验证不通过,再提示用户输入新密码
  • use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码
  • expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁

注意:修改PAM配置文件将马上生效

建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误

范例:以login为例

[root@Rocky8 ~]#vim /etc/pam.d/login 

  1 #%PAM-1.0
  2 auth       substack     system-auth
  3 auth       include      postlogin
  4 account    required     pam_nologin.so
  5 account    include      system-auth
  6 password   include      system-auth
  7 # pam_selinux.so close should be the first session rule
  8 session    required     pam_selinux.so close
  9 session    required     pam_loginuid.so
 10 session    optional     pam_console.so
 11 # pam_selinux.so open should only be followed by sessions to be executed in the     user context
 12 session    required     pam_selinux.so open
 13 session    required     pam_namespace.so
 14 session    optional     pam_keyinit.so force revoke
 15 session    include      system-auth
 16 session    include      postlogin
 17 -session   optional     pam_ck_connector.so
                                           

 4.2 总结nologin.so, limits,等模块的使用

pam_nologin.so 模块

功能:如果 /etc/nologin 文件存在 , 将导致非 root 用户不能登陆 , 当该用户登陆时,会显示 /etc/nologin 文件内容,并拒绝登陆
范例: 默认此模块可以对ssh等登录有效,但不影响su登录

[root@rocky8 /etc/pam.d]$ grep pam_nologin *

login:account    required     pam_nologin.so
remote:account    required     pam_nologin.so
sshd:account    required     pam_nologin.so
 

 pam_limits.so模块

功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用
内存空间

修改限制的实现方式:
(1) ulimit 命令
ulimit linux shell 的内置命令,它具有一套参数集,用于对 shell 进程及其子进程进行资源限制。
ulimit 的设定值是 per-process 的,也就是说,每个进程有自己的 limits 值。
使用 ulimit 进行修改,立即生效。
ulimit 只影响 shell 进程及其子进程,用户登出后失效。
可以在 profile 中加入 ulimit 的设置,变相的做到永久生效。
-H 设置硬件资源限制 . -S 设置软件资源限制 .
-a 显示当前所有的资源限制 .
-c size: 设置 core 文件的最大值 . 单位 :blocks
-d size: 设置数据段的最大值 . 单位 :kbytes
-f size: 设置创建文件的最大值 . 单位 :blocks
-l size: 设置在内存中锁定进程的最大值 . 单位 :kbytes
-m size: 设置可以使用的常驻内存的最大值 . 单位 :kbytes
-n size: 设置内核可以同时打开的文件描述符的最大值 . 单位 :n
-p size: 设置管道缓冲区的最大值 . 单位 :kbytes
-s size: 设置堆栈的最大值 . 单位 :kbytes
-t size: 设置 CPU 使用时间的最大上限 . 单位 :seconds
-u size: 最大用户进程数
-v size: 设置虚拟内存的最大值 . 单位 :kbytes
unlimited 是一个特殊值,用于表示不限制
#说明
查询时,若不加 H S 参数,默认显示的是软限制
修改时,若不加 H S 参数,两个参数一起改变

(2) 配置文件:
pam_limits 的设定值是基于 per-process
/etc/security/limits.conf
/etc/security/limits.d/*.conf
配置文件格式:
# 每行一个定义
<domain>       <type> <item> <value>
格式说明:
应用于哪些对象
Username 单个用户
@group 组内所有用户
* 所有用户
% 仅用于限制 maxlogins limit , 可以使用 %group 语法 . 只用 % 相当于 * 对所有用户
maxsyslogins limit 限制 . %group 表示限制此组中的所有用户总的最大登录数
限制的类型
Soft 软限制 , 普通用户自己可以修改
Hard 硬限制 , root 用户设定,且通过 kernel 强制生效
- 二者同时限定
限制的资源
nofile 所能够同时打开的最大文件数量 , 默认为 1024
nproc 所能够同时运行的进程的最大数量 , 默认为 1024
注意: systemd service 资源设置需要单独配置
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services. 在Centos7 以上版本中,使用 Systemd 替代了之前的 SysV /etc/security/limits.conf文件的配置作用域缩小了。/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。因此登录用户的限制,通过/etc/security/limits.conf与/etc/security/limits.d下的文件设置即可。
对于 systemd service 的资源设置,则需修改全局配置,全局配置文件放在 /etc/systemd/system.conf和/etc/systemd/user.conf ,同时也会加载两个对应目录中的所有 .conf 文件/etc/systemd/system.conf.d/*.conf /etc/systemd/user.conf.d/*.conf system.conf是系统实例使用的,user.conf 是用户实例使用的。
vim /etc/systemd/system.conf
DefaultLimitNOFILE=100000
DefaultLimitNPROC=65535
或者针对指定的 service 添加下面行
[Service]
LimitNOFILE=100000
LimitNPROC=65535
范例:系统的各种资源的默认值
[root@rocky8 /etc/pam.d]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 6904
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6904
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
范例: ulimit 命令修改用户打开的文件个数
[root@rocky8 ~]$ ulimit -n
1024
[root@rocky8 ~]$ ulimit -n 1048577
bash: ulimit: open files: cannot modify limit: Operation not permitted
[root@rocky8 ~]$ ulimit -n 1048576
[root@rocky8 ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 6904
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1048576
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6904
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
 
范例: 限制用户最多打开的文件数和运行进程数,并持久保存
vim /etc/security/limits.conf  
# 用户 apache 可打开 10240 个文件
apache   - nofile 10240
# 用户 student 不能运行超过 20 个进程
student hard nproc 10
# student 登录多次运行 bash ,观察结果
[root@centos8 ~] #vim /etc/security/limits.conf
huang           -     nofile 66666
[root@rocky8 ~]$ su huang
[huang@rocky8 root]$ ulimit -n
66666
 

5. 实现私有时间服务器

# 服务器端配置

[root@rocky8 ~]$ hostname -I
10.0.0.8 192.168.122.1 
[root@rocky8 ~]$ yum -y install chrony

[root@rocky8 ~]$ vim /etc/chrony.conf

server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
#allow 192.168.0.0/16
allow 0 .0.0.0/0   # 加此行 , 指定允许同步的网段
# Serve time even if not synchronized to a time source.
local stratum 10 # 删除此行注释 , 当互联网无法连接 , 仍然可以为客户端提供时间同步服务
[root@rocky8 ~]$ systemctl restart chronyd
[root@rocky8 ~]$ ss -ntlu|grep 123    # 服务启动后会打开端口 123/udp
udp   UNCONN 0      0             0.0.0.0:123        0.0.0.0:*
# 客户端配置
[root@huang ~]# yum -y install chrony
[root@huang ~]# vim /etc/chrony.conf
server 10 .0.0.8 iburst

[root@huang ~]# systemctl restart chronyd.service 

#确认同步成功
[root@huang ~]# chronyc sources -v

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 10.0.0.8                      3   6    17     9  -1405ns[  +46us] +/-   30ms

 


6. 总结DNS域名三级结构

DNS三级结构图:

DNS(Domain Name System)是用于将域名解析为IP地址的系统。DNS的名称结构分为三个级别,分别是:

1. 顶级域名(Top-Level Domain,TLD):顶级域名是DNS名称结构的最高级别。常见的顶级域名包括.com、.org、.net等。顶级域名由ICANN(Internet Corporation for Assigned Names and Numbers)进行管理。

2. 二级域名(Second-Level Domain,SLD):二级域名是紧随在顶级域名后面的一级域名。例如,在域名.dingbh.top中,dingbh就是二级域名。二级域名的注册和管理由域名注册商进行。

3. 子域名(Subdomain):子域名是在二级域名下的更低级别的域名。例如,在www.dingbh.top中,www就是一个子域名。子域名可以无限级别地扩展,例如blog.dingbh.top、support.blog.dingbh.top等等。

总结:DNS名称结构分为三个级别,分别是顶级域名、二级域名和子域名。顶级域名是DNS名称结构的最高级别,由ICANN进行管理;二级域名是紧随在顶级域名后面的一级域名,由域名注册商注册和管理;子域名是在二级域名下的更低级别的域名,可以无限级别地扩展。
 

7. 总结DNS服务工作原理,涉及递归和迭代查询原理

7.1 DNS服务的工作原理

**DNS服务的工作原理可以分为两个主要过程:域名解析和缓存**

1. 域名解析

  • 当用户在浏览器中输入一个网址时,浏览器会向本地的DNS服务器(运营商提供的或者是配置的公共DNS服务器)发送一个DNS查询请求,这个请求包含要访问的域名。
  • 本地DNS服务器会首先在自己的缓存中查找是否有该域名的IP地址,如果有缓存,则直接返回给浏览器;如果没有,则向Internet上的根DNS服务器发送查询请求。
  • 根DNS服务器会告诉本地DNS服务器要查询的顶级域名服务器的IP地址(例如.com、.cn等)。本地DNS服务器再向顶级域名服务器发送查询请求,顶级域名服务器会告诉本地DNS服务器要查询的二级域名服务器的IP地址(例如baidu.com、google.com等)。
  • 本地DNS服务器再向二级域名服务器发送查询请求,二级域名服务器会告诉本地DNS服务器该域名的IP地址,本地DNS服务器再把该IP地址返回给用户的浏览器,这时用户的浏览器就可以访问对应的网站了。

2. 缓存

  • 为了减少DNS查询的时间和延迟,每个DNS服务器都会在自己的缓存中保存查询过的域名和IP地址。如果在缓存中找到了对应的IP地址,本地DNS服务器就可以直接返回该IP地址,这样就可以减少查询时间和提高网站访问速度。
  • 如果在缓存中未找到对应的IP地址,本地DNS服务器会依次向上级DNS服务器进行查询,直到查询到对应的IP地址或者所有DNS服务器都没有查询到对应的IP地址。

7.2 域名解析的两种查询方式

**递归查询**

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

**迭代查询**

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


8. 实现私有DNS, 供本地网络主机作DNS递归查询。

8.1 DNS主DNS服务器配置

#在主配置文件中定义区域

[root@rocky8 ~]$ vim /etc/named.conf 

# 注释掉下面两行
// listen-on port 53 { 127 .0.0.1; };
// allow-query     { localhost; };
vim /etc/named.rfc1912.zones    
# 加上下面内容

zone "huang.com"{
    type master;
    file "huang.com.zone";

};

#主配置文件检查语法无误

[root@rocky8 ~]$ named-checkconf  
[root@rocky8 ~]$

#定义区域解析库文件

[root@rocky8 ~]$ vim /var/named/huang.com.zone

$TTL 1D
@   IN SOA  master admin.huang.com (
                    20240314    ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
            NS    master
master      A     10.0.0.8
www         A     10.0.0.7   

#解析库文件检查语法无误

[root@rocky8 ~]$ named-checkzone huang.com /var/named/huang.com.zone 
zone huang.com/IN: loaded serial 20240314
OK
[root@rocky8 ~]$ rndc reload
server reload successful
 

-

8.2 客户端配置并测试

[root@localhost ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.0.18

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=10.0.0.6
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.8
 

[root@localhost ~]# nmcli c reload 
[root@localhost ~]# nmcli c up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
 

[root@localhost ~]# ping www.huang.com
PING www.huang.com (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7 (10.0.0.7): icmp_seq=1 ttl=64 time=0.322 ms
64 bytes from 10.0.0.7 (10.0.0.7): icmp_seq=2 ttl=64 time=0.183 ms
64 bytes from 10.0.0.7 (10.0.0.7): icmp_seq=3 ttl=64 time=0.178 ms
64 bytes from 10.0.0.7 (10.0.0.7): icmp_seq=4 ttl=64 time=0.178 ms
 


9. 总结DNS服务器类型,解析答案,正反解析域,资源记录定义。

9.1 DNS服务器的类型

  • DNS服务器:管理和维护所负责解析的域内解析库的服务器
  • DNS服务器:从主服务器或从服务器"复制"(区域传输)解析库副本
  • 缓存DNS服务器(转发器)

9.2 解析答案

  • 肯定答案:存在对应的查询结果
  • 否定答案:请求的条目不存在等原因导致无法返回结果
  • 权威答案:直接由存有此查询结果的DNS服务器(权威服务器)返回的答案
  • 非权威答案:由其它非权威服务器返回的查询答案

9.3 正反解析域

  • 正向:FQDN Fully Qualified Domain Name --> IP
  • 反向: IP --> FQDN

9.4 资源记录定义

区域解析库:由众多资源记录 RR(Resource Record) 组成
记录类型: A, AAAA, PTR, SOA, NS, CNAME, MX
  • SOAStart Of Authority,起始授权记录;一个区域解析库有且仅能有一个SOA记录,必须位于解析库的第一条记录
  • Ainternet Address,作用,FQDN --> IP
  • AAAAFQDN --> IPv6
  • PTRPoinTeRIP --> FQDN
  • NSName Server,专用于标明当前区域的DNS服务器
  • CNAME Canonical Name,别名记录
  • MXMail eXchanger,邮件交换器
  • TXT:对域名进行标识和说明的一种方式,一般做验证记录时会使用此项,如:SPF(反垃圾邮件)记录,https验证等,如下示例:
  • _dnsauth TXT 2012011200000051qgs69bwoh4h6nht4n1h0lr038x

9.4.1 资源记录定义的

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

9.4.2 SOA记录

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

9.4.3 NS记录

  • name: 当前区域的名字
  • value: 当前区域的某DNS服务器的名字,例如: ns.wang.org.
注意:
1. 相邻的两个资源记录的 name 相同时,后续的可省略
2. NS 记录而言,任何一个 ns 记录后面的服务器名字,都应该在后续有一个 A 记录
3. 一个区域可以有多个 NS 记录
范例:
huang.org. IN NS ns1.huang.org.
huang.org. IN NS ns2.huang.org.

9.4.4 MX记录

name: 当前区域的名字
value: 当前区域的某邮件服务器 (smtp 服务器 ) 的主机名
注意:
1. 一个区域内, MX 记录可有多个;但每个记录的 value 之前应该有一个数字 (0-99) ,表示此服务器的
优先级;数字越小优先级越高
2. MX 记录而言,任何一个 MX 记录后面的服务器名字,都应该在后续有一个 A 记录
范例:
huang.org. IN MX mx1.huang.org.
                  IN MX mx2.huang.org.

9.4.5 A记录

name: 某主机的 FQDN ,例如: www.huang.com
value: 主机名对应主机的 IP 地址
避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址
范例:
www. huang.com        IN       A      10.0.0.7

9.4.6 AAAA记录

name: FQDN
value: IPv

9.4.7 PTR记录

name: IP ,有特定格式,把 IP 地址反过来写, 1.2.3.4 ,要写作 4.3.2.1 ;而有特定后缀: in
addr.arpa. ,所以完整写法为: 4.3.2.1.in-addr.arpa.
value: FQDN
注意:网络地址及后缀可省略;主机地址依然需要反着写
例如:
4 .3.2.1.in-addr.arpa. IN PTR www.huang.com.
# 1.2.3 为网络地址,可简写成:
4 IN PTR www.huang.com.

9.4.8 CNAME别名记录

name: 别名的 FQDN
value: 真正名字的 FQDN
例如:
www.huang.com. IN CNAME   websrv.huang.com.

10. 实现DNS主从同步

10.1 DNS主DNS服务器配置

#在主配置文件中定义区域

[root@rocky8 ~]$ vim /etc/named.conf 

# 注释掉下面两行
// listen-on port 53 { 127 .0.0.1; };
// allow-query     { localhost; };
#允许从服务器进行区域传输
allow-transfer {10.0.0.18;};
vim /etc/named.rfc1912.zones    
# 加上下面内容

zone "huang.com"{
    type master;
    file "huang.com.zone";

};

#主配置文件检查语法无误

[root@rocky8 ~]$ named-checkconf  
[root@rocky8 ~]$

#定义区域解析库文件

[root@rocky8 ~]$ vim /var/named/huang.com.zone

$TTL 1D
@   IN SOA  master admin.huang.com (
                    20240314    ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
            NS    master

            NS    slave
master      A     10.0.0.8
slave         A     10.0.0.18   

#解析库文件检查语法无误

[root@rocky8 ~]$ named-checkzone huang.com /var/named/huang.com.zone 
zone huang.com/IN: loaded serial 20240314
OK

[root@rocky8 ~]$ rndc reload
server reload successful
 

10.2 DNS从服务器配置

[root@rocky8 ~]$ yum install bind -y
[root@rocky8 ~]$ vim /etc/named.conf
// listen-on port 53 { 127 .0.0.1; };
// allow-query     { localhost; };
# 不允许其它主机进行区域传输
  allow-transfer { none;};
[root@rocky8 ~]$ vim /etc/named.rfc1912.zones
zone "huang.com" {
  type slave;
  masters { 10.0.0.8 ;};                                                      
  file "slaves/huang.com.zone.slave" ;
};
systemctl start named           # 第一次启动服务
rndc reload                     # 不是第一次启动服务
ls /var/named/slaves/wang.org.slave # 查看区域数据库文件是否生成

10.3 客户端测试主从DNS服务架构

[root@rocky8 ~]$ vim /et c/sysconfig/network-scripts/ifcfg-eth0
DNS1 = 10.0.0.8
DNS2 = 10.0.0.18
# 验证从 DNS 服务器是否可以查询
dig www.huang.com
curl www.huang.com
# 在主服务器上停止 DNS 服务
systemctl stop named
# 验证从 DNS 服务器仍然可以查询
dig www.huang.com
curl www.huang.com

11. 实现DNS子域授权

11.1在父域DNS服务器上实现主wang.org域的主DNS服务

[root@rocky8 ~] yum install bind -y
[root@rocky8 ~] vim /etc/named.conf
# 注释掉下面两行
// listen-on port 53 { 127 .0.0.1; };
// allow-query     { localhost; };
# 只允许从服务器进行区域传输
allow-transfer { 从服务器 IP;};
# 建议关闭加密验证
dnssec-enable no;
dnssec-validation no;
vim /etc/named.rfc1912.zones    
# 加上这段
zone "huang.com" {
  type master;
  file   "huang.com.zone" ;
};
cp -p /var/named/named.localhost /var/named/ huang.com.zone
# 如果没有 -p ,需要改权限。chgrp named huang.com.zone
vim /var/named/huang.com.zone
$TTL 1D
@ IN SOA master admin.huang.com. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
      NS master
guangzhou           NS   guangzhouns
master                  A     10 .0.0.8
guangzhouns       A     10 .0.0.18
www                     A     10 .0.0.7                
systemctl start named           # 第一次启动服务
rndc reload                     # 不是第一次启动服务

11.2 实现子域的DNS服务器

[root@rocky8 ~] yum install bind -y
[root@rocky8 ~] vim /etc/named.conf            
# 注释掉下面两行
// listen-on port 53 { 127 .0.0.1; };
// allow-query     { localhost; };
allow-transfer { none;};
vim /etc/named.rfc1912.zones
zone "guangzhou.huang.com" {
  type master;
  file "guangzhou.huang.com.zone" ;
};
cp -p /var/named/named.localhost /var/named/ guangzhou.huang.com.zone
# 如果没有 -p ,需要改权限。chgrp named huang.com.zone
vim /var/named/ guangzhou.huang.com.zone
$TTL 1D
@   IN SOA master admin. huang.com . (
                    2019042214 ; serial
                  1D ; refresh
                  1H ; retry
                  1W ; expire
                  3H )   ; minimum
          NS   master

master     A     10 .0.0.18
www       A     10 .0.0.17
systemctl start named           # 第一次启动服务
rndc reload                     # 不是第一次启动服务

12. 基于acl实现智能DNS

# 主DNS服务端
[root@rocky8 ~]yum -y install bind
 
[root@rocky8 ~]vim /etc/named.conf
acl beijing {
    10.0.0.0/24
};
acl shanghai {
    172.16.0.0/16
};
acl othernet {
    any
};
 
# 注释掉下面两行
// listen-on port 53 { 172.0.0.1; };
// allow-query { localhost; };
 
view beijingview {
    match-clients { beijingnet; };
    include "/etc/named.rfc1912.zones.bj";
};
view shanghaiview {
    match-clients { shanghainet; };
    include "/etc/named.rfc1912.zones.sh";
};
view otherview {
    match-clients { othernet; };
    include "/etc/named.rfc1912.zones.other";
};
include "/etc/named.root.key";
 
# 实现区域配置文件
vim /etc/named.rfc1912.zones.bj
zone "." IN {
    type hint;
    file "named.ca";
};
zone "huang.org" IN {
    type master;
    file "huang.org.zone.bj";
};
 
vim /etc/named.rfc1912.zones.sh
zone "." IN {
    type hint;
    file "named.ca";
};
zone "huang.org" IN {
    type master;
    file "huang.org.zone.sh";
};
 
vim /etc/named.rfc1912.zones.other
zone "." IN {
    type hint;
    file "named.ca";
};
zone "huang.org" IN {
    type master;
    file "huang.org.zone.other";
};
 
chgrp named /etc/named.rfc1912.zones.bj
chgrp named /etc/named.rfc1912.zones.sh
chgrp named /etc/named.rfc1912.zones.other
 
# 创建1区域数据库文件
vim /var/named/huang.org.zone.bj
$TTL 1D
@       IN SOA  master admin.huang.org. (
                                        1       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
                      NS        master
master            A         10.0.0.135
websrv            A         10.0.0.146
www               CNAME  websrv
 
 
vim /var/named/huang.org.zone.sh
$TTL 1D
@       IN SOA  master admin.huang.org. (
                                        1       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
                      NS        master
master            A         10.0.0.135
websrv            A         172.16.0.3
www               CNAME  websrv
 
vim /var/named/huang.org.zone.other
$TTL 1D
@       IN SOA  master admin.huang.org. (
                                        1       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
                      NS        master
master            A         10.0.0.135
websrv            A         127.0.0.1
www               CNAME  websrv
 
chgrp named /var/named/huang.org.zone.bj
chgrp named /var/named/huang.org.zone.sh
chgrp named /var/named/huang.org.zone.other
 
systemctl start name


13. 总结防火墙分类

按保护范围划分:

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

按实现方式划分:

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

按网络协议划分:

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


14. 总结iptable 5表5链, 基本使用,扩展模块。

14.1 五表:

  • security表:主要针对的是数据链路层的管理规则组合,只不过它是基于target目标来操作的。
  • filter表:是netfilter中最重要的表,也是默认的表,主要负责数据包的过滤功能
  • nat表:主要实现网络地址转换的表。可以自由转换数据报文中的ip和port
  • mangle表:主要实现数据包的拆分-修改-封装动作
  • raw表:通过关闭nat表的追踪功能,从而实现加速防火墙过滤的表

14.2 五链:

  • PRE_ROUTING:数据包进行路由决策前应用的规则,一般用于改变数据包的目标地址,不让别人知道我找的是谁(对进入的数据包进行预处理)
  • INPUT:数据包经由路由决策后,进入到本机处理时应用的规则,一般用于本机进程处理的数据包(数据包本机处理)
  • OUTPUT:新建数据包经路由决策后,从本机输出时应用的规则,一般用于本机处理后的数据包(数据包本机发出)
  • FORWARD:数据包经由路由决策后,本机不做处理,仅仅是转发数据包时应用的规则(数据包本机转发)
  • POSTROUTING:数据包从本机出去前,对数据包应用的规则,一般用于更改数据包的源地址信息,不让给别人知道我是谁(对输出的数据包进行预处理)

14.3 常见的场景:

本机处理数据包:PREROUTING->INPUT->OUTPUT->POSTROUTING

本机转发数据包:PREROUTING->FORWARD->POSTROUTING

14.4 扩展模块:

14.4.1 隐性扩展

tcp 协议的扩展选项
[!] --source-port , --sport port[:port] :匹配报文源端口 , 可为端口连续范围
[!] --destination-port ,--dport port[:port] :匹配报文目标端口 , 可为连续范围
[!] --tcp-flags mask comp
    mask 需检查的标志位列表,用 , 分隔 , 例如 SYN,ACK,FIN,RST  
    comp mask 列表中必须为 1 的标志位列表,无指定则必须为 0 ,用 , 分隔 tcp 协议的扩展选项
范例:
--tcp-flags SYN,ACK,FIN,RST SYN       # 表示要检查的标志位为 SYN,ACK,FIN,RST 四个,其中
SYN 必须为 1 ,余下的必须为 0 ,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK   # 第二次握手
[!] --syn :用于匹配第一次握手 , 相当于: --tcp-flags SYN,ACK,FIN,RST SYN

 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 请求

范例:

[root@centos8 ~] #iptables -A INPUT -s 10.0.0.6 -p tcp --dport 21:23 -j REJECT
[root@centos8 ~] #ipn
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source              
destination        
1         1     60 REJECT     tcp   -- *     *       10 .0.0.6            
0 .0.0.0/0           tcp dpts:21:23 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 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source              
destination

14.4.2 显性扩展

显示扩展即必须使用 -m 选项指明要调用的扩展模块名称,需要手动加载扩展模块
[-m matchname [per-match-options]]
multiport扩展
以离散方式定义多端口匹配 , 最多指定 15 个端口
# 指定多个源端口
[!] --source-ports ,--sports port[,port|,port:port]...
# 指定多个目标端口
[!] --destination-ports ,--dports port[,port|,port:port]...
# 多个源或目标端
[!] --ports port[,port|,port:port]
范例:
[root@centos8 ~] #iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m
multiport --dports 20:22,80 -j ACCEPT
[root@centos8 ~] #iptables -A INPUT -s 10.0.0.6 -p tcp -m multiport --dports
445,139 -j REJECT
[root@centos8 ~] #ipn
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source              
destination        
1         2   120 REJECT     tcp   -- *     *       10 .0.0.6            
0 .0.0.0/0           multiport dports 445 ,139 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 0 packets, 0 bytes)  num   pkts byte
 iprange扩展
指明连续的(但一般不是整个网络) ip 地址范围
[!] --src-range from[-to] IP 地址范围
[!] --dst-range from[-to] 目标 IP 地址范围

范例:

iptables -A INPUT -d 172 .16.1.100 -p tcp --dport 80 -m iprange --src-range
172 .16.1.5-172.16.1.10 -j DROP
string扩展
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm Boyer-Moore
kmp Knuth-Pratt-Morris
--from offset 开始偏移
--to offset   结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern 要检测字符串模式, 16 进制格式
范例:
iptables -A OUTPUT -p tcp --sport 80 -m string --algo kmp --from 62   --string  
"google" -j REJECT
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62   --string  
"google" -j REJECT # 此算法有 bug
 limit扩展

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

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

范例:

[root@centos8 ~] #iptables -A INPUT -p icmp -m limit --limit-burst 10 --limit
20/minute -j ACCEPT
[root@centos8 ~] #iptables -A INPUT -p icmp -j REJECT
[root@centos6 ~] #ping 10.0.0.8
PING 192 .168.39.8 (192.168.39.8) 56 (84) bytes of data.
64 bytes from 192 .168.39.8: icmp_seq = 1 ttl = 64 time = 0 .779 ms
64 bytes from 192 .168.39.8: icmp_seq = 2 ttl = 64 time = 0 .436 ms
64 bytes from 192 .168.39.8: icmp_seq = 3 ttl = 64 time = 0 .774 ms
64 bytes from 192 .168.39.8: icmp_seq = 4 ttl = 64 time = 0 .391 ms
64 bytes from 192 .168.39.8: icmp_seq = 5 ttl = 64 time = 0 .441 ms
64 bytes from 192 .168.39.8: icmp_seq = 6 ttl = 64 time = 0 .356 ms
64 bytes from 192 .168.39.8: icmp_seq = 7 ttl = 64 time = 0 .553 ms
64 bytes from 192 .168.39.8: icmp_seq = 8 ttl = 64 time = 0 .458 ms
64 bytes from 192 .168.39.8: icmp_seq = 9 ttl = 64 time = 0 .459 ms
64 bytes from 192 .168.39.8: icmp_seq = 10 ttl = 64 time = 0 .479 ms
64 bytes from 192 .168.39.8: icmp_seq = 11 ttl = 64 time = 0 .450 ms
64 bytes from 192 .168.39.8: icmp_seq = 12 ttl = 64 time = 0 .471 ms
64 bytes from 192 .168.39.8: icmp_seq = 13 ttl = 64 time = 0 .531 ms
64 bytes from 192 .168.39.8: icmp_seq = 14 ttl = 64 time = 0 .444 ms
From 192 .168.39.8 icmp_seq = 15 Destination Port Unreachable
64 bytes from 192 .168.39.8: icmp_seq = 16 ttl = 64 time = 0 .668 ms
From 192 .168.39.8 icmp_seq = 17 Destination Port Unreachable
From 192 .168.39.8 icmp_seq = 18 Destination Port Unreachable
64 bytes from 192 .168.39.8: icmp_seq = 19 ttl = 64 time = 0 .692 ms
From 192 .168.39.8 icmp_seq = 20 Destination Port Unreachable
From 192 .168.39.8 icmp_seq = 21 Destination Port Unreachable
64 bytes from 192 .168.39.8: icmp_seq = 22 ttl = 64 time = 0 .651 ms
 state扩展

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

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

 状态类型

  • NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发 出的请求
  • ESTABLISHEDNEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
  • RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系 
  • INVALID:无效的连接,如flag标记不正确
  • UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
格式:
[!] --state state
范例:
iptables -A INPUT -d 172 .16.1.10 -p tcp -m multiport --dports 22 ,80 -m state --
state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172 .16.1.10 -p tcp -m multiport --sports 22 ,80 -m state --
state ESTABLISHED -j ACCEPT
[root@centos8 ~] #iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # 此条规
则必须在 NEW 规则前面
[root@centos8 ~] #iptables -A INPUT -m state --state NEW -j REJECT

15. 总结iptables规则优化实践,规则保存和恢复。

规则优化实践

1.安全放行所有入站和出站的状态为ESTABLISHED状态链接,建议放在第一条,效率更高
2.谨慎方形入站的新情求
3.有特殊目的限制访问功能,要在放行规则之前加以拒绝
4.同类规则,匹配范围小的放在前面,用于特殊处理
5.不同类的规则,匹配范围大的放在前面,效率更高

-s 10.0.0.6 -p tcp --dport 3306 -j REJECT
-s 172.16.0.0/16 -p tcp --dport 80 -j REJECT

6.应该将那些可由一条规则能够描述的多个规则个合并为一条,减少规则数量,提高检查效率
7.设置默认策略,建议白名单(只放行特定连接

  • iptables -P,不建议,容易出现自杀现象
  • 规则的最后定义规则做为默认策略,推荐使用,放在最后一条

持久保存规则:
CentOS7,8:

iptables-save > /PATH/TO/SOME_RULES_FILE

CentOS6:

# 将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save

加载规则:
CentOS7,8:

iptables-restore < /PATH/TO/SOME_RULES_FILE

CentOS6:

service iptables restart

开机自动重载规则:

  • 用脚本保存各个iptables命令,让此脚本开机自动运行,/etc/rc.d/rc.local文件中添加脚本路径
  • 用规则文件保存各个规则,开机时自动载入此规则文件中的规则 /etc/rc.d/rc.local文件添加
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
  • 定义Unit File, CentOS 78 可以安装 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

16. 总结NAT转换原理, DNAT/SDNAT原理,并自行设计架构实现DNAT/SNAT。

NAT: network address translation ,支持 PREROUTING INPUT OUTPUT POSTROUTING 四个链
请求报文:修改源 / 目标 IP ,由定义如何修改
响应报文:修改源 / 目标 IP ,根据跟踪机制自动实现
NAT的实现分为下面类型:
  • SNATsource NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
  • DNATdestination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
  • PNAT: port nat,端口和IP都进行修改

16.1 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
范例:
# 启用路由转发
[root@firewall ~] #vim /etc/sysctl.conf
net.ipv4 .ip_forward = 1
[root@firewall ~] #sysctl -p
# 针对专线静态公共 IP
[root@firewall ~] #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to
source 192.168.0.8
# 针对拨号网络和专线静态公共 IP
[root@firewall ~] #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
# 查看监听端口
[root@firewall ~] #ss -ntl
State         Recv-Q         Send-Q                 Local Address:Port          
      Peer Address:Port        
LISTEN         0               128                           0 .0.0.0:22            
            0 .0.0.0:*          
LISTEN         0               100                         127 .0.0.1:25            
            0 .0.0.0:*          
LISTEN         0               128                             [::]:22            
              [::]:*          
LISTEN         0               100                           [::1]:25            
              [::]:*    
# 内网可以访问外网
[root@lanserver1 ~] #curl 192.168.0.6
internet
# 外网不可以访问内网
[root@internet ~] #curl 10.0.0.7
curl : (7) Failed to connect to 10 .0.0.7: Network is unreachable
# 在外网服务器查看到是 firewalld 的地址在访问
[root@internet ~] #tail -f /var/log/httpd/access_log
192 .168.0.8 - - [08/Jul/2020:17:36:54 + 0800 ] "GET / HTTP/1.1" 200 9 "-"
"curl/7.29.0"
# 查看转换状态信息
[root@firewall ~] #cat /proc/net/nf_conntrack ipv4     2 tcp       6 112 TIME_WAIT src = 10 .0.0.7 dst = 192 .168.0.6 sport = 58384
dport = 80 src = 192 .168.0.6 dst = 192 .168.0.8 sport = 80 dport = 58384 [ASSURED] mark = 0
zone = 0 use = 2
实现SNAT
[root@internet-host ~] #hostname -I
10 .0.0.6
[root@internet-host ~] #route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
10 .0.0.0         0 .0.0.0         255 .255.255.0   U     1       0         0 eth0
# 启用路由转发
[root@firewall ~] #vim /etc/sysctl.conf
net.ipv4 .ip_forward = 1
[root@firewall ~] #sysctl -p
[root@firewall-host ~] #hostname -I
10 .0.0.8 192 .168.100.8
[root@firewall-host ~] #sysctl -a |grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[root@lan-host ~] #hostname -I
192 .168.100.7
[root@lan-host ~] #route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0 .0.0.0         192 .168.100.8   0 .0.0.0         UG     100     0         0 eth0
192 .168.100.0   0 .0.0.0         255 .255.255.0   U     100     0         0 eth0
[root@firewall-host ~] #iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT
--to-source 10.0.0.8
[root@firewall-host ~] #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 POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
       
    0     0 SNAT       all   -- *     *       192 .168.100.0/24     0 .0.0.0/0  
        to:10.0.0.8
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination [root@lan-host ~] #curl 10.0.0.6
internet Server
[root@internet-host ~] #curl 192.168.100.7
curl : (7) Failed to connect to 192 .168.100.7: Network is unreachable
[root@internet-host ~] #tail /var/log/httpd/access_log
10 .0.0.8 - - [21/Mar/2020:16:31:35 + 0800 ] "GET / HTTP/1.1" 200 16 "-"
"curl/7.29.0"
[root@lan-host ~] #ping 10.0.0.6
PING 10 .0.0.6 (10.0.0.6) 56 (84) bytes of data.
64 bytes from 10 .0.0.6: icmp_seq = 1 ttl = 63 time = 0 .989 ms
64 bytes from 10 .0.0.6: icmp_seq = 2 ttl = 63 time = 0 .544 ms
[root@internet-host ~] #tcpdump -i eth0 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16 :34:30.171222 IP 10 .0.0.8 > 10 .0.0.6: ICMP echo request, id 24718 , seq 120 ,
length 64
16 :34:30.171255 IP 10 .0.0.6 > 10 .0.0.8: ICMP echo reply, id 24718 , seq 120 ,
length 64
[root@firewall-host ~] #iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j
MASQUERADE
[root@firewall-host ~] #iptables -t nat -nvL
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 POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
       
    0     0 MASQUERADE all   -- *     *       192 .168.100.0/24     0 .0.0.0/0  
       
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
[root@firewall-host ~] #cat /proc/net/nf_conntrack
ipv4     2 tcp       6 32 TIME_WAIT src = 192 .168.100.7 dst = 10 .0.0.6 sport = 39430
dport = 80 src = 10 .0.0.6 dst = 10 .0.0.8 sport = 80 dport = 39430 [ASSURED] mark = 0 zone = 0
use = 2

 16.2 DNAT

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

 DNAT 格式:

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

范例:

# 启用路由转发
[root@firewall ~] #vim /etc/sysctl.conf
net.ipv4 .ip_forward = 1
[root@firewall ~] #sysctl -p
[root@firewall ~] #iptables -t nat -A PREROUTING -d 192.168.0.8 -p tcp --dport 80
-j DNAT --to-destination 10.0.0.7:8080
[root@firewall ~] #ss -ntl
State         Recv-Q         Send-Q                 Local Address:Port          
      Peer Address:Port         LISTEN         0               128                           0 .0.0.0:22            
            0 .0.0.0:*          
LISTEN         0               100                         127 .0.0.1:25            
            0 .0.0.0:*          
LISTEN         0               128                             [::]:22            
              [::]:*          
LISTEN         0               100                           [::1]:25            
              [::]:*    
[root@internet ~] #curl 192.168.0.8
lanserver1
[root@lanserver1 ~] #tail /var/log/httpd/access_log
192 .168.0.6 - - [08/Jul/2020:18:10:37 + 0800 ] "GET / HTTP/1.1" 200 11 "-"
"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3
libidn/1.18 libssh2/1.4.2"
[root@firewall ~] #cat /proc/net/nf_conntrack
ipv4     2 tcp       6 117 TIME_WAIT src = 192 .168.0.6 dst = 192 .168.0.8 sport = 58170
dport = 80 src = 10 .0.0.7 dst = 192 .168.0.6 sport = 8080 dport = 58170 [ASSURED] mark = 0
zone = 0 use = 2
实现DNAT
[root@firewall-host ~] #iptables -t nat -A PREROUTING -d 10.0.0.8 -p tcp --dport
80 -j DNAT --to-destination 192.168.100.7
[root@firewall-host ~] #iptables -t nat -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
       
    0     0 DNAT       tcp   -- *     *       0 .0.0.0/0             10 .0.0.8    
        tcp dpt:80 to:192.168.100.7
[root@firewall-host ~] #ss -ntl
State       Recv-Q       Send-Q                 Local Address:Port            
    Peer Address:Port        
LISTEN       0             128                           0 .0.0.0:22              
          0 .0.0.0:*          
LISTEN       0             128                             [::]:22              
            [::]:*
[root@internet-host ~] #curl 10.0.0.8
lan server
[root@internet-host ~] #telnet 10.0.0.8
Trying 10 .0.0.8...
telnet : connect to address 10 .0.0.8: Connection refused
[root@lan-host ~] #tail -f /var/log/httpd/access_log
10 .0.0.6 - - [21/Mar/2020:17:32:37 + 0800 ] "GET / HTTP/1.1" 200 11 "-"
"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3
libidn/1.18 libssh2/1.4.2" 3.8.5 REDIRECT 转发
REDIRECT ,是 NAT 表的 target ,通过改变目标 IP 和端口,将接受的包转发至同一个主机的不同端口,可
用于 PREROUTING OUTPUT
REDIRECT 选项:
[root@firewall-host ~] #tail -f /proc/net/nf_conntrack
ipv4     2 tcp       6 81 TIME_WAIT src = 10 .0.0.6 dst = 10 .0.0.8 sport = 59426
dport = 80 src = 192 .168.100.7 dst = 10 .0.0.6 sport = 80 dport = 59426 [ASSURED] mark = 0
zone = 0 use = 2
[root@lan-host ~] #vim /etc/httpd/conf/httpd.conf
listen 8000
[root@lan-host ~] #systemctl restart httpd
[root@lan-host ~] #ss -ntl
State     Recv-Q Send-Q         Local Address:Port                         Peer
Address:Port              
LISTEN     0       100                 127 .0.0.1:25                              
      *:*                  
LISTEN     0       128                         *:22                              
      *:*                  
LISTEN     0       128                     [::]:23                              
    [::]:*                  
LISTEN     0       100                     [::1]:25                              
    [::]:*                  
LISTEN     0       128                     [::]:8000                            
    [::]:*                  
LISTEN     0       128                     [::]:22                              
    [::]:*                  
[root@firewall-host ~] #iptables -t nat -R PREROUTING 1 -d 10.0.0.8 -p tcp --dport
80 -j DNAT --to-destination 192.168.100.7:8000
[root@firewall-host ~] #iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
       
    0     0 DNAT       tcp   -- *     *       0 .0.0.0/0             10 .0.0.8    
        tcp dpt:80 to:192.168.100.7:8000
Chain INPUT (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
       
  11   816 MASQUERADE all   -- *     *       192 .168.100.0/24     0 .0.0.0/0  
       
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

17. 使用REDIRECT将90端口重定向80,并可以访问到80端口的服务

[root@rocky8 ~]$ iptables -t nat -A PREROUTING -p tcp --dport 90 -j REDIRECT --to-ports 80

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:90 redir ports 80
 


18. firewalld常见区域总结。

  • 区域(zone)是针对特定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的规则集。
  • 不同的区域(zone)可允许不同的网络服务和入站流量的类型,而拒绝其他任何流量。
  • 要分离内部网络和互联网的接口,你可以在internal区域上允许DHCP,但在external区域仅允许HTTP和SSH。

 firewalld常见区域:

  • public(公共) —— [默认]公网访问,不受任何限制。
  • work(工作) —— 用于工作区。基本信任的网络,仅仅接收经过选择的连接。
  • home(家庭) —— 用于家庭网络。基本信任的网络,仅仅接收经过选择的连接。
  • trusted(信任) —— 接收的外部网络连接是可信任、可接受的。
  • block(限制) —— 任何接收的网络连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒绝。
  • dmz(隔离区) —— 英文"demilitarized zone"的缩写,此区域内可公开访问,它是非安全系统与安全系统之间的缓冲区。
  • drop(丢弃) —— 任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
  • external(外部) —— 允许指定的外部网络进入连接,特别是为路由器启用了伪装功能的外部网。
  • internal(内部) —— 内部访问。只限于本地访问,其他不能访问


19. 通过ntftable来实现暴露本机80/443/ssh服务端口给指定网络访问"

[root@rocky8 ~]$ nft add table inet test_table
[root@rocky8 ~]$ nft add chain inet test_table test_chain

[root@rocky8 ~]$ nft add rule inet test_table test_chain reject

[root@rocky8 ~]$ nft insert rule inet test_table test_chain index 0 ip saddr 10.0.0.18 tcp dport 80 accept

[root@rocky8 ~]$ nft insert rule inet test_table test_chain index 0 ip saddr 10.0.0.18 tcp dport 443 accept

[root@rocky8 ~]$ nft insert rule inet test_table test_chain index 0 ip saddr 10.0.0.18 tcp dport ssh accept

[root@rocky8 ~]$

nft list table inet test_table
table inet test_table {
    chain test_chain {
        ip saddr 10.0.0.18 tcp dport 22 accept
        ip saddr 10.0.0.18 tcp dport 443 accept
        ip saddr 10.0.0.18 tcp dport 80 accept
        reject
    }
}

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值