SSH服务、sudo、PAM、DNS服务、Linux防火墙iptables、firewalld

一.SSH服务

1.OpenSSH服务的安全加固

  • 更新软件版本:定期更新OpenSSH软件版本,以修复已知漏洞。
  • 禁用不安全的加密算法:在sshd_config配置文件中禁用弱加密算法,如DES、MD5等。
  • 限制登录尝试次数:通过配置MaxAuthTries参数限制登录尝试次数,防止暴力破解。
  • 使用密钥认证:推荐使用公钥认证替代密码认证,提高安全性。
  • 限制用户访问:通过AllowUsers或DenyUsers参数限制允许登录的用户。
  • 启用两因素认证:使用Google Authenticator等工具实现两因素认证,提高安全性。
  • 配置防火墙:限制SSH服务访问IP范围,只允许特定IP访问SSH服务。

2.OpenSSL免密认证

(1)原理:OpenSSH免密认证基于公钥加密原理,通过在客户端生成公钥和私钥对,将公钥添加到服务器的authorized_keys文件中,实现无需密码即可登录。
(2)实现免密认证

服务端:CentOS8 客户端:Rocky8

在客户端Rocky8生成密钥对

在这里插入图片描述
在这里插入图片描述

将公钥文件传输至远程服务器CentOS8对应的家目录

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二.sudo

1.sudo特性

  • sudo能够授权指定用户在指定主机上运行默写命令。如果未授权用户尝试使用sudo,会提示联系管理员
  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。她能够将日志传到中心主机或者日志服务器
  • sudo使用时间出文件来执行类似的"检票"系统。当用户调用sudo并且输入他的密码时,用户获得了一张存活期为5分钟的票
  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。他所存放的位置默认是在/etc/sudoers,属性必须为0440

2.sudo组成

配置文件: /etc/sudo.conf
授权规则配置文件: /etc/sudoers   /etc/sudoers.d
安全编辑授权规则文件和语法检查工具: /usr/sbin/visudo
授权编辑规则文件的工具: /usr/bin/sudoedit
执行授权命令: /usr/bin/sudo
时间戳文件: /var/db/sudo
日志文件: /var/log/secure

3.sudo授权规则配置

(1)配置文件格式:

配置文件格式说明: /etc/sudoers,/etc/sudoers.d
配置文件中支持使用通配符glob
? 任意一字符
*匹配任意长度字符
[wxc] 匹配其中一个字符
[!wxc] 除了这三个字符的其他字符
\x 转义
[[alpha]] 字母

(2)配置文件规则:

配置文件规则有两类:1.别名定义(不是必须的)2.授权规则(必须的)

sudoers授权规则格式:user host=(runas) command

说明: 
      user 运行命令者的身份
      host 通过那些主机
      (runas) 以哪个用户的身份
      command 运行那些命令 

sudoers的别名:[A-z] ([A-z][0-9]_)*
Alias_Type NAME1 =item1,item2,item3 : NAME = item4,item5

类型: 
    User_Alias
    Runas_Alias
    Host_Alias
    Cmnd_Alias

(3)范例:

允许用户alice以root身份执行所有命令:

aliace ALL=(ALL:ALL) ALL

允许用户组developers以root身份执行特定命令:

%developers ALL=(ALL) /bin/ls,/bin/cat

定义主机别名WEBSERVERS:

Host_Alias WEBSERVERS = webserver1,webserver2 

定义命令别名MANAGE:

Cmnd_Alias MANAGE = /bin/systemctl,/bin/journalctl

三.PAM

1.PAM架构

PAM(Pluggable Authentication Modules)是一种灵活的身份验证框架,允许系统管理员通过配置不同的认证模块来实现用户身份验证。以下是PAM架构的主要组成部分:

  • 应用程序:需要进行身份验证的应用程序,如登录界面、SSH等。

  • PAM库:提供了与PAM框架进行交互的API,应用程序通过PAM库调用PAM服务。

  • PAM配置文件:位于/etc/pam.d/目录下的配置文件,定义了每个应用程序的身份验证流程,包括哪些模块以及它们的顺序。

  • PAM模块:实际执行身份验证的模块,可以是本地模块、远程模块或其他类型的模块。常见的PAM模块包括pam_unix(用于基于密码的认证)、pam_ldap(用于LDAP认证)等。

