Linux的常用服务搭建

SSH

  • SSH 为 Secure Shell 的缩写,是建立在应用层基础上的安全协议。SSH 是较为可靠的专为远程登录会话和其他网络服务提供安全性的协议。利用用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

  • OpenSSH 服务是 SSH 协议的免费开源实现,可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如 telnet(终端仿真协议)、 rdp ftp、 rlogin、rsh 都是极为不安全的,并且会使用明文传送密码。OpenSSH 提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务。

  • 通过使用 SSH,你可以把所有传输的数据进行加密,这样可以较好地抑制"中间人"这种攻击,也可能够防御 DNS 欺骗和 IP 欺骗。

  • 使用 SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。

SSH连接

`ssh 用户名@IP地址`

scp(文件传输)

scp 命令:将本机文件复制到远程服务器上(上传)

命令格式:scp 【本地文件路径】 [username]@[主机IP]:[拷贝的目录]

将远程服务器上的文件复制到本机(下载)

命令格式:scp [username]@[主机地址]:[服务器上文件路径] [本地文件路径]

下载和上传由命令的顺序决定 , 一般上左边是上传路径 , 右边是下载路径

  • 有特殊端口要求的需要 -p 指定端口

scp -P 2222 [username]@[主机地址]:/usr/local/sin.sh /home/administrator

安装openSSH

centos默认安装

dnf list |grep openssh
openssh-clients.x86_64      #客户端
openssh-server.x86_64       #服务端
openssh-askpass.x86_64      #交互式访问

服务的相关设置

systemctl status sshd.service    #查看ssh状态
systemctl start sshd.service     #启动ssh服务
systemctl stop sshd.service      #停止ssh服务

配置公私钥认证

ssh 服务主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录。

密码体系从加密和解密方面来分类的话,可以分为对称加密和非对称加密。

  • 对称加密:加密和解密使用的密钥是同一个。
  • 非对称加密:加密和解密使用的密钥是不同的,采用两个密钥。
    • 对称加密解密的速度比较快,非对称加密和解密花费的时间长、速度相对较慢。
  • 对称加密的安全性相对较低,非对称加密的安全性较高。

公私钥体系既是常见的非对称加密,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密。其特性为:

  • 一个公钥对应一个私钥。
  • 密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
  • 如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
  • 如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。

ssh 服务通过密码进行登录,主要流程为:

  1. 客户端连接上服务器之后,服务器把自己的公钥传给客户端
  2. 客户端输入服务器密码通过公钥加密之后传给服务器
  3. 服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录

linux 下可以用 ssh-keygen 命令生成公钥/私钥对。

openssh 配置文件与加固

  1. 修改端口号

config地址 /etc/ssh/sshd_config

# port=22  -->  port=2222
  1. 配置日志文件

config地址 /etc/ssh/sshd_config

#SyslogFacility AUTH
SyslogFacility   AUTHPRIV
LogLevel INFO

重启服务

SyslogFacility AUTHPRIV 表示当有人使用 ssh 登录系统时,ssh 会记录信息,记录类型为 AUTHPRIV。 #LogLevel INFO表示设置记录 sshd 日志信息的级别。

SyslogFacility 一项,规定了服务日志的性质,也规定了服务日志存储的默认路径。

如:AUTHPRIV 表达了日志记录的是包含敏感信息的用户身份验证消息,默认存储于 /var/log/secure

AUTH 则表达了日志记录的是不包含敏感信息的用户身份验证消息,同样默认存储于 /var/log/secure

ssh 配置文件的这一字段一般是不需要修改的。在 LInux 系统的其他服务配置文件中,你可能会遇见 SyslogFacility 设置为其他状态的情况,可以通过下表了解其含义。

linuxSSH1.png

#LogLevel INFO 表示设置记录 sshd 日志信息的级别。可以理解为设置了日志的详细程度。

INFO 级别代表了日志会报告大部分有用信息,是较为详细的日志等级,除此外,还有其他等级:

linuxSSH2.png

  1. 禁止root登录

config地址 /etc/ssh/sshd_config

相关配置:

PermitRootLogin no

  1. 配置长时间无人操作自动断开ssh连接
LoginGraceTime 2m
PermitEmptyPasswords no

约在配置文件 40 行的 #LoginGraceTime 2m,设置了指定时间内没有成功登录,将会断开连接,若无单位则默认时间为秒。
默认为 2 分钟,如需调整可取消注释,调整为自己想要设定的值。

