第五次作业

总结openssh服务安全加固

所有的修改没有特别说明都是在/etc/ssh/sshd_config中,并且修改后需要重启sshd服务

  • 禁止root登录:PermitRootLogin no

  • 修改默认端口:Port 19892

  • 限制访问源:cat /etc/hosts.allow:sshd:192.168.29.0/255.255.255.0

  • 设置会话空闲超时:

    ClientAliveInterval 300 //每300秒发送一个空数据包查看客户端是否有效

    ClientAliveCountMax 1 //每300秒发送一个后,记录1次,当超过这个数后就断开连接

  • 关闭压缩或者将压缩设置为登录后使用:Compression no或者Compression delayed

  • 打印最后一次登录的信息:PrintLastLog yes

  • 禁止空密码:PermitEmptyPasswords no

  • 将ssh绑定到本地的指定IP:ListenAddress 10.0.0.5

  • 保持软件版本的更新以及漏洞的修补

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

使用visudo命令修改配置,比直接修改/etc/sudoers配置文件更好,visudo会检查配置文件格式

语法检查:visudo -c

配置文件中的示例:

## 允许用户使用任何命令
root    ALL=(ALL)       ALL
## 允许用户组中的用户执行任何命令
%wheel  ALL=(ALL)       ALL
## 允许用户组中的用户不用root密码即可执行任何命令
# %wheel        ALL=(ALL)       NOPASSWD: ALL

总结PAM架构及工作原理

如果一个软件可以使用pam来进行用户管理,那么其配置文件中都会有启用pam的参数,例如ssh:

[root@hecs-34400 data]# cat /etc/ssh/sshd_config | grep -i pam
UsePAM yes

ssh的配置文件

[root@hecs-34400 data]# cat /etc/pam.d/sshd
#%PAM-1.0
auth	   required	pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

PAM所有外接服务的配置文件存储在/etc/pam.d/中,比如ssh的配置文件就是/etc/pam.d/sshd

服务配置文件分为4列:

  • 第一列:type;
  • 第二列:control
  • 第三列:module-path
  • 第四列:arguments

在用户进行登录某个软件的时候,软件会通过调用PAM的API来验证;打个比方,ssh调用PAM的login函数,login函数读取配置文件,根据配置文件中的参数,去寻找对应的模块,然后执行验证,将验证结果返回login函数,login函数再返回ssh,ssh根据结果判断是同意还是拒绝登录。

一般来说,第四列是第三列的参数,所以对于比较复杂的参数就会写入配置文件中,这些配置文件存储在/etc/security/中

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

配置文件:

/etc/pam.d/ //服务的配置文件

/etc/security //模块的配置文件

PAM库目录:

/lib64/security/*.so //实现了安全验证等其它功能,使用功能则需要在配置文件中调用这些功能

工作流程:

程序调用PAM API,API函数读取服务配置文件,根据配置文件内容,调用模块并且读取模块配置文件,最后将结果返回程序

主要按列分,1,2,3,其它列

配置文件(/etc/pam.d/sshd这种)内容分为几个方面:
type:模块类型,即功能
control:PAM该如何处理与该服务相关的pam模块
module-path:指明库文件所在路径
arguments:用来传递给模块的参数

分类:
type:
Auth:认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据
Account:账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期
Password:密码模块接口,用于更改用户密码,以及强制使用强密码配置
Session:会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效
-type:表示因缺失不能加载的模块将不记录到系统日志
 
control,流程控制:
required:一票否决,表示本模块必须返回成功才通过认证,但是如果该模块返回失败,失败结果不会立即通知用户,而是等所有模块执行完毕一起通知。是一个必要条件
requisite:一票否决,表示本模块必须返回成功才通过认证,但是如果该模块返回失败,一旦失败不再执行同一type中的任何模块。是一个必要条件
sufficient:一票通过,表示本模块返回成功则通过身份认证的要求,不必执行同一type中的其它模块,但如果本模块失败则可以忽略,为充分条件
optional:表明本模块可选,本模块的成功与否不对身份认证起关键作用,其返回值一般被忽略
include:调用其它配置文件中定义的配置信息

module-path:
模块文件的绝对路径
模块文件的相对路径:/lib64/security目录下的模块可以使用相对路径,如:pam_shells.so,pam_limits.so
有些模块有自己的专属配置文件,在/etc/security/*.conf目录下

第四列
对于简单的模块,第四列是参数,或者对于复杂的参数是一个配置文件,专门给第三列的模块

示例:

ssh加固示例,错误登录两次后,锁定用户,1分钟后解锁,前端无感知,被锁后即使输入正确的账号密码,也不能登录

Centos 8中,pam包中pam_tally2.so被删除,由pam_faillock.so替代

# 确认ssh开启PAM验证
[root@mysqldb833 ~]# cat /etc/ssh/sshd_config | grep -i pam
UsePAM yes
# 查看软件是否有pam功能
[root@mysqldb833 pam.d]# ldd /usr/sbin/sshd | grep libpam
	libpam.so.0 => /lib64/libpam.so.0 (0x00007fd887000000)

# 查看pam_faillock帮助,里面有示例:
[root@mysqldb833 pam.d]# man pam_faillock

# 修改pam_faillock配置文件
[root@mysqldb833 ~]# cat /etc/security/faillock.conf | grep -e '^[^#]'
dir = /var/log/faillock      //日志目录
deny = 2                     //两次错误之后锁定
fail_interval = 20           //两次失败间隔多久时间不连续计数
unlock_time = 30             //普通锁定时间
even_deny_root               //对root生效
root_unlock_time = 15        //root用户锁定时间

# 修改服务配置文件,使用faillock来进行验证
[root@localhost ~]# faillock --user admin --reset
[root@localhost ~]# cat /etc/pam.d/system-auth 
# Generated by authselect on Fri Jan 13 09:47:03 2023
# Do not modify this file manually.

auth        required                                     pam_faillock.so preauth silent audit deny=3 unlock_time=600  //必须在第一行,如果想锁住root,添加这项:even_deny_root
auth        required                                     pam_env.so
auth        required                                     pam_faildelay.so delay=2000000 
auth        sufficient                                   pam_fprintd.so
auth        sufficient                                   pam_unix.so nullok try_first_pass     //这行
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        [default=1 ignore=ignore success=ok]         pam_localuser.so
auth        sufficient                                   pam_unix.so nullok
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        sufficient                                   pam_sss.so forward_pass
auth        required                                     pam_deny.so
auth        [default=die]                                pam_faillock.so authfail audit deny=3   //这行

account     required                                     pam_faillock.so      //这行
account     required                                     pam_unix.so
account     sufficient                                   pam_localuser.so
account     sufficient                                   pam_usertype.so issystem
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required                                     pam_permit.so

[root@localhost ~]# cat /etc/pam.d/password-auth 
# Generated by authselect on Fri Jan 13 09:47:03 2023
# Do not modify this file manually.

auth        required                                     pam_faillock.so preauth silent audit deny=3 unlock_time=600  //第一行
auth        required                                     pam_env.so
auth        required                                     pam_faildelay.so delay=2000000
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        [default=1 ignore=ignore success=ok]         pam_localuser.so
auth        sufficient                                   pam_unix.so nullok
auth        sufficient                                   pam_unix.so nullok try_first_pass       //第二行
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        [default=die]                                pam_faillock.so authfail audit deny=3    //第三行
auth        sufficient                                   pam_sss.so forward_pass
auth        required                                     pam_deny.so

account     required                                     pam_faillock.so      //第四行
account     required                                     pam_unix.so

nologin示例:

当创建用户的时候可以指定用户登录后的shell,一般是bash shell或者ksh;但是对于一些服务来说,比如apache和nginx,这些账户不需要登录,那么这些账户的shell就是nologin,这个时候当我们使用这些账户登录的时候,就会报错,即使对这些账户赋予密码,也不能登录,仅是这个用户无法使用bash或者其他shell来登录系统而已,并不是说这个账号就无法使用系统资源

# 创建一个nologin账户
[root@localhost ~]# adduser -M -s /sbin/nologin opq
[root@localhost ~]# cat /etc/passwd | grep opq
opq:x:1003:1003::/home/opq:/sbin/nologin
[root@localhost ~]# echo 'Admin@123' | passwd --stdin opq

# 尝试登录,报错
Last failed login: Wed Jul 26 10:31:18 CST 2023 from 192.168.75.1 on ssh:notty
There was 1 failed login attempt since the last successful login.
Could not chdir to home directory /home/opq: No such file or directory
/usr/bin/xauth:  error in locking authority file /home/opq/.Xauthority
This account is currently not available.

# 修改报错内容
[root@localhost ~]# cat /etc/nologin.txt 

# 再次尝试登录
Do Not Try To Login in My System!
Last login: Wed Jul 26 10:31:43 2023 from 192.168.75.1
Could not chdir to home directory /home/opq: No such file or directory
/usr/bin/xauth:  error in locking authority file /home/opq/.Xauthority
Do Not Try To Login in My System!

Connection closed.

limit示例

ulimit用于对会话的资源限制

配置文件:

  • /etc/security/limits.conf
  • /etc/security/limits.d/*

limit先读取Limits.conf中的参数,然后再读取limits.d下的文件,所以limits.d下的文件内容会覆盖limits.conf中的参数

limits.d下的文件会根据文件名排序,所以这个目录下的文件名字就起一个排序的作用

查看pam.d下哪些文件调用了limit模块:

[root@localhost ~]# grep -r 'limit' /etc/pam.d/
/etc/pam.d/runuser:session		required	pam_limits.so

可以看见所有的调用pam_limit.so模块都是session中调用,管理的都是会话,就是为什么通过ulimit命令修改的配置,只对当前session生效,而如果是通过配置文件修改的ulimit,则需要重新登录会话才能生效。

ulimits的限制分为硬限制和软限制,这里并不是硬件的限制和软件的限制的意思,硬限制是可以在任何时候任何进程中设置,但硬限制只能由超级用户,也就是root用户进行设置,软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值,说白了,硬限制是个硬指标,root用户设置后,其他用户配置的软限制不能超过这个值,硬限制用-H参数,软限制用-S参数,如果不指定参数,会同时把两类限制都改掉。

查看所有的资源限制参数:

[root@localhost ~]# 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) 14588
max locked memory       (kbytes, -l) 60000
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100000
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) 100000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

其中,unlimited表示不限制

查看各个参数的作用:

[root@localhost ~]# help ulimit
ulimit: ulimit [-SHabcdefiklmnpqrstuvxPT] [限制]
    修改 shell 资源限制。
    
    在允许此类控制的系统上,提供对于 shell 及其创建的进程所可用的
    资源的控制。
    
    选项:
      -S	使用软 (`soft') 资源限制
      -H	使用硬 (`hard') 资源限制
      -a	所有当前限制都被报告
      -b	套接字缓存尺寸
      -c	创建的核文件的最大尺寸
      -d	一个进程的数据区的最大尺寸
      -e	最高的调度优先级 (`nice')
      -f	有 shell 及其子进程可以写的最大文件尺寸
      -i	最多的可以挂起的信号数
      -k	分配给此进程的最大 kqueue 数量
      -l	一个进程可以锁定的最大内存尺寸
      -m	最大的内存进驻尺寸
      -n	最多的打开的文件描述符个数
      -p	管道缓冲区尺寸
      -q	POSIX 信息队列的最大字节数
      -r	实时调度的最大优先级
      -s	最大栈尺寸
      -t	最大的CPU时间,以秒为单位
      -u	最大用户进程数
      -v	虚拟内存尺寸
      -x	最大的文件锁数量
      -P	最大伪终端数量
      -T	最大线程数量
    
    并非所有选项在所有系统上可用。
    
    如果提供了 LIMIT 变量,则它为指定资源的新的值;特别的 LIMIT 值为
    `soft'、`hard'和`unlimited',分别表示当前的软限制,硬限制和无限制。
    否则打印指定资源的当前限制值,不带选项则假定为 -f
    
    取值都是 1024 字节为单位,除了 -t 以秒为单位,-p 以 512 字节递增,
    -u 为无范围的进程数量。
    
    退出状态:
    返回成功,除非使用了无效的选项或者错误发生。

limit配置文件:

由于Limie是pam的模块,所以它的配置文件在/etc/security/limits.conf

[root@localhost ~]# cat /etc/security/limits.conf | grep -Ev "^#"

* - nofile 100000
* - nproc 100000
* - memlock 60000

# 可以看见上诉配置分为四组
第一组:用户名/组名:用于指定参数的限制对象,*代表所有用户
第二组:软/硬限制,- 表示无限制
第三组:资源名,具体如下:
     core——core文件大小 (KB)
     data——最大数据大小(KB)
     fsize——最大文件大小(KB)
     memlock——最大可用内存空间(KB)
     nofile——最大可以打开的文件数量
     rss——最大可驻留空间(KB)
     stack——最大堆栈空间(KB)
     cpu——最大CPU使用时间(MIN)
     nproc——最大运行进程数
     as——地址空间限制
     maxlogins——用户可以登录到系统最多次数
     locks——最大锁定文件数目
第四组:具体的值

# 示例
安装oracle的时候,需要在配置文件中添加对于oracle用户的资源限制:
oracle           soft    nproc   2047
oracle           hard    nproc   16384
oracle           soft    nofile  1024
oracle           hard    nofile  65536
代表对oracle进行软/硬限制,项目分别是:最大运行进程数和最大可以打开的文件数量
注意:这两个项目都设置了软硬限制

实现私有时间服务器

在服务器上安装及配置chrony服务

# 安装
[root@localhost ~]# yum install -y chrony

# 关闭防火墙及iptables

# 修改时间服务器配置文件及重启服务
[root@localhost ~]# cat /etc/chrony.conf | grep -Ev "^#" | grep -Ev "^$"
pool ntp.aliyun.com iburst
server ntp1.ntsc.ac.cn iburst
server ntp1.ict.ac.cn iburst  //以上是主服务同步的时间服务器

driftfile /var/lib/chrony/drift //chronyd程序的主要行为之一,就是根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中是最合理的,它会在重启后为系统时钟作出补偿,甚至可能的话,会从时钟服务器获得较好的估值。
makestep 1.0 3
rtcsync  //rtcsync指令将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)
allow 192.168.75.0/24 //这里你可以指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器。
local stratum 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony

# 查看监听端口,udp的123端口已经开启
[root@localhost ~]# ss -nual
State          Recv-Q          Send-Q                    Local Address:Port                    Peer Address:Port         Process                         
UNCONN         0               0                               0.0.0.0:123                          0.0.0.0:*                            

# 配置客户端服务
[root@mysqldb833 ~]# cat /etc/chrony.conf | grep -Ev "^#" | grep -Ev "^$"
server 192.168.75.200 iburst  //只需将客户端的同步服务器指向时间服务器即可

# 在客户端手动同步
[root@mysqldb833 ~]# chronyc -a makestep
200 OK

# 查看时间同步源:
$ chronyc sources -v

# 查看时间同步源状态:
$ chronyc sourcestats -v

# 启用NTP时间同步:
$ timedatectl set-ntp yes

# 校准时间服务器:
$ chronyc tracking

总结DNS域名三级结构

域名分为三个层级:

  1. 根域
  2. 顶级域
  3. 二级域
  4. 子域
  5. 主机

一个域名可以对应多个IP,一个IP也可以对应多个域名,是多对多的关系。

比如购买一个playfun.com的域名,域名的名字就是playfun,由于后面只有com,所以这是com这个顶级域的域名;如果域名是playfun.edu.com,那么就是顶级域com下面二级域edu的域名。

如果公司分为成都和北京分公司,那么可以此域名下再细分子域:cd.playfun.edu.com和bj.playfun.edu.com

如果要访问子域中的服务器:比如www服务器或者ftp服务器:www.cd.playfun.edu.com和ftp.bj.playfun.edu.com

由此可见,后面的edu.com这种,最多到二级域,前面的www.cd这种就是子域中的自己的划分

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

DNS工作原理

1.主机查看缓存是否有解析
2.主机查看浏览器缓存是否有解析
3.主机向本地DNS服务器发送查询请求
4.本地DNS服务器的缓存没有就会向根DNS服务器发送查询请求
5.根DNS服务器根据域名(比如说是www.baidu.com)类型,向本地DNS服务器发送顶级域DNS服务器
6.本地DNS服务器向顶级域com服务器发送查询请求
7.顶级域DNS服务器回应baidu.com域名服务器地址
8.本地DNS服务器向baidu.comDNS服务器发送查询请求
9.baidu.comDNS服务器发送www.baidu.com的具体地址回应

递归解析

递归解析是最常见也是默认的一种解析方式。在这种解析方式中,如果客户端配置的本地域名服务器(Local DNS服务器)不能解析的话,则后面的查询过程全部由本地域名服务器代替DNS客户端进行查询,直到本地域名服务器从权威域名服务器得到了正确的解析结果,然后由本地域名服务器告诉DNS客户端查询的结果。

在整个递归查询过程中,除一开始客户端向本地域名服务器发起查询请求外,其余各个环节均是以本地域名服务器为中心进行迭代查询,DNS客户端一直处于等待状态,直到本地域名服务器发回最终查询结果。相当于,在整个查询环节中本地域名服务器承担了中介代理的角色。

迭代解析

递归查询除在一开始客户端发起查询请求外,其他环节都是由本地域名服务器代替客户端进行的。而迭代查询则是指所有查询工作全部由客户端自己进行,除此之外,整个查询路径和步骤与递归查询没有太大区别。

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

DNS服务器

# 安装bind软件
[root@mysqldb833 ~]# dnf install -y bind bind-libs bind-utils

# 修改配置文件
[root@mysqldb833 ~]# cat /etc/named.conf | grep listen
	listen-on port 53 { localhost; };
[root@mysqldb833 ~]# cat /etc/named.conf | grep query
	allow-query     { any; };
	
# 检查配置文件格式以及重新加载配置文件,以及查看端口
[root@mysqldb833 ~]# named-checkconf 
[root@mysqldb833 ~]# rndc reload
server reload successful
[root@mysqldb833 ~]# ss -ntal
State           Recv-Q          Send-Q                    Local Address:Port                   Peer Address:Port         Process 
LISTEN          0               10                       192.168.75.189:53                          0.0.0.0:*                            
LISTEN          0               10                            127.0.0.1:53                          0.0.0.0:*                            
LISTEN          0               32                        192.168.122.1:53                          0.0.0.0:*

DNS客户端

# 修改客户端DNS解析服务器指向
[root@localhost network-scripts]# cat ifcfg-bond0 
DNS1=192.168.75.189

# 安装bind测试工具
[root@localhost ~]# yum install -y bind-utils

# 测试DNS解析
[root@localhost ~]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 39.156.66.18
www.a.shifen.com has address 39.156.66.14
[root@localhost ~]# dig www.baidu.com

; <<>> DiG 9.11.36-RedHat-9.11.36-3.an8 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55596
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 10

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 09a054a05a9be4c8905af28e64c76ed1fe10596da3e79dc4 (good)
;; QUESTION SECTION:
;www.baidu.com.			IN	A

;; ANSWER SECTION:
www.baidu.com.		1193	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	115	IN	A	39.156.66.18
www.a.shifen.com.	115	IN	A	39.156.66.14

;; AUTHORITY SECTION:
a.shifen.com.		1194	IN	NS	ns4.a.shifen.com.
a.shifen.com.		1194	IN	NS	ns1.a.shifen.com.
a.shifen.com.		1194	IN	NS	ns2.a.shifen.com.
a.shifen.com.		1194	IN	NS	ns3.a.shifen.com.
a.shifen.com.		1194	IN	NS	ns5.a.shifen.com.

;; ADDITIONAL SECTION:
ns3.a.shifen.com.	1194	IN	A	36.152.45.198
ns3.a.shifen.com.	1194	IN	A	112.80.255.253
ns5.a.shifen.com.	1194	IN	A	180.76.76.95
ns1.a.shifen.com.	1194	IN	A	110.242.68.42
ns2.a.shifen.com.	1194	IN	A	220.181.33.32
ns4.a.shifen.com.	1194	IN	A	111.20.4.28
ns4.a.shifen.com.	1194	IN	A	14.215.177.229
ns5.a.shifen.com.	594	IN	AAAA	240e:bf:b801:1006:0:ff:b04f:346b
ns5.a.shifen.com.	594	IN	AAAA	240e:940:603:a:0:ff:b08d:239d

;; Query time: 0 msec
;; SERVER: 192.168.75.189#53(192.168.75.189)
;; WHEN: 一 7月 31 16:20:33 CST 2023
;; MSG SIZE  rcvd: 387

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

DNS服务器类型

1. 递归DNS服务器(Recursive DNS Server):接收客户端发起的DNS查询请求,负责向其他DNS服务器递归地查询并返回结果给客户端。递归DNS服务器通常由Internet Service Provider(ISP)提供,也可以是其他公共DNS服务器。
2. 授权DNS服务器(Authoritative DNS Server):负责管理特定域名的DNS记录,并提供域名解析服务。当递归DNS服务器查询特定域名时,授权DNS服务器返回该域名的IP地址或其他资源记录。
3. 主DNS服务器(Primary DNS Server):负责存储和管理域名的主要DNS记录。主DNS服务器是授权DNS服务器的一种类型,负责提供域名解析服务。
4. 辅助DNS服务器(Secondary DNS Server):从主DNS服务器同步域名的DNS记录,并提供冗余和负载均衡。辅助DNS服务器是授权DNS服务器的一种类型,可以提供备份和高可用性的解析服务。
5. 域名注册商提供的DNS服务器:许多域名注册商提供DNS服务器服务,用于管理域名的DNS记录和解析。
6. 公共DNS服务器:由第三方提供的公共DNS服务器,如Google Public DNS、OpenDNS等,可供公众免费使用。

解析答案

DNS解析答案是指在DNS查询过程中,返回的具体结果,通常是域名对应的IP地址。当客户端发起DNS查询请求时,DNS服务器会根据域名查询其对应的解析答案。
解析答案可以是以下类型之一:
1. A记录(Address Record):A记录将域名解析为IPv4地址。例如,将域名"www.example.com"解析为IPv4地址"192.0.2.1"。
2. AAAA记录(IPv6 Address Record):AAAA记录将域名解析为IPv6地址。例如,将域名"www.example.com"解析为IPv6地址"2001:0db8:85a3:0000:0000:8a2e:0370:7334"。
3. CNAME记录(Canonical Name Record):CNAME记录将域名解析为另一个域名(别名)。例如,将域名"www.example.com"解析为别名"webserver.example.net"。
4. MX记录(Mail Exchanger Record):MX记录指定接收该域名邮件的邮件服务器地址。
5. NS记录(Name Server Record):NS记录指定该域名的授权DNS服务器。
6. TXT记录(Text Record):TXT记录存储任意文本信息,常用于验证域名所有权或提供其他附加信息。

正反解析域

1. 正向解析域(Forward Lookup Zone):正向解析域用于将域名解析为相应的IP地址。当客户端提供一个域名,例如"www.example.com",DNS服务器会在正向解析域中查找相应的IP地址记录,以便将域名解析为对应的IP地址。
2. 反向解析域(Reverse Lookup Zone):反向解析域用于将IP地址解析为相应的域名。当客户端提供一个IP地址,例如"192.0.2.1",DNS服务器会在反向解析域中查找相应的域名记录,以便将IP地址解析为对应的域名。

资源记录定义

记录类型:A,AAAA,PTR,SOA,NS,CNAME,MX
1. SOA: start of authority,起始授权记录;一个区域解析库有且仅有一个SOA记录,必须位于解析库的第一条记录(这里面设置了全局的参数)
2. A :Internet address,作用FQDN--> ipv4
3. AAAA: FQDN--> ipv6
4. PTR: pointer,ip-->FQDN
5. NS:Name Server,用于表明当前区域的DNS服务器
6. CNAME:Canonical Name,别名记录
7. MX:mail exchanger,邮件交换器
8. TXT:对域名进行标识和说明的一种方式,一般做验证记录时会使用此项,如:SPF(反垃圾邮件)记录,https验证等

实现DNS主从同步

之前的题目中创建了内网私有DNS服务器,现在添加从服务器形成主从dns服务器

主服务器添加配置:

# 首先在主服务器添加一个本地解析用于测试
## 创建dnslocal.test.zone解析文件
[root@mysqldb833 named]# cat /var/named/dnslocal.test.zone
$TTL 1D  ;
@           IN  SOA  master duzy2023.139.com (            ;
                                                          ;
                                                          ;
                                                          ;
                                              20230520    ;
                                              1D          ;
                                              1H          ;
                                              1W          ;
                                              3H          ;
                                              )
                 NS  master ;
master    3D     A   192.168.75.189
www              A   192.168.75.199 ;
[root@mysqldb833 named]# chown root.named dnslocal.test.zone

## 配置dns解析
[root@mysqldb833 named]# cat /etc/named.rfc1912.zones | grep -5 "dnslocal"
zone "dnslocal.test" IN{
        type master;
        file "dnslocal.test.zone";
};

## 从客户端测试
[root@localhost ~]# host www.dnslocal.test
www.dnslocal.test has address 192.168.75.199

## 配置从DNS服务器
[root@dns121 ~]# cat /etc/named.conf
options {
	listen-on port 53 { localhost; };
	listen-on-v6 port 53 { ::1; };
	allow-query     { any; };
	
## 增加从服务器配置文件
[root@dns121 ~]# vi /etc/named.rfc1912.zones
zone "dnslocal.test" IN{
       type slave;  
       masters {192.168.75.189;};
       file "slaves/dnslocal.test.slave";
};

## 从服务器重启named服务后产看是否同步
[root@dns121 ~]# ll /var/named/slaves/
total 4
-rw-r--r-- 1 named named 287 Aug  1 09:40 dnslocal.test.slave

## 客户端添加从服务器为DNS服务器后测试
[root@localhost ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.75.189
nameserver 192.168.75.121
[root@localhost ~]# dig @192.168.75.121 www.dnslocal.test
dnslocal.test.		86400	IN	NS	master.dnslocal.test.
可以识别

## 关闭主服务器服务,测试是否自动向从服务器请求
[root@localhost ~]# dig www.dnslocal.test
;; SERVER: 192.168.75.121#53(192.168.75.121)
会自动向从服务器请求数据

实现DNS子域授权

子域:域名下的自己的细分域,比如本例子中,域名是dnslocal.test,那么如果有其它区域的解析,比如:cd.dnslocal.test,那么解析这个子域就交给子域解析服务器

# 子域服务器配置
[root@dns121 ~]# cat /etc/named.conf 
options {
	listen-on port 53 { localhost; };
	allow-query     { any; };
	
# 添加子域解析配置文件
[root@dns121 ~]# cat /var/named/cd.dnslocal.test.zone 
$TTL 1D
@                  IN SOA ns1 duzy2023.139.com ( 1 1H 10M 1D 2H )
                      NS  ns1
ns1                   A   192.168.75.121
www                   A   9.9.9.9

# 添加子域解析文件配置
[root@dns121 ~]# cat /etc/named.rfc1912.zones | grep -5 "dnslocal"
zone "cd.dnslocal.test" IN {
       type master;
       file "cd.dnslocal.test.zone";
};

# 在主DNS服务器上指定转发cd.dnslocal.test域的解析到子域服务器
[root@mysqldb833 ~]# cat /var/named/dnslocal.test.zone 
$TTL 1D  ;
@           IN  SOA  master duzy2023.139.com (            ;
                                                          ;
                                                          ;
                                                          ;
                                              20230520    ;
                                              1D          ;
                                              1H          ;
                                              1W          ;
                                              3H          ;
                                              )
                 NS  master ;
cd               NS  ns2                  //指定解析本域的cd域到ns2 解析
ns2              A   192.168.75.121       //ns2的地址指定
master    3D     A   192.168.75.189
www              A   192.168.75.199 ;

# 在客户端测试
[root@localhost ~]# host www.cd.dnslocal.test
www.cd.dnslocal.test has address 9.9.9.9

基于acl实现智能DNS

智能dns的配置分为三个部分

  1. acl配置,在named的主配置文件中,将部分ip网段放在一个acl中,作为一个整体
  2. 区域解析配置和区域解析文件,用于将部分ip的请求用区域配置文件解析
  3. 使用view将前两者结合起来,即每次请求进来就会检查view中的acl,如果属于这个acl,那么就用这个view中的区域解析来解析请求

DNS服务器配置

DNS主服务器添加网卡接入host-only网络

客户端也添加网卡接入host-only网络

注意事项:

  1. 一旦启用了view,所有的zone都只能定义在view中
  2. 仅在允许递归请求的客户端所在的view中定义根区域
  3. 客户端请求到达时,是自上而下检查每个view所服务的客户端列表
# DNS主服务器网络配置
[root@mysqldb833 ~]# ip a|grep 189
    inet 192.168.75.189/24 brd 192.168.75.255 scope global noprefixroute ens160
    inet 172.10.10.189/24 brd 172.10.10.255 scope global noprefixroute ens224
# DNS客户端网络配置
[root@localhost ~]# ip a | grep 200
    inet 192.168.75.200/24 brd 192.168.75.255 scope global noprefixroute ens160
    inet 172.10.10.200/24 brd 172.10.10.255 scope global noprefixroute ens224

# 修改DNS主服务器配置
[root@mysqldb833 ~]# cat /etc/named.conf 
acl natnet {
   192.168.75.0/24;
};

acl hostonly {
   172.10.10.0/24;
};
并在结尾注释掉下面这行:
include "/etc/named.rfc1912.zones";
# 并将/etc/named.conf中的部分配置移到/etc/named.rfc1912.zones中
[root@mysqldb833 ~]# cat /etc/named.rfc1912.zones
zone "." IN {
        type hint;
        file "named.ca";
};

# 创建区域解析配置文件
[root@mysqldb833 ~]# cp -a /etc/named.rfc1912.zones /etc/named.rfc1912.zones.natnet 
[root@mysqldb833 ~]# cp -a /etc/named.rfc1912.zones /etc/named.rfc1912.zones.hostonly

[root@mysqldb833 ~]# cat /etc/named.rfc1912.zones.natnet 
zone "." IN {
        type hint;
        file "named.ca";
};

zone "dnslocal.test" IN{
        type master;
        file "dnslocal.test.zone.natnet";
};

[root@mysqldb833 ~]# cat /etc/named.rfc1912.zones.hostonly
zone "." IN {
        type hint;
        file "named.ca";
};

zone "dnslocal.test" IN{
        type master;
        file "dnslocal.test.zone.hostonly";
};

# 创建解析文件
[root@mysqldb833 ~]# cat /var/named/dnslocal.test.zone.natnet
$TTL 1D  ;
@           IN  SOA  master duzy2023.139.com (            ;
                                                          ;
                                                          ;
                                                          ;
                                              20230520    ;
                                              1D          ;
                                              1H          ;
                                              1W          ;
                                              3H          ;
                                              )
                 NS  master ;
cd               NS  ns2
ns2              A   192.168.75.121
master    3D     A   192.168.75.189
www              A   192.168.75.199 ;

[root@mysqldb833 ~]# cat /var/named/dnslocal.test.zone.hostonly
$TTL 1D  ;
@           IN  SOA  master duzy2023.139.com (            ;
                                                          ;
                                                          ;
                                                          ;
                                              20230520    ;
                                              1D          ;
                                              1H          ;
                                              1W          ;
                                              3H          ;
                                              )
                 NS  master ;
cd               NS  ns2
ns2              A   192.168.75.121
master    3D     A   172.10.10.189
www              A   172.10.10.199 ;

# 创建view
[root@mysqldb833 ~]# tail -n 20 /etc/named.conf 
view natnet {
    match-clients {natnet;};
    include "/etc/named.rfc1912.zones.natnet";
};

view hostonly {
    match-clients {hostonly;};
    include "/etc/named.rfc1912.zones.hostonly";
};
#include "/etc/named.rfc1912.zones";

# 重起服务并测试
[root@localhost ~]# dig @192.168.75.189 www.dnslocal.test
;; ANSWER SECTION:
www.dnslocal.test.	86400	IN	A	192.168.75.199

[root@localhost ~]# dig @172.10.10.189 www.dnslocal.test
;; ANSWER SECTION:
www.dnslocal.test.	86400	IN	A	172.10.10.199

可以看见,不同网络的dig会产生不同的结果。

总结防火墙分类

  • 软件防火墙
    主机设备上已安装软件防火墙。因此,这种类型的防火墙也称为主机防火墙。由于它连接到特定设备,因此必须利用其资源来工作。因此,它不可避免地要耗尽系统的某些RAM和CPU。如果有多个设备,则需要在每个设备上安装软件。由于它需要与主机兼容,因此需要对每个主机进行单独的配置。因此,主要缺点是为每个设备管理和管理防火墙所需的时间和知识。另一方面,软件防火墙的优势在于,它们可以在过滤传入和传出流量的同时区分程序。因此,他们可以拒绝访问一个程序,同时允许访问另一个程序。

  • 硬件防火墙
    顾名思义,硬件防火墙是安全设备,代表放置在内部和外部网络(Internet)之间的单独硬件。此类型也称为设备防火墙
    与软件防火墙不同,硬件防火墙具有其资源,并且不会占用主机设备的任何CPU或RAM。它是一种物理设备,充当用于进出内部网络的流量的网关。
    拥有在同一网络中运行多台计算机的中型和大型组织都使用它们。在这种情况下,使用硬件防火墙比在每个设备上安装单独的软件更为实际。配置和管理硬件防火墙需要知识和技能,因此请确保有一支熟练的团队来承担这一责任。

  • 包过滤防火墙
    根据防火墙的操作方法来划分防火墙的类型时,最基本的类型是数据包筛选防火墙。它用作连接到路由器或交换机的内联安全检查点。顾名思义,它通过根据传入数据包携带的信息过滤来监控网络流量。
    如上所述,每个数据包包括一个报头和它发送的数据。此类防火墙根据标头信息来决定是允许还是拒绝访问数据包。为此,它将检查协议,源IP地址,目标IP,源端口和目标端口。根据数字与访问控制列表的匹配方式(定义所需/不需要的流量的规则),数据包将继续传递或丢弃。

  • 电路级网关

​ 电路级网关是一种在OSI模型的会话层工作的防火墙,它遵守TCP(传输控制协议)连接和会话。它们的主要功能是确保已建立的连接是安全的。在大多数情况下,电路级防火墙内置于某种类型的软件或已经存在 的防火墙中。像袖珍过滤防火墙一样,它们不检查实际数据,而是检查有关交易的信息。此外,电路级网关非常实用,易于设置,并且不需要单独的代理服务器。

  • 状态检查防火墙

​ 有状态检查防火墙通过监视TCP3次握手来跟踪连接状态。这样,它可以跟踪整个连接-从头到尾-仅允许预期的返回流量入站。

​ 启动连接并请求数据时,状态检查将建立数据库(状态表)并存储连接信息。在状态表中,它记下每个连接的源IP,源端口,目标IP和目标端口。使用状态检查方法,它可以动态创建防火墙规则以允许预期的流 量。此类防火墙用作附加安全性。与无状态过滤器相比,它执行更多检查,并且更安全。但是,与无状态/数据包筛选不同,有状态防火墙检查跨多个数据包而不只是标头传输的实际数据。因此,它们还需要更多 的系统资源。

  • 代理防火墙

​ 代理防火墙充当通过Internet通信的内部和外部系统之间的中间设备。它通过转发来自原始客户端的请求并将其掩盖为自己的网络来保护网络。代理的意思是充当替代者,因此,代理就发挥了作用。它代替了 发送请求的客户端。当客户端发送访问网页的请求时,代理服务器将与该消息相交。代理将消息转发到Web服务器,假装是客户端。这样做可以隐藏客户端的标识和地理位置,从而保护其不受任何限制和潜在的 攻击。然后,Web服务器做出响应,并将请求的信息提供给代理,该信息将传递给客户端。

  • 下一代防火墙

​ 下一代防火墙是结合了许多其他防火墙功能的安全设备。它合并了数据包,状态和深度数据包检查。简而言之,NGFW会检查数据包的实际有效负载,而不是仅关注标头信息。

​ 与传统防火墙不同,下一代防火墙检查数据的整个事务,包括TCP握手,表面级别和深度包检查。使用NGFW可以充分防御恶意软件攻击,外部威胁和入侵。这些设备非常灵活,并且没有明确定义它们提供的功 能。因此,请确保研究每个特定选项提供的内容。

  • 云防火墙

​ 云防火墙或防火墙即服务(Faas)是用于网络保护的云解决方案。像其他云解决方案一样,它由第三方供应商维护并在Internet上运行。客户端通常将云防火墙用作代理服务器,但是配置可以根据需求而变 化。它们的主要优点是可伸缩性。它们与物理资源无关,从而可以根据流量负载扩展防火墙容量。企业使用此解决方案来保护内部网络或其他云基础架构(Iaas / Paas)。

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

五链:在数据库穿越iptables的时候,会触发处理的点:

# 图示
                       用户空间进程
                    ^               |
                    input           output
                    |               |
                    |              \/
--> prerouting--><路由表>--forward--<路由表>---> postrouting--->

如上:
在数据包进入的时候会触发prerouting
如果是往用户进程发送的,那么会触发input,如果是用户进程往外发送的,会触发outpu
当数据包往系统外发送会触发postrouting
当数据包只是路过本机器,本地只作为一个转发的作用,那么会触发forward

流入本机:PREROUTING --> INPUT --> 用户空间进程
流出本机:用户空间进程 --> OUTPUT --> POSTROUTING
转发   : PREROUTING --> FORWARD --> POSTROUTING

以上就是5链,贯穿数据包通过本地的所有关键节点

每个节点又包含不同的表:security,raw,mangle,nat,filter
优先级是:security-->raw-->mangle-->nat-->filter

每个节点的包含的表是不一样的,为什么不一样?这要从每个表的功能说起:

filter表:审核数据包的参数是否符合规定,符合的才能通过

nat表:根据规则判定是否需要修改其中的源/目标地址

mangle表:根据规则可以修改数据包ip头部

raw表:提供且仅提供一个让数据包绕过连接跟踪的框架,也就是说决定是否对数据包进行状态追踪

security表:给数据包打上selinux标记

由上可以这样理解,

filter是链路层,只是根据数据包的信息筛选数据包是否是本机允许的数据包,类似于链路层

nat和mangle类似于网络层和传输层,控制数据包的源/目的信息

raw和security类似于应用层,用于对数据包的运用

所以从低到高的优先级是security-->raw-->mangle-->nat-->filter

链和表的包含关系:

链-表 filter nat mangle raw security
prerouting 1 1 1
input 1 1 1 1
forward 1 1 1
output 1 1 1 1 1
postrouting 1 1

测试环境:

  • 192.168.75.189,175.10.10.189
  • 192.168.75.121
  • 192.168.75.200

基本运用

添加规则

# 禁止200向121发送的包
[root@dns121 ~]# iptables -t filter -A INPUT -s 192.168.75.200 -j DROP
-s 是指定源ip地址,也可以指定ip地址段
-t filter:指定filter表
-A INPUT:追加INPUT链的规则

# 查看规则
[root@dns121 ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   15  1260 DROP       all  --  *      *       192.168.75.200       0.0.0.0/0
   
# 由于iptables规则是从上到下按个匹配的,如果前面的匹配后面的就不会继续匹对了,所以有时候需要向前面插入规则
比如,现在121上禁止200的请求数据包
[root@dns121 ~]# iptables -t filter -A INPUT -s 192.168.75.200 -j DROP
然后要允许200访问121的80端口,那么就需要在之前的规则前插入允许的规则
先查看当前规则序号:
[root@dns121 ~]# iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      105  7956 DROP       all  --  *      *       192.168.75.200       0.0.0.0/0 
可以看出是第一条,那么我们要插入到前面的位置就需要指定插入到第一条规则:
[root@dns121 ~]# iptables -t filter -I INPUT -s 192.168.75.200 -p tcp --dport 80 -j ACCEPT

删除规则

# 先查看当前规则编号
[root@dns121 ~]# iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        6   398 ACCEPT     tcp  --  *      *       192.168.75.200       0.0.0.0/0            tcp dpt:80
2      106  8040 DROP       all  --  *      *       192.168.75.200       0.0.0.0/0

# 删除第二条规则
[root@dns121 ~]# iptables -t filter -D INPUT 2

# 查看删除后的结果
[root@dns121 ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   398 ACCEPT     tcp  --  *      *       192.168.75.200       0.0.0.0/0            tcp dpt:80

常用模块

tcp模块

# tcp模块
--sport port[:port]:源端口号
--dport port[:port]:目标端口号
--tcp-flags mask comp
## 目标端口;拒绝对目标端口80的访问,此时,省略了-m tcp调用tco模块
[root@rh8 ~]# iptables -A INPUT -t filter -p tcp --dport 80 -j REJECT
## 源端口,禁止源端口是80的数据包,这样213的80端口返回的数据包就被拒绝
[root@centos201 ~]# iptables -A INPUT -t filter -p tcp --sport 80 -j REJECT

ICMP模块

# ICMP模块
icmp包分两个类型,一个是请求包,类型是0,一个是回应包,类型是8
[root@rh8 ~]# iptables -I INPUT -t filter -s 172.168.174.201 -j REJECT
[root@rh8 ~]# iptables -I INPUT 1 -t filter -p icmp --icmp-type 0 -j ACCEPT
首先拒绝所有从201来的数据包,然后允许201来的icmp回应包,这样213的icmp包可以发出可以接收,但是201发送的icmp请求包会被拒绝
这样213可以ping通201,但201不能ping通213

multiport模块

# multiport 多端口,弥补tcp模块不能指定多端口的缺点
## 禁止201对213的所有数据包,然后打开80和443端口
## 如果使用tcp模块,那么就必须使用两条策略,使用multiport使用一条策略即可
## multiport兼容tcp模块的端口参数形式
[root@rh8 ~]# iptables -A INPUT -t filter -s 172.168.174.201 -j REJECT
[root@rh8 ~]# iptables -I INPUT 1 -t filter -p tcp -m multiport --dports 80,443 -j ACCEPT

iprange模块

# --src-range from[-to]  源目标地址范围
# --dst-range from[-to]  目标地址范围

# 示例
[root@rh8 ~]# iptables -A INPUT -t filter -p tcp --dport 80 -m iprange --src-range 172.168.174.201-172.168.174.222 -j DROP
[root@rh8 ~]# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 19372 packets, 2439K bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 source IP range 172.168.174.201-172.168.174.222

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

备份规则

两种方式:

# 查看iptables-save命令
[root@rh8 ~]# file `which iptables-save`
/usr/sbin/iptables-save: symbolic link to xtables-nft-multi

[root@rh8 ~]# file `which iptables`
/usr/sbin/iptables: symbolic link to xtables-nft-multi
可以发现,这iptables-save和iptables是同一个命令的链接

# 执行iptables-save
[root@rh8 ~]# iptables-save
# Generated by iptables-save v1.8.4 on Wed Jun  7 23:12:40 2023
*filter
:INPUT ACCEPT [35660:4051612]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [19801:1665925]
COMMIT
这个命令只是将iptables规则按表分类显示出来

# 使用iptables-save将规则保存以及加载
[root@rh8 ~]# iptables-save > iptables.rules
[root@rh8 ~]# iptables-restore < iptables.rules

# 开机自动加载则需要在rc.local中写入加载命令
# 也可以安装iptables-services包来实现iptables.service,这样就可以使用systemctl控制
# 注意,启动iptables.service会清空之前添加的规则
[root@rh8 ~]# yum install -y iptables-services
[root@rh8 ~]# systemctl enable --now iptables.service

# 通过查看包信息找到service文件,查看service文件发现调用的脚本是/usr/libexec/iptables/iptables.init
# 查看脚本内容发现iptables的配置文件是/etc/sysconfig/iptables
[root@rh8 ~]# ll /etc/sysconfig/iptables
-rw------- 1 root root 550 Aug  5  2022 /etc/sysconfig/iptables

# 但是这个文件中的初始规则不是我们想要的,需要更改
# 这个时候停用iptables.service,然后添加自己的规则,最后用iptables-save > /etc/sysconfig/iptables
# 启动服务即可

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

原理

替换源端ip和端口是snat

替换目标端ip和端口是dnat

步骤:

内网访问外网:内网数据包通过防火墙转发到外网目标地址,此时,在防火墙上会有一个映射表,里面记录了内网ip:端口->防火墙ip:端口;防火墙会把内网发出的包中的源ip:端口变更为:防火墙ip:端口;这个过程称为SNAT:source net address translate

外网回包:外网的数据包发送到防火墙ip:端口上,防火墙将数据包的目标地址根据映射表改变为内网ip:端口,然后将数据包发送给目标机器

在上述的两步中,端口是无人使用的端口,将源端口映射为防火墙上的端口叫做PAT

外网访问内网:

外网想要访问内网,就只能访问防火墙的ip:端口,所以将内网ip:端口与防火墙ip:端口做一个映射,当外部数据包到达防火墙时,防火墙将目标ip:端口替换成内网ip:端口,这就是DNAT

回包的时候,也是内网机器将数据包发送给防火墙,防火墙将数据包的源ip:端口替换为内网ip:端口

NAT需要走NAT表,可以做地址转换

以下命令可以查看nat表支持哪些链

[root@centos200 ~]# iptables -t nat -nvL

PREROUTING,INPUT,POSTROUTING,OUTPUT

课后作业:

A(192.168.2.213)<->(192.168.2.202)B(192.168.75.202)<->(192.168.75.200)C(172.168.174.200)<->(172.168.174.021)D
A和D上均安装httpd服务,需要从A访问D和从D访问A,使用SNAT和DNAT将地址转换
202
[root@202 ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -j MASQUERADE
[root@202 ~]# iptables -t nat -A PREROUTING -d 192.168.75.202 -p tcp --dport 8080 -j DNAT --to-destination 192.168.2.213:80

200
[root@200 ~]# iptables -t nat -A POSTROUTING -s 172.168.174.0/24 ! -d 172.168.174.0/24 -j SNAT --to-source 192.168.75.200
[root@200 ~]# iptables -t nat -A PREROUTING -d 192.168.75.200 -p tcp --dport 8080 -j DNAT --to-destination 172.168.174.201:80

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

在121上安装了httpd服务,在200上curl可以得到如下结果:

[root@localhost ~]# curl 192.168.75.121:80
hello from 121

在121上将90端口导向80端口

[root@dns121 ~]# iptables -t nat -A PREROUTING -d 192.168.75.121 -p tcp --dport 90 -j REDIRECT --to-port 80

测试:

[root@localhost ~]# curl 192.168.75.121:90
hello from 121

总结关系型数据库相关概念,关系,行,列,主键,惟一键,域

1. 关系(Relation):关系是数据库中的一个表格,具有特定的名称和由行和列组成的结构。每个关系都有一个唯一的名称,并且包含了一组具有相同属性的数据行。
2. 行(Row):行是关系中的一个记录,也被称为元组。每一行代表了关系中的一个实体或记录,它包含了一组属性值,每个属性值对应一列。
3. 列(Column):列是关系中的一个属性,也被称为字段。每一列定义了关系中的某个特定的数据类型,并且包含了相应的属性值。
4. 主键(Primary Key):主键是关系中的一列或一组列,它的值能够唯一标识关系中的每一行。主键的值必须是唯一的且非空的,用于确保行的唯一性和标识性。
5. 唯一键(Unique Key):唯一键是关系中的一列或一组列,它的值能够保证在关系中的每一行都是唯一的。与主键不同的是,唯一键的值可以为空。
6. 域(Domain):域是关系中每一列的取值范围或数据类型。每个列都有一个特定的域,它定义了该列可以存储的数据类型,如整数、字符串、日期等。

总结关联类型,1对1,1对多,多对多关系。可以自行设计表进行解释。

1对1关系:
两个表之间的关系是一对一的关系,即一个记录在一个表中只能对应另一个表中的一条记录,反之亦然。
可以将两个表的主键相互关联,其中一个表的主键作为另一个表的外键。
假设有两个表,一个是"Person"表,另一个是"employ"表。每个人只有一个员工编号,每个员工编号也只属于一个人。可以在"Person"表中建立一个外键,引用"employ"表的主键。
1对多关系:
一个表中的一条记录可以对应另一个表中的多条记录,而另一个表中的每条记录只能对应一条记录。
在多的一方的表中添加一个外键,引用另一个表的主键。
假设有两个表,一个是"students"表,另一个是"class"表。每个班级可以有多个学生,但每个学生只属于一个班级。可以在"students"表中建立一个外键,引用"class"表的主键。
多对多关系:
两个表之间的关系是多对多的关系,即一个记录在一个表中可以对应多个记录,在另一个表中也可以对应多个记录。
需要创建一个中间表(也称为连接表或关联表),该表包含两个表的主键作为外键。
比如学生和课程标,学生会有多个课程,而一个课程也会有多个学生

总结mysql设计范式

1. 第一范式(1NF):
- 要求表中每个字段都是原子性的,不可再分。
- 表中的每个字段都只包含一个值,不允许重复的字段。
- 确保每个字段的值是唯一的,不会出现数据冗余。
- 通过将重复的字段拆分为单独的表来满足1NF要求。
2. 第二范式(2NF):
- 在满足1NF的基础上,要求表中的非主键字段完全依赖于主键。
- 如果一个表中有多个候选键,每个非主键字段都应该完全依赖于所有候选键,而不是只依赖于其中的一部分。
- 可以通过将非主键字段拆分到新的表中,并与主键建立关联来满足2NF要求。
3. 第三范式(3NF):
- 在满足2NF的基础上,要求表中的非主键字段之间没有传递依赖关系。
- 如果一个非主键字段依赖于另一个非主键字段,那么应该将这些字段拆分到不同的表中。
- 可以通过创建新的表来存储非主键字段,并使用外键与原始表建立关联来满足3NF要求。
posted @ 2023-08-06 20:28  NewBird001  阅读(48)  评论(0)    收藏  举报