2.PAM工作原理

  • 应用程序调用:应用程序通过PAM库调用PAM服务,请求进行身份验证。

  • PAM加载配置:PAM根据应用程序指定的配置文件加载相应的PAM配置。

  • PAM模块执行:PAM按照配置文件中定义的顺序调用相应的PAM模块进行身份验证。每个模块执行特定的认证任务,如密码验证、指纹识别等。

  • 认证结果:每个PAM模块执行完毕后会返回认证结果(成功、失败或需要进一步验证),PAM根据所有模块的结果综合判断最终的认证结果。

  • 返回结果:PAM将最终的认证结果返回给应用程序,应用程序根据结果决定是否允许用户访问。

3.PAM配置文件格式

通过配置文件/etc/pam.conf格式,此格式不使用
application type conntrol module-path arguments
专用配置文件/etc/pam.d/格式
type control module-path arguments

说明:
    application:指服务名,如:telnet、ftp等,服务名字"OTHER"代表所有没有在该文件中明确配置的其他服务
    type:指模块类型,即功能
    control: PAM库该如何处理该服务相关的PAM模块的成功后失败情况,一个关键词实现
    module-path: 用来指明本模块对应的程序文件的路径名
    Arguments: 用来传递给该模块的参数

4.模块

nologin.so模块:阻止用户登陆的模块

accout require pam_nologin.so

limits模块:限制用户资源的模块,如CPU、内存等

session required pam_limists.so

password模块:强制用户设置密码策略的模块

password requisite pam_pwquality.so retry=3

pam_unix模块:基于UNIX身份验证模块

auth required pam_unix.so

pam_idap模块:LDAP身份验证模块

auth required pam_ldap.so

五.DNS服务

1.DNS域名三级结构

在这里插入图片描述

(1)顶级域名(Top-Level Domain,TLD):

顶级域名是DNS层次结构中最高级别的域名,用于表示国家、地区、组织类型等。
顶级域名分为两类:通用顶级域名(Generic Top-Level Domains,gTLD)和国家顶级域名(Country Code Top-Level Domains,ccTLD)。
例如,.com、.org、.net是通用顶级域名,.cn、.uk、.jp是国家顶级域名。

(2)二级域名(Second-Level Domain):

二级域名位于顶级域名之下,用于表示特定组织、公司或个人。
二级域名通常用于标识网站或服务的所有者。
例如,在example.com中,example就是二级域名。

(3)子域名(Subdomain):

子域名位于二级域名之下,可以进一步细分网站的结构或服务。
子域名可以根据需要进行创建,形成更具体的命名结构。
例如,在blog.example.com中,blog就是子域名。

2.DNS服务工作原理

在这里插入图片描述
(1)递归查询
当客户端发起域名解析请求时,递归查询会由本地DNS服务器代为完成整个解析过程。
本地DNS服务器首先向根域名服务器发起查询请求,根域名服务器返回顶级域名服务器的地址。
然后本地DNS服务器向顶级域名服务器发起查询请求,顶级域名服务器返回次级域名服务器的地址。
递归查询会依次向下查询,直到找到目标域名对应的IP地址,然后将结果返回给客户端。

(2)迭代查询
在迭代查询中,DNS服务器不会为客户端完成整个解析过程,而是将部分查询责任转移给其他DNS服务器。
当本地DNS服务器无法直接解析域名时,它会向根域名服务器发起查询请求,根域名服务器返回顶级域名服务器的地址。
然后本地DNS服务器向顶级域名服务器发起查询请求,顶级域名服务器返回次级域名服务器的地址,依次类推。
本地DNS服务器会将下一步查询的责任转交给其他DNS服务器,直到找到目标域名对应的IP地址,然后将结果返回给客户端。
(3)DNS缓存
DNS缓存是将解析数据存储在靠近发起请求的客户端的位置,也可以说DNS数据是可以缓存在任意位置,最终目的是以此减少递归查询过程,可以更快的让用户获得请求结果。