配置文件 : /etc/profile

export TMOUT=10      #单位是秒

执行 source /etc/profile 命令,使配置文件生效。

  1. ssh访问速度慢

vi /etc/ssh/sshd_config

GSSAPIAuthentication no      #关闭GSSAPI认证
UseDNS no                    #关闭DNS解析
  • 一般 SSH 依次进行的认证方法的是 publickey, gssapi-keyex, gssapi-with-mic, password。
  • 一般用户只使用 password 认证方式,但前面 3 个认证过程系统还是会尝试,这就浪费时间了,也就造成 SSH 登录慢。
  • GSSAPI 主要是基于 Kerberos 的,因此要解决这个问题也就变成要系统配置有 Kerberos, 一般用户是没有配置 Kerberos 的。
  1. 启动密码策略

修改两个配置文件

该操作是系统全局设置

  • vi /etc/login.defs
PASS_MAX_DAYS 99      #密码99天过期
PASS_MIN_DAYS  1      #修改密码最小间隔为1天
PASS_MIN_LEN   8      #密码最短长度为8
PASS_WARN_AGE  1      #密码过期前1天内通知用户
  • etc/security/pwquality.conf
# "N" 处应填写数字
minlen=N              #定义用户密码的最小长度; 
minclass=N            #定义密码必须满足同时有几种字符;
maxrepeat=N           #定义密码中允许几个连续相同的字符;    
maxclassrepeat=N      #定义用户密码连续字符的最大数目;
lcredit=N             #定义用户密码中必须包含多少个小写字母;
ucredit=N             #定义用户密码中必须包含多少个大写字母;1
dcredit=N             #定义用户密码中必须包含多少个数字;1
ocredit=N             #定义用户密码中必须包含多少个特殊字符(除数字、字母之外);其中 = 1表示,至少有一个



DNSmasq

域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记能够被机器直接读取的 IP 数串。通过主机名,最终得到该主机名对应的 IP 地址的过程叫做域名解析(或主机名解析)。

DNS 协议运行在 UDP 协议之上,使用端口号 53。关于 UDP 协议与 TCP 协议。

DNS 服务器体系的架构可以看做是一种分布式集群。各个 DNS 服务器间采取分布式的层次数据库模式以及缓存方法来存储和交换数据。

DNS解析流程

以下是在电脑浏览器中输入网址后发生的事情:

  1. 在浏览器中输入 www.qq.com 域名,操作系统会先检查自己本地的 hosts 文件是否有这个网址映射关系,如果有,就先调用这个 IP 地址映射,完成域名解析。(Hosts 文件记录了一些常用的网址域名与其对应的 IP 地的关联,可以自己编辑,kali 中存在于/etc/hosts。)
  2. 如果 hosts 里没有这个域名的映射,则查找本地 DNS 解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
  3. 如果 hosts 与本地 DNS 解析器缓存都没有相应的网址映射关系,首先会找 TCP/IP 参数中设置的首选 DNS 服务器,在此我们叫它本地 DNS 服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
  4. 如果要查询的域名,不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。
  5. 如果本地 DNS 服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地 DNS 就把请求发至 “根 DNS 服务器”,“根 DNS 服务器”收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。
  6. 本地 DNS 服务器收到 IP 信息后,将会联系负责.com 域的这台服务器。这台负责.com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com 域的下一级 DNS 服务器地址(qq.com)给本地 DNS 服务器。当本地 DNS 服务器收到这个地址后,就会找 qq.com 域服务器,重复上面的动作,进行查询,直至找到 www.qq.com 主机。
  7. 如果用的是转发模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。
  8. 不管是本地 DNS 服务器用是是转发,还是根提示,最后都是把结果返回给本地 DNS 服务器,由此 DNS 服务器再返回给客户机。
    linuxDNS1.png

DNS的查询方式

DNS 服务器集群做域名解析的时候,会产生两种查询方式,递归查询与迭代查询。

递归查询

主机向本地域名服务器的查询一般都是采用递归查询。

所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。

因此,递归查询返回的查询结果或者是所要查询的 IP 地址,或者是报错,表示无法查询到所需的 IP 地址。

迭代查询

本地域名服务器向根域名服务器的查询的迭代查询。

迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。

根域名服务器通常是把自己知道的顶级域名服务器的 IP 地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。

顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的 IP 地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。

最后,知道了所要解析的 IP 地址或报错,然后把这个结果返回给发起查询的主机

linuxDNS2.png

dnsmasq入门

