目录
1. 总结openssh服务安全加固和总结openssh免密认证原理,及免认证实现过程。
4. 总结PAM配置文件格式,总结相关示例, nologin.so, limits,等模块的使用。
4.2 总结nologin.so, limits,等模块的使用
9. 总结DNS服务器类型,解析答案,正反解析域,资源记录定义。
11.1在父域DNS服务器上实现主wang.org域的主DNS服务
14. 总结iptable 5表5链, 基本使用,扩展模块。
16. 总结NAT转换原理, DNAT/SDNAT原理,并自行设计架构实现DNAT/SNAT。
17. 使用REDIRECT将90端口重定向80,并可以访问到80端口的服务
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.socketLast 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架构
PAM相关文件
包名: pam
模块文件目录:/lib64/security/*.so
特定模块相关的设置文件:/etc/security/
应用程序调用PAM模块的配置文件:
- 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效
PAM工作原理
- PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)pam_.s0
- 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格式,此格式不使用
**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;用来传递给该模块的参数
- Auth 账号的认证和授权
- Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
- Password 用户修改密码时密码复杂度检查机制等功能
- Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应 用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其 它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的required和requisite
- optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略 include: 调用其他的配置文件中定义的配置信息
module-path:
- 模块文件所在绝对路径:
- 模块文件所在相对路径:/lib64/security目录下的模块可使用相对路径,如:pam_shells.so、
- pam_limits.so
- 有些模块有自已的专有配置文件,在/etc/security/*.conf目录下
- 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 模块
[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模块
-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: 设置虚拟内存的最大值 . 单位 :kbytesunlimited 是一个特殊值,用于表示不限制#说明查询时,若不加 H 或 S 参数,默认显示的是软限制修改时,若不加 H 或 S 参数,两个参数一起改变
/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 所能够同时打开的最大文件数量 , 默认为 1024nproc 所能够同时运行的进程的最大数量 , 默认为 1024
# /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.confDefaultLimitNOFILE=100000DefaultLimitNPROC=65535或者针对指定的 service 添加下面行[Service]LimitNOFILE=100000LimitNPROC=65535
[root@rocky8 /etc/pam.d]$ ulimit -acore 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
[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.confhuang - 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 iburstserver ntp1.aliyun.com iburstserver ntp2.aliyun.com iburst#allow 192.168.0.0/16allow 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.confserver 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 资源记录定义
- 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验证等,如下示例:
- _dnsauth TXT 2012011200000051qgs69bwoh4h6nht4n1h0lr038x
9.4.1 资源记录定义的
name [TTL] IN rr_type value
9.4.2 SOA记录
- name: 当前区域的名字,例如"wang.org."
- value: 有多部分组成
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.
huang.org. IN NS ns1.huang.org.huang.org. IN NS ns2.huang.org.
9.4.4 MX记录
huang.org. IN MX mx1.huang.org.IN MX mx2.huang.org.
9.4.5 A记录
www. huang.com IN A 10.0.0.7
9.4.6 AAAA记录
name: FQDNvalue: IPv
9.4.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.huang.com.# 如 1.2.3 为网络地址,可简写成:4 IN PTR www.huang.com.
9.4.8 CNAME别名记录
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 masterNS 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.zoneszone "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-eth0DNS1 = 10.0.0.8DNS2 = 10.0.0.18# 验证从 DNS 服务器是否可以查询dig www.huang.comcurl www.huang.com# 在主服务器上停止 DNS 服务systemctl stop named# 验证从 DNS 服务器仍然可以查询dig www.huang.comcurl 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.zonevim /var/named/huang.com.zone$TTL 1D@ IN SOA master admin.huang.com. (1 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimumNS masterguangzhou NS guangzhounsmaster A 10 .0.0.8guangzhouns A 10 .0.0.18www A 10 .0.0.7systemctl 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.zoneszone "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.zonevim /var/named/ guangzhou.huang.com.zone$TTL 1D@ IN SOA master admin. huang.com . (2019042214 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimumNS mastermaster A 10 .0.0.18www A 10 .0.0.17systemctl 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, Checkpoint,NetScreen(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 隐性扩展
[!] --source-port , --sport port[:port] :匹配报文源端口 , 可为端口连续范围[!] --destination-port ,--dport port[:port] :匹配报文目标端口 , 可为连续范围[!] --tcp-flags mask compmask 需检查的标志位列表,用 , 分隔 , 例如 SYN,ACK,FIN,RSTcomp 在 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-type {type[/code]|typename}type/code0 /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 ~] #ipnChain INPUT (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out sourcedestination1 1 60 REJECT tcp -- * * 10 .0.0.60 .0.0.0/0 tcp dpts:21:23 reject-with icmp-port-unreachableChain FORWARD (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out sourcedestinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out sourcedestination
14.4.2 显性扩展
[-m matchname [per-match-options]]
multiport扩展
# 指定多个源端口[!] --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 -mmultiport --dports 20:22,80 -j ACCEPT[root@centos8 ~] #iptables -A INPUT -s 10.0.0.6 -p tcp -m multiport --dports445,139 -j REJECT[root@centos8 ~] #ipnChain INPUT (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out sourcedestination1 2 120 REJECT tcp -- * * 10 .0.0.60 .0.0.0/0 multiport dports 445 ,139 reject-with icmp-port-unreachableChain FORWARD (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts byte
iprange扩展
[!] --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-range172 .16.1.5-172.16.1.10 -j DROP
string扩展
--algo {bm|kmp} 字符串匹配检测算法bm : Boyer-Moorekmp : 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 REJECTiptables -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 --limit20/minute -j ACCEPT[root@centos8 ~] #iptables -A INPUT -p icmp -j REJECT[root@centos6 ~] #ping 10.0.0.8PING 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 ms64 bytes from 192 .168.39.8: icmp_seq = 2 ttl = 64 time = 0 .436 ms64 bytes from 192 .168.39.8: icmp_seq = 3 ttl = 64 time = 0 .774 ms64 bytes from 192 .168.39.8: icmp_seq = 4 ttl = 64 time = 0 .391 ms64 bytes from 192 .168.39.8: icmp_seq = 5 ttl = 64 time = 0 .441 ms64 bytes from 192 .168.39.8: icmp_seq = 6 ttl = 64 time = 0 .356 ms64 bytes from 192 .168.39.8: icmp_seq = 7 ttl = 64 time = 0 .553 ms64 bytes from 192 .168.39.8: icmp_seq = 8 ttl = 64 time = 0 .458 ms64 bytes from 192 .168.39.8: icmp_seq = 9 ttl = 64 time = 0 .459 ms64 bytes from 192 .168.39.8: icmp_seq = 10 ttl = 64 time = 0 .479 ms64 bytes from 192 .168.39.8: icmp_seq = 11 ttl = 64 time = 0 .450 ms64 bytes from 192 .168.39.8: icmp_seq = 12 ttl = 64 time = 0 .471 ms64 bytes from 192 .168.39.8: icmp_seq = 13 ttl = 64 time = 0 .531 ms64 bytes from 192 .168.39.8: icmp_seq = 14 ttl = 64 time = 0 .444 msFrom 192 .168.39.8 icmp_seq = 15 Destination Port Unreachable64 bytes from 192 .168.39.8: icmp_seq = 16 ttl = 64 time = 0 .668 msFrom 192 .168.39.8 icmp_seq = 17 Destination Port UnreachableFrom 192 .168.39.8 icmp_seq = 18 Destination Port Unreachable64 bytes from 192 .168.39.8: icmp_seq = 19 ttl = 64 time = 0 .692 msFrom 192 .168.39.8 icmp_seq = 20 Destination Port UnreachableFrom 192 .168.39.8 icmp_seq = 21 Destination Port Unreachable64 bytes from 192 .168.39.8: icmp_seq = 22 ttl = 64 time = 0 .651 ms
state扩展
state 扩展模块,可以根据”连接追踪机制“去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
状态类型:
- NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发 出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
- 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 ACCEPTiptables -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 7,8 可以安装 iptables-services 实现iptables.service
[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。
- SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
- DNAT:destination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
- PNAT: port nat,端口和IP都进行修改
16.1 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.confnet.ipv4 .ip_forward = 1[root@firewall ~] #sysctl -p# 针对专线静态公共 IP[root@firewall ~] #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --tosource 192.168.0.8# 针对拨号网络和专线静态公共 IP[root@firewall ~] #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE# 查看监听端口[root@firewall ~] #ss -ntlState Recv-Q Send-Q Local Address:PortPeer Address:PortLISTEN 0 128 0 .0.0.0:220 .0.0.0:*LISTEN 0 100 127 .0.0.1:250 .0.0.0:*LISTEN 0 128 [::]:22[::]:*LISTEN 0 100 [::1]:25[::]:*# 内网可以访问外网[root@lanserver1 ~] #curl 192.168.0.6internet# 外网不可以访问内网[root@internet ~] #curl 10.0.0.7curl : (7) Failed to connect to 10 .0.0.7: Network is unreachable# 在外网服务器查看到是 firewalld 的地址在访问[root@internet ~] #tail -f /var/log/httpd/access_log192 .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 = 58384dport = 80 src = 192 .168.0.6 dst = 192 .168.0.8 sport = 80 dport = 58384 [ASSURED] mark = 0zone = 0 use = 2
[root@internet-host ~] #hostname -I10 .0.0.6[root@internet-host ~] #route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface10 .0.0.0 0 .0.0.0 255 .255.255.0 U 1 0 0 eth0# 启用路由转发[root@firewall ~] #vim /etc/sysctl.confnet.ipv4 .ip_forward = 1[root@firewall ~] #sysctl -p[root@firewall-host ~] #hostname -I10 .0.0.8 192 .168.100.8[root@firewall-host ~] #sysctl -a |grep net.ipv4.ip_forwardnet.ipv4.ip_forward = 1[root@lan-host ~] #hostname -I192 .168.100.7[root@lan-host ~] #route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0 .0.0.0 192 .168.100.8 0 .0.0.0 UG 100 0 0 eth0192 .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 natChain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 SNAT all -- * * 192 .168.100.0/24 0 .0.0.0/0to:10.0.0.8Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination [root@lan-host ~] #curl 10.0.0.6internet Server[root@internet-host ~] #curl 192.168.100.7curl : (7) Failed to connect to 192 .168.100.7: Network is unreachable[root@internet-host ~] #tail /var/log/httpd/access_log10 .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.6PING 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 ms64 bytes from 10 .0.0.6: icmp_seq = 2 ttl = 63 time = 0 .544 ms[root@internet-host ~] #tcpdump -i eth0 -nn icmptcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes16 :34:30.171222 IP 10 .0.0.8 > 10 .0.0.6: ICMP echo request, id 24718 , seq 120 ,length 6416 :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 -jMASQUERADE[root@firewall-host ~] #iptables -t nat -nvLChain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 MASQUERADE all -- * * 192 .168.100.0/24 0 .0.0.0/0Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination[root@firewall-host ~] #cat /proc/net/nf_conntrackipv4 2 tcp 6 32 TIME_WAIT src = 192 .168.100.7 dst = 10 .0.0.6 sport = 39430dport = 80 src = 10 .0.0.6 dst = 10 .0.0.8 sport = 80 dport = 39430 [ASSURED] mark = 0 zone = 0use = 2
16.2 DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
DNAT 格式:
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --todestination InterSeverIP[:PORT]
范例:
# 启用路由转发[root@firewall ~] #vim /etc/sysctl.confnet.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 -ntlState Recv-Q Send-Q Local Address:PortPeer Address:Port LISTEN 0 128 0 .0.0.0:220 .0.0.0:*LISTEN 0 100 127 .0.0.1:250 .0.0.0:*LISTEN 0 128 [::]:22[::]:*LISTEN 0 100 [::1]:25[::]:*[root@internet ~] #curl 192.168.0.8lanserver1[root@lanserver1 ~] #tail /var/log/httpd/access_log192 .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.3libidn/1.18 libssh2/1.4.2"[root@firewall ~] #cat /proc/net/nf_conntrackipv4 2 tcp 6 117 TIME_WAIT src = 192 .168.0.6 dst = 192 .168.0.8 sport = 58170dport = 80 src = 10 .0.0.7 dst = 192 .168.0.6 sport = 8080 dport = 58170 [ASSURED] mark = 0zone = 0 use = 2
[root@firewall-host ~] #iptables -t nat -A PREROUTING -d 10.0.0.8 -p tcp --dport80 -j DNAT --to-destination 192.168.100.7[root@firewall-host ~] #iptables -t nat -vnL PREROUTINGChain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 DNAT tcp -- * * 0 .0.0.0/0 10 .0.0.8tcp dpt:80 to:192.168.100.7[root@firewall-host ~] #ss -ntlState Recv-Q Send-Q Local Address:PortPeer Address:PortLISTEN 0 128 0 .0.0.0:220 .0.0.0:*LISTEN 0 128 [::]:22[::]:*[root@internet-host ~] #curl 10.0.0.8lan server[root@internet-host ~] #telnet 10.0.0.8Trying 10 .0.0.8...telnet : connect to address 10 .0.0.8: Connection refused[root@lan-host ~] #tail -f /var/log/httpd/access_log10 .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.3libidn/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_conntrackipv4 2 tcp 6 81 TIME_WAIT src = 10 .0.0.6 dst = 10 .0.0.8 sport = 59426dport = 80 src = 192 .168.100.7 dst = 10 .0.0.6 sport = 80 dport = 59426 [ASSURED] mark = 0zone = 0 use = 2[root@lan-host ~] #vim /etc/httpd/conf/httpd.conflisten 8000[root@lan-host ~] #systemctl restart httpd[root@lan-host ~] #ss -ntlState Recv-Q Send-Q Local Address:Port PeerAddress:PortLISTEN 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 --dport80 -j DNAT --to-destination 192.168.100.7:8000[root@firewall-host ~] #iptables -t nat -vnLChain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 DNAT tcp -- * * 0 .0.0.0/0 10 .0.0.8tcp dpt:80 to:192.168.100.7:8000Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination11 816 MASQUERADE all -- * * 192 .168.100.0/24 0 .0.0.0/0Chain 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
}
}