3.DNS正反解析域

  • 正向解析:将域名解析为对应的IP地址
  • 反向解析:将IP地址解析为对应的域名

4.DNS服务器类型

  • 根域名服务器(Root Name Servers):负责管理顶级域名服务器的地址信息。
  • 顶级域名服务器(Top-Level Domain Servers):负责管理各个顶级域名的地址信息。
  • 权威域名服务器(Authoritative Name Servers):负责管理特定域名的解析信息。
  • 本地DNS服务器(Local DNS Servers):提供域名解析服务给局域网内的设备。

5.资源记录定义

  • A记录(Address Record):将域名解析为IPv4地址。
  • AAAA记录(IPv6 Address Record):将域名解析为IPv6地址。
  • CNAME记录(Canonical Name Record):将域名指向另一个域名。
  • MX记录(Mail Exchange Record):指定邮件服务器的优先级顺序。
  • NS记录(Name Server Record):指定域名服务器的权威服务器。
  • PTR记录(Pointer Record):将IP地址解析为域名。
  • SOA记录(Start of Authority Record):指定域的权威服务器和其他参数。
  • TXT记录(Text Record):存储文本信息。

6.实现DNS主从同步

在这里插入图片描述

#在wang.org域主DNS服务器10.0.0.8/24上实现
yum -y install bind -y

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 "wang.org"{
    type master;
    file "wang.org.zone";
};