dnsmasq 服务提供 DNS 缓存和 DHCP 服务功能。 作为域名解析服务器(DNS),dnsmasq 可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。 作为 DHCP 服 务器,dnsmasq 可以为局域网电脑提供内网 ip 地址和路由。 DNS 和 DHCP 两个功能可以同时或分别单独实现。 dnsmasq 轻量且易配置,此外它还 自带了一个 PXE 服务器以及对邮件服务器的 mx 记录的支持,jabber 的 srv 记录的支持等。它提供了 DNS 功能和可选择的 DHCP 功能可以取代 dhcpd 服务和 bind 等服务,配置起来更简单,更适用于虚拟化和大数据环境的部署。

dnsmasq配置文件是 /etc/dnsmasq.conf,在它的配件文件中的注释已经给出了非常详细的解释。

dnsmasq 的默认的配置文件中有许多选项,而且在设置上有很当灵活。dns 与 dhcp 的许多功能它都具备。它可服务于那些只在本地适用的域名,这些域名是不会在全球 DNS 服务器中出现的(私有域名)。DHCP 服务器和 DNS 服务器结合,并且允许 DHCP 分配的地址能在 DNS 中正常解析,而这些 DHCP 分配的地址和相 关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq 支持静态和动态两种 DHCP 配置方式。

一般情况下,我们可以用 bind 解决 dns 的问题,dhcpd 解决 dhcp 的问题,可用 dnsmasq 解决下面的一些维护问题:

局域网有很多机器希望使用一致的 hosts 文件,你需要经常维护这份列表。
你希望局域网的人访问某个域名时,拦截下来到指定的 ip,做缓存节省带宽或者其它用途都可以。优先使用本地自定义 dns。
阻止对某个域名的正常解析

安装dnsmasq ``

查看状态
systemctl status/stop/start/restart dnsmasq

dnsmasq 的配置文件

dnsmasq 服务对应的三个配置文件:

/etc/dnsmasq.conf    #主配置文件
/etc/hosts           #本地映射文件
/etc/resolv.conf     #域名配置文件

dnsmasq 能够缓存外部 DNS 记录,同时提供本地 DNS 解析或者作为外部 DNS 的代理, 即 dnsmasq 会首先查找 /etc/hosts 等本地解析文件,然后再查找 /etc/resolv.conf 等外部 nameserver 配置文件中定义的外部 DNS。所以说 dnsmasq 是一个 DNS 中继。DNS 配置同样写入 dnsmasq.conf 配置文件里。

同时在/etc/hosts 文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询hosts文件,这就等于将/etc/hosts 共享给全内网机器使用,从而解决内网机器互相识别的问题,比如像 hadoop 添加 datanode 节点 时。相比逐台机器编辑 hosts 文件或者添加Bind记录,仅需要编辑一个/etc/hosts文件。

配置文件

/etc/hosts 文件: hosts 文件包含了 ip 地址和主机名之间的映射,包括主机名的别名,在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的 ip 地址,否则就需要使用 DNS 服务程序来解决。通常可以将常用的域名和 ip 地址映射加入到 hosts 文件中,实现快速方便的访问 每行可以是两部分,即网络 ip 地址和主机名。主机名和域名的区别在于,主机名通常在局域网内使用,通过hosts文件,主机名就被解析到对应 ip 解析顺序:浏览器 DNS 缓存-> 本地计算机 HOSTS 文件-> 本地系统 DNS 缓存->DNS 服务器

对于检查的顺序可以通过 systemd-resolve 完成一个简单的测试。(systemd-resolved.service 用于运行 DNS 查询和维护 DNS 缓存。)

systemctl start systemd-resolved       #kali中启动服务
systemd-resolve --flush-cache          #清除主机中DNS的缓存
systemd-resolve --statistics           #查看dns缓存的数量,主要关注Current Cache Size是否为0
systemd-resolve www.baidu.com          #使用工具解析域名

常见的dns解析

A       #地址记录(直接查询默认类型)
AAAA    #地址记录
AFSDB   #Andrew文件系统数据库服务器记录
ATMA    #ATM地址记录
CNAME   #别名记录
HINFO   #硬件配置记录,包括CPU、操作系统信息
ISDN    #域名对应的ISDN号码
MB      #存放指定邮箱的服务器
MG      #邮件组记录
MINFO   #邮件组和邮箱的信息记录
MR      #改名的邮箱记录
MX      #邮件服务器记录
NS      #名字服务器记录
PTR     #反向记录
RP      #负责人记录
RT      #路由穿透记录
SRV     #TCP服务器信息记录
TXT     #域名对应的文本信息
X25     #域名对应的X.25地址记录

Apache

安装并设置开机自启

dnf -y install httpd
systemctl start httpd
systemctl enable httpd

随后我们通过客户机的浏览器打开,如果能看到 Apache 的默认页面,说明安装成功。

配置文件

Apache的主要目录

/etc/httpd/conf/httpd.conf   #apache的主配置文件
/etc/httpd/                  #apache配置文件的目录
/var/www/                    #apache默认存放网页的目录

/etc/httpd/conf/httpd.conf 文件详解:

34  ServerRoot "/etc/httpd"                   #定义Apache的配置文件目录
45  Listen 80                                 #定义Apache的端口
69  User apache                               #定义启动用户
70  Group apache                              #定义启动用户组
89  ServerAdmin root@localhost                #定义管理员邮箱
98  #ServerName www.example.com:80            #定义服务器的域名
122 DocumentRoot "/var/www/html"              #定义网页目录
167 DirectoryIndex index.html                 #定义默认首页文件

一 Firewalld

1 firewalld简介

防火墙主要用于保护一个网络区域免受来自另一个网络区域的网络攻击和网络入侵行为。因其隔离、防守的属性,灵活应用于网络边界、子网隔离等位置,具体如企业网络出口、大型网络内部子网隔离、数据中心边界等等。

Firewalld提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。

2 firewalld服务控制

firewalld在EL7之后系列已默认安装

firewalld服务的启动与关闭一般涉及到如下命令:

systemctl start firewalld            #启动firewalld服务
systemctl stop 	firewalld            #关闭firewalld服务
systemctl restart firewalld          #重启firewalld服务
systemctl status  firewalld          #查看firewalld服务状态
firewall-cmd --state                 #查看firewalld服务状态
systemctl disable firewalld          #firewalld开机自动关闭
systemctl enable  firewalld          #firewalld开机自动开启

注意:其中systemctl status firewalldfirewall-cmd --state都是查看firewalld的状态,两则区别在于systemctl status firewalld是查看服务启动详情,如出服务运行出现问题可以使用此命令进行查看,而firewall-cmd --state只是查看firewalld是否运行。

3 Firewalld 区域(zone)

firewalld加入了区域概念,区域可以理解为一个信赖等级,将一些配置好策略的模板划分为9种,每个模板的规则都不相同,同样每个模板中的过滤强度也不一样。每个区域除默认的规则,也可以添加或者修改删除实际环境所需要的规则。

firewalld区域默认有9种,以下对各个默认配置进行简单的解释以供参考:

区域默认配置介绍
trusted允许所有的数据包进出
home专门用于家庭环境,仅接收ssh、mdns、ipp-client、samba-client与dhcpv6-client等服务流量
Internal只有通过被允许的连接,和home区域一样。
work定义内部网络,仅接收ssh、ipp-client与dhcpv6-client等服务流量。
public只接受那些被允许的连接,默认只允许 ssh 和 dhcpv6-client,这个也是默认区域。
external相当于路由器的启用伪装(masquerading)选项。只有指定被允许的连接会被接受,默认只有SSH
dmz仅接受ssh服务连接
block拒绝所有网络连接
drop拒接所有的网络连接,并且所有数据包都给丢弃,没有任何回复。

在Linux中,可通过如下的指令进行查看各个不同zone的区别

firewall-cmd --list-all-zones

4.Firewalld常用命令介绍及规则配置

4.1 查看firewalld服务版本以及查看帮助文档

firewall-cmd --version   #查看firewalld版本
firewall-cmd --help 	 #查看firewall-cmd用法
man firewall-cmd         #查看帮助手册

4.2 更新并加载firewalld的配置

firewall-cmd --reload           #重新载入防火墙配置,当前连接不中断
firewall-cmd --complete-reload 	#重新载入防火墙配置,当前连接中断

4.3 查看区域详情及指定默认区域等相关命令

firewall-cmd --get-zones                              #查看所有区域
firewall-cmd --list-all-zones                         #列出所有区域的所有配置
firewall-cmd --get-active-zones                       #查看默认区域,并显示分配给它们的接口列表
firewall-cmd --get-default-zone                       #查看默认是哪个区域
firewall-cmd --list-all                               #查看默认区域的所有配置
firewall-cmd --set-default-zone=public                #设定默认区域
firewall-cmd --zone=work --list-all                   #列出指定域的所有配置
firewall-cmd --get-zone-of-interface=enp0s3           #查看指定接口所属区域