vim /var/named/wang.org.zone
$TTL 1D
@   IN  SOA  master admin.wang.org (
                    1   ; 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
www             A   10.0.0.68   

named-chenckconf  #检查配置文件语法错误
named-checkzone wang.org /var/named/wang.org.zone #检查数据库文件语法错误

chgrp named /var/named/wang.org.zone

systemctl start named #第一次启动服务
rndc reload           #不是第一次启动服务

[root@centos8 ~]# host www.wang.org 10.0.0.8
Using domain server:
Name: 10.0.0.8
Address: 10.0.0.8#53
Aliases: 

www.wang.org has address 10.0.0.68

#在wang.org域从DNS服务器10.0.0.18/24上实现
yum -y install bind -y

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

vim /etc/named.rfc1912.zones
 zone "wang.org"{
     type slave;
     masters { 10.0.0.8; };
     file " /var/named/slaves/wang.org.slave.zone";
};

named-chenckconf  #检查配置文件语法错误
systemctl start named #第一次启动服务
rndc reload           #不是第一次启动服务
ls /var/named/slaves/wang.org.slave

[root@centos8 ~]# host www.wang.org 10.0.0.18
Using domain server:
Name: 10.0.0.18
Address: 10.0.0.18#53
Aliases: 

www.wang.org has address 10.0.0.68

7.实现DNS子域授权

#在org域的主DNS服务10.0.0.28
yum -y install bind -y

vim /etc/named.conf
//	listen-on port 53 { 127.0.0.1; };
//	allow-query     { localhost; };

vim /etc/named.rfc1912.zones
#加上这段
zone "org" {
	type master;
	file "org.zone"
}

vim /var/named/org.zone
@   IN  SOA  master admin.wang.org (
                    1   ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
                NS  master
wang            NS  wang1
wang            NS  wang2  
master          A   10.0.0.28
wang2           A   10.0.0.18
wang1           A   10.0.0.8

named-chenckconf  #检查配置文件语法错误
named-checkzone org /var/named/org.zone #检查数据库文件语
chgrp named /var/named/org.zone

systemctl start named    
rndc reload         

六.Linux防火墙

1.防火墙的分类

(1)按保护范围分:

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

(2)按实现方式划分:

  • 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能 基于软件实现
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,windows防火墙 ISA -> Forefront TMG

(3)按网络协议划分:

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

2.iptables

在这里插入图片描述

(1)五表五链

  • 五个内置链 chain:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
  • 自定义链:用于对内置链进行扩展或补充,可以实现更灵活的规则组织管理机制;只用HOOK钩子调用自定义链时,才生效
  • 五个表 table:filter、nat、mangle、raw、security
  • filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
  • nat:network address translation 地址转换规则表
    mangle:修改数据标记位规则表
    raw:关闭启动的连接跟踪机制,加快风暴穿越防火墙速度
    security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
  • 优先级:security --> raw -->mangle -->nat -->fileter

(2)iptables基本指令

参数含义
-t指定表名称(nat,filer,mangle),不加-t,默认时filter
-p指定协议,可用数字如0
–dport,–sport指定目的端口,来源端口
-s源IP地址或者不连续的IP地址
-j动作(ACCEPT,DROP,REJECT,DNAT,SNAT)
-i指定报文流入的接口,只应用于INPUT、FORWORD、PREROUTING链
-o指定报文流出的接口,只应用于FORWORD、OUTPUT、POSTROUTING链
-vnLL 查看表规则,选项置后 n 数字格式显示 v 详细信息
-A追加
-I插入,要指明插入至的规则编号,默认第一条
-D删除 (1)指明规则本身 (2)指明规则序号
-R替换指定链上的指定规则编号
-F清空表规则
-Z置零
范例:
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 268 packets, 139K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1187  111K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1031 packets, 110K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# 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         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# iptables -A INPUT -s 10.0.0.28/24 -j DROP
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 268 packets, 139K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1343  120K ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 DROP       all  --  *      *       10.0.0.0/24          0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1119 packets, 118K bytes)
 pkts bytes target     prot opt in     out     source               destination     
[root@rocky8 ~]# iptables -A INPUT -p tcp --sport 22 --dport 80 -j ACCEPT
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  226 15854 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:22 dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 131 packets, 13413 bytes)
 pkts bytes target     prot opt in     out     source               destination  
[root@rocky8 ~]# iptables -I INPUT 1 -p tcp --dport 1024 -j REJECT
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1024 reject-with icmp-port-unreachable
  404 26230 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:22 dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 226 packets, 21429 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# iptables -R INPUT 1 -j ACCEPT
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   364 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  530 33650 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:22 dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 299 packets, 28161 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# iptables -D INPUT 1
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  536 34014 ACCEPT     all  --  *      *       10.0.0.1             0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:22 dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 362 packets, 33897 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# iptables -F
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 382 packets, 36073 bytes)
 pkts bytes target     prot opt in     out     source               destination         

(3)iptables扩展模块

[-m matchname] [per-match-options]

  • multiport扩展:以离散方式定义多端口匹配,最多指定15个端口
  • iprange扩展:指明连续的(但一般不是整个网络)IP地址范围
  • mac扩展:可以指明源MAC地址,适用于:PREROUTING,FORWORD,INPUT chains
  • string扩展:对报文中的应用层数据做字符串模式匹配
  • time扩展:(centos8 有问题)根据将报文到达的时间与指定的时间范围进行匹配
  • connlimit扩展:根据每客户端IP做并发连接数数量匹配,可以防止DOS
  • limit扩展:基于收发报文的速率做匹配,令牌桶过滤器
  • state扩展:可以根据“连接追踪机制”去检查连接的状态,较好资源