4.4 拒绝及允许所有入站请求包,并查看是否拒绝

firewall-cmd --query-panic    #查看是否拒绝
firewall-cmd --panic-on       #拒绝所有包
firewall-cmd --panic-off      #取消拒绝状态

4.5 添加及删除服务,并且查看区域预设服务及某个区域加载的服务

firewall-cmd --get-services                             #查看所有区域预设服务
firewall-cmd --add-service=http                         #在默认区域下添加http服务
firewall-cmd --remove-service=http                      #在默认区域下删除http服务
firewall-cmd --list-services                            #查看默认区域加载了哪些服务
firewall-cmd --zone=work --add-service=http             #在指定的区域中添加了http服务
firewall-cmd --zone=work --remove-service=http          #在指定的区域中删除了https服务
firewall-cmd --zone=work --list-services                #查看指定区域中加载了哪些服务

4.6 添加及删除某个端口并且查看默认区域或者指定区域加载了哪些端口

firewall-cmd --add-port=445/tcp                     #在默认区域下添加445/tcp端口
firewall-cmd --remove-port=445/tcp                  #在默认区域下添加445/tcp端口
firewall-cmd --list-ports                           #查看默认区域加载的端口
firewall-cmd --zone=work --add-port=445/tcp         #在指定区域下添加445/tcp端口
firewall-cmd --zone=work --remove-port=445/tcp      #在指定去下删除445/tcp端口
firewall-cmd --zone=work --list-ports               #查看指定区域加载的端口
firewall-cmd --zone=work --add-port=3000-4000/tcp   #在指定区域中批量添加端口

4.7 禁止某ip或网段进行访问(黑名单)

firewall-cmd --zone=block --add-source=192.168.10.62            #禁止某个IP访问
firewall-cmd --zone=block --add-source=192.168.10.0/24          #禁止某个网段访问
firewall-cmd --zone=drop  --add-source=192.168.10.62            #禁止某个IP访问,并且丢弃所有数据包
firewall-cmd --zone=block --add-source=b0:6e:bf:c8:0b:bc        #禁止某个MAC地址访问

4.8 runtime-to-permanent属性

 firewalld的一大特性是就是规则可以动态更新,在输入所有更新规则的命令后都会及时生效,但是更新的规则只是临时生效并不会永久保存,只需要重启服务或者系统就可以恢复到原来的配置。

而runtime-to-permanent属性,它可以让在更新规则后永久保存,但是不会及时生效,需要执行firewall-cmd --reload命令手动加载,而firewall-cmd --reload命是动态加载也可以理解为在线更新,并不会断开连接重新启动。

runtime-to-permanent属性使用方法:

firewall-cmd --permanent <other options>

永久添加http服务到public区域:firewall-cmd --permanent --zone=public --add-service=http

此时http并未添加成功,需要进行手动加载:firewall-cmd --reload

5.Rich rule

5.1 rich rule简介

当基本firewalld语法规则不能满足要求时,可以使用rich-rules 富规则,功能强,表达性语言 rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率。

基本语法:	
语法解释
--add-rich-rule=’rule’##新建rich规则
--remove-rich-rule=’rule’##删除rich规则
--query-rich-rule=’rule’##查看单条rich规则
--list-rich-rules##查看rich规则列表

5.2 rich rule常用配置

5.2.1 利用rich rule设置禁止ping响应

firewall-cmd --add-rich-rule='rule protocol value=icmp drop'       #设置所有icmp协议请求都给丢弃
firewall-cmd --remove-rich-rule='rule protocol value=icmp drop'    #删除上条规则

5.2.2 利用rich rule设置拒绝或者允许某个IP、IP段访问某个服务或者端口

#拒绝个IP访问ssh
firewall-cmd --add-rich-rule='rule family="ipv4" source address=192.168.10.62 service name="ssh" reject'
#丢弃某个ip访问ssh的数据包
firewall-cmd --add-rich-rule='rule family="ipv4" source address=192.168.10.62 service name="ssh" dorp'
#允许某个IP访问ssh
firewall-cmd --add-rich-rule='rule family="ipv4" source address=192.168.10.62 service name="ssh" accept'

#拒绝某个IP访问22端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address=192.168.10.62 port port=22 protocol=tcp reject'
#丢弃某个IP访问22端口的数据包
firewall-cmd --add-rich-rule='rule family="ipv4" source address=192.168.10.62 port port=22 protocol=tcp dorp'
#允许某个IP访问22端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address=192.168.10.62 port port=22 protocol=tcp accept'

#如果要配置IP段,在address= 添加如:192.168.10.0/24

5.2.3 利用rich rule设置某条IP可以通过防火墙或者允许某个IP仅能通过指定端口访问到本机

#允许某条IP通过防火墙访问本机
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.10.62" accept'
#允许某个IP通过(3000-4000)端口访问到本机
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.10.62" destination address="127.0.0.1" port port="3000-4000" protocol="tcp" accept'

6. ipset

6.1 ipset简介

 当防火墙需要处理的IP、端口、MAC等比较复制且数量庞大时,可以使用ipset来进行处理。

 ipset可以存储多个IP地址或端口号,且在不影响性能的同时可以对IP或者端口等进行动态更新。

6.2 ipset使用

6.2.1 查看ipset都支持哪些类型,新建一个set并且指定类型。

创建的set在/etc/firewalld/ipsets目录生成了一个XML文件,这是对应set存储文件。

firewall-cmd --get-ipset-types                             #查看ipset支持类型
firewall-cmd --permanent --new-ipset=test1 --type=hash:ip  #新建一个set命名为test1,并且指定类型
firewall-cmd --permanent --delete-ipset=test1              #删除一个set

6.2.2 在set中添加及删除ip

firewall-cmd --permanent --ipset=test1 --add-entry=192.168.10.62          #在set中添加IP
firewall-cmd --permanent --ipset=test1 --add-entry=192.168.10.10-100      #在set中批量添加IP

在set中添加ip,并且查看是否添加成功:firewall-cmd --permanent --ipset=test1 --add-entry=192.168.10.16more /etc/firewalld/ipsets/test1.xml

删除set中的IP:firewall-cmd --permanent --ipset=test1 --remove-entry=192.168.10.62

6.2.3 打印一个set的路径以及set的内容

firewall-cmd --permanent --path-ipset=test1                     #打印set的路径
firewall-cmd --permanent --info-ipset=test1                     #打印set的内容
firewall-cmd --permanent --ipset=test1 --get-entries            #打印set中所有的entry
firewall-cmd --permanent --ipset=test1 --query-entry=8.8.8.8	#判断一个IP,set中是否存在
firewall-cmd --permanent --get-ipsets                           #列出所有set

6.2.4 结合脚本使用IPset

以登录失败的ip为例,把登录失败的IP存放至ipset中。

#!/bin/bash
for LINE in `grep -i 'Failed password' /var/log/secure | awk '{print $11}' | sort -n | uniq -c | sort -k1nr | awk '{if ($1>3) print $2}'`; do
    echo "${LINE}";
    firewall-cmd --permanent --ipset=test1 --add-entry="${LINE}";
done;
firewall-cmd --reload;

6.2.5 使ipset中的ip禁止访问

firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset="test1" drop'
firewall-cmd --reload

7.利用firewalld进行端口转发及IP伪装

端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。

转发的目的如果不指定ip的话就默认为本机。如果指定了ip却没指定端口,则默认使用来源端口。

# 将5555端口的流量转发至22端口。
firewall-cmd --add-forward-port=port=5555:proto=tcp:toport=22

# 将ssh的流量请求,直接转发给指定的ip地址。如果未指定端口,会默认访问这个ip地址的22端口。
firewall-cmd --add-forward-port=port=5555:proto=tcp:toaddr=192.168.10.84:toport=22

利用firewalld的端口转发功能,使C通过A的5555端口登录到B的ssh服务,需要使用到以下命令:

# 检查是否允许伪装IP
firewall-cmd --query-masquerade 

# 禁止防火墙伪装IP
firewall-cmd --remove-masquerad

# 允许防火墙伪装IP
firewall-cmd --add-masquerade

# 将A的5555端口流量转发到B的22端口上
firewall-cmd --add-forward-port=port=5555:proto=tcp:toaddr=192.168.10.84:toport=22

如果需要使用将本机的端口流量转发至指定IP的端口上,需要开启firewalld的ip伪装功能,即masquerade功能。

区域中的masquerade显示状态为yes,表示开启。

使用C通过A的5555端口登录SSH,查看登录后的IP发现为B的IP,表示端口转发成功。

文章作者: cosh
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 cosh'blog
Linux
喜欢就支持一下吧