范例:
[root@rocky8 ~]# iptables -A INPUT -s 10.0.0.28 -p tcp -m multiport --dports 445,139 -j ACCEPT 
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1064 packets, 72410 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.0.0.28            0.0.0.0/0            multiport dports 445,139

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1113 packets, 96009 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# iptables -A INPUT -d 10.0.0.28 -p tcp -m iprange --src-range 10.0.0.38-10.0.0.68 -j ACCEPT 
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1354 packets, 91498 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.0.0.28            0.0.0.0/0            multiport dports 445,139
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.0.0.28            source IP range 10.0.0.38-10.0.0.68

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1299 packets, 112K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1537 packets, 102K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.0.0.28            0.0.0.0/0            multiport dports 445,139
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.0.0.28            source IP range 10.0.0.38-10.0.0.68
    0     0 ACCEPT     all  --  *      *       10.0.0.100           0.0.0.0/0            MAC 00:50:56:12:34:56

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1394 packets, 120K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rocky8 ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo kmp --from 62 --string "google" -j REJECT
[root@rocky8 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1956 packets, 129K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.0.0.28            0.0.0.0/0            multiport dports 445,139
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.0.0.28            source IP range 10.0.0.38-10.0.0.68
    0     0 ACCEPT     all  --  *      *       10.0.0.100           0.0.0.0/0            MAC 00:50:56:12:34:56

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1661 packets, 142K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 STRING match  "google" ALGO name kmp FROM 62 reject-with icmp-port-unreachable

(4)iptables规则优化

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

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

  • 持久保存规则:
    CentOS7,8 :iptables-save > /PATH/TO/SOME_RULES_FILE
    CentOS6: service iptables save

  • 加载规则:
    CentOS7,8:iptables-restore < /PATH/FROM/SOME_RULES_FILE
    CentOS6:service iptables restart

iptables-restore选项
-n 不清除原有规则
-t 仅分析生成规则集,但不提交

  • 开机自动重载规则
    用脚本保存各个iptables命令;让此脚本开机后自动运行 在/etc/rc.d/rc.local文件中添加脚本路径/PATH/TO/SOME_SCRIPT_FILE
    用规则文件保存各个规则,开机时自动在如此规则文件中的规则 在/etc/rc.d/rc.local文件添加 iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
    安装iptables-services实现iptables.service
范例:CentOS7,8S使用iptables-service
[root@rocky8 ~]# yum -y install iptables-services
#保存现在的规则到文件中方法1
[root@rocky8 ~]# /user/libexec/iptables/iptables.init save
#保存现在的规则到文件中方法2
[root@rocky8 ~]# iptables-save > /etc/sysconfig/iptables
#开机启动
[root@rocky8 ~]# systemctl enable iptables.service
[root@rocky8 ~]# systemctl mask firewall.service nftables.service

(6)NAT转换原理
NAT是一种网络通信协议,用于在不同网络之间转换IP地址。其主要功能是将私有IP地址转换为公共IP地址,以实现内部网络与外部网络的通信。
NAT转换的原理如下:

  • 内部网络与外部网络通信:当内部网络中的设备(例如计算机、手机等)需要与外部网络通信时,它们使用私有IP地址(如192.168.x.x或10.x.x.x)作为源IP地址。
  • NAT设备:在内部网络与外部网络之间,存在一个NAT设备(通常是路由器或防火墙)。NAT设备有两个网络接口,一个连接内部网络,一个连接外部网络。
  • 转换表:NAT设备维护一个转换表,记录内部网络设备的私有IP地址与对应的公共IP地址的映射关系。
  • 地址转换:当内部网络设备发送数据包到外部网络时,NAT设备会检查数据包的源IP地址,并在转换表中查找对应的公共IP地址。
  • 端口转换:除了IP地址转换外,NAT设备还会进行端口转换。由于内部网络中的多个设备可能使用相同的私有IP地址,NAT设备会使用不同的端口号来区分这些设备。
  • 数据包转发:NAT设备将转换后的数据包发送到外部网络,目标设备收到数据包后,会将响应数据包发送到NAT设备。
  • 响应数据包转换:当外部网络设备发送响应数据包时,NAT设备会根据转换表将目标IP地址转换为内部网络设备的私有IP地址,并将数据包转发到内部网络。

(7)SNAT
SNAT基于nat表的target,使用于固定的公网IP
选项:
–to-source [ipaddr[ipaddr]][:port[port]]
–random
命令格式:iptables -t nat -A POSTROUTING -s Localnet -j SNAT --to[-source] ExtIP
注意:需要开启ip_forward

(8)DNAT
DNAT:nat表的target,适用于端口映射,即可重定向到本机,也可以支持从定向至不同主机的不同端口,但不支持多目标,既不支持负载均衡功能
选项:
–to-destination [ipaddr[ipaddr]][:port[-port]]
格式:
iptables -t nat -A PERROUTING -d ExtIP -p tcp|udp --dport PORT -j DNST --to-destination InterseverIP[:PORT]
注意:需要开启ip_forward

(9)REDIRECT
REDIRECT,是NAT表的 target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口,可用于PREROUTING OUTPUT链
选项:
–to-port port[-port]
命令:iptables -t nat -A PREROUTING -d 10.0.0.0 -p tcp --dport 80 -j REDIRECT --to-ports 8080
注意:无需开启ip_forward

3.综合案例:私有网络与公网的互相通讯

利用原理:DNAT/SNAT转换,REDIRECT转发 90重定向80

在这里插入图片描述

#第一步实现SNAT
#在firewall上(IP 10.0.0.28/192.168.0.10)
[root@rocky8 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@rocky8 ~]# sysctl -p
[root@rocky8 ~]# iptables -t nat -A POSTROUTING -s 10.0.0.38/24 -j SNAT --tosource 192.168.0.8
[root@rocky8 ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
[root@rocky8 ~]# 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         
    1    92 SNAT       all  --  *      *       10.0.0.0/24          0.0.0.0/0            to:192.168.0.10
    0     0 MASQUERADE  all  --  *      *       10.0.0.0/24          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
#在内外可以访问外网(IP 10.0.0.38)
[root@rocky8 ~]# curl 192.168.0.8/m49.html
www.192.168.0.8.com
#实现DNAT
#在防火墙上(IP 10.0.0.28/192.168.0.10)
[root@rocky8 ~]# iptables -t nat -A PREROUTING -d 192.168.0.10 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.38:80
[root@rocky8 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   120 DNAT       tcp  --  *      *       0.0.0.0/0            192.168.0.10         tcp dpt:80 to:10.0.0.38:80

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         
   43  2700 SNAT       all  --  *      *       10.0.0.0/24          0.0.0.0/0            to:192.168.0.10
#在外网上(IP 192.168.0.8)
[root@rocky8 ~]# curl 192.168.0.10/m49.html
www.10.0.0.38.com
#实现REDIRECT转发90-80
#在内网上(IP 10.0.0.38)
[root@rocky8 ~]# iptables -t nat -A PREROUTING -p tcp --dport 90 -j REDIRECT --to-ports 80
[root@rocky8 ~]# iptables -t nat -nvL
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

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         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

4.firewalld

(1)firewalld zone 分类

zone名称默认配置
trusted允许所有流量
home拒绝除和传出流量相关的,以及ssh,mdsn,ipp-cliedt,samba-client,dhcpv6-client预定义服务之外其他所有传入流量
internal和home相同
work拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量
public拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于public zone
external拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。
dmz拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量
block拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量
drop拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应)

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

[root@rocky8 ~]# nft add table inet filter
[root@rocky8 ~]# nft add chain inet filter input { type filter hook input priority 0 \; }
[root@rocky8 ~]# nft add rule inet filter input iifname "eth0" ip saddr 10.0.0.38 tcp dport { 80, 443, 22 } counter accept
[root@rocky8 ~]# nft list ruleset > /etc/nftables.conf
[root@rocky8 ~]# nft list table inet filter
table inet filter {
	chain input {
		type filter hook input priority filter; policy accept;
		iifname "eth0" ip saddr 10.0.0.38 tcp dport { 22, 80, 443 } counter packets 0 bytes 0 accept
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值