[Linux]Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewalld/iptables+chkconfig]

一 方案与思路

  • 0 xshell客户端监测是否能够ping通目标服务器。
    • 前提:知晓目标服务器IP地址
      • Linux: ifconfig -a
      • Windows: ipconfig -a
  • 1 利用firewall工具,检查是否已开启ssh的22端口。若无,则:开启22端口
  • 2 利用sshd工具,检查是否已开启sshd服务。若无,则:开启sshd服务
    • 开(重)启ssh服务: system (re)start sshd
  • 3 利用systemctl工具,检查是否已开启sshd、firewalld的开机自启服务。若无,则:开启sshd、firewalld服务的开机自启
    • systemctl enable sshd
    • systemctl list-unit-files | grep sshd
    • systemctl enable firewalld[.service]
    • systemctl list-unit-files | grep firewall

二 相关知识及操作命令

关键工具
ssh:客户端,主要进行服务器端的连接
sshd:服务端,作用于服务器端(开闭ssh服务等操作)
ssh————————————>sshd
client      serve
firewalld(防火墙)
firwall-cmd(Linux提供的操作firewall的一个工具)
systemctl(服务控制命令)

1 sshd

  • 查看服务状态

inactive(不可用),active(可用,活动状态)

systemctl status sshd
  • 列出已开启服务当前状态
systemctl list-units | grep <目标服务,例如:ssh>
或
netstat -antulp | grep ssh
  • 开启ssh服务
systemctl start sshd
  • 设定服务开机启动
systemctl enable sshd
  • 查看sshd开机自启服务是否已开启
systemctl list-unit-files | grep sshd
  • 关闭ssh服务
systemctl stop sshd
  • 设定服务开机不启动
systemctl disable sshd
  • 重启ssh服务
systemctl restart sshd
  • 重新加载服务配置
systemctl reload sshd

2 防火墙(firewalld/firewall-cmd)

防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用。
众所周知,相较于企业内网,外部的公网环境更加恶劣,罪恶丛生。
在公网与企业内网之间充当保护屏障的防火墙,虽然有软件或硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。
防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。
这样一来,就可以保证仅有合法的流量在企业内网和外部公网之间流动了。

2.0 防火墙基础篇: firewalld VS iptables

  • 1)在 RHEL7 / Centos7 里有几种【防火墙软件共存】:
  iptables (底层通过内核的netfilter来实现)
      在早期的Linux系统中,默认使用的是iptables防火墙管理服务来配置防火墙。
      尽管新型的firewalld防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用【iptables】。
      iptables是一款基于命令行的防火墙策略管理工具,具有大量参数,学习难度较大。
      好在对于日常的防火墙策略配置来讲,大家无需深入了解诸如“【四表五链】”的理论概念,只需要掌握常用的参数并做到灵活搭配即可,这就足以应对日常工作了。
      iptables命令可根据流量的【源地址】、【目的地址】、【传输协议】、【服务类型】等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。
      再次提醒: 防火墙策略规则的匹配顺序是从上至下的。因此,要把较为严格、优先级较高的策略规则放到前面,以免发生错误。

  FirewallD(底层通过内核的netfilter来实现; RedHat/CENTOS 7中新增的1款防火墙软件;默认是使用FirewallD来管理netfilter子系统)
      在RHEL 7系统中,firewalld防火墙取代了iptables防火墙。
      对于接触Linux系统比较早或学习过RHEL 6系统的读者来说,当他们发现曾经掌握的知识在RHEL 7中不再适用,需要全新学习firewalld时,难免会有抵触心理。
      其实,iptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。
      iptables服务会把配置好的防火墙策略交由内核层面的【netfilter网络过滤器】来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的【nftables包过滤框架】来处理。
      换句话说,当前在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。
      虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。
      只要在这多个防火墙管理工具中任选一款并将其学透,就足以满足日常的工作需求了。

  ebtables
  • 2)策略/规则与规则链
防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。
如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
  一般而言,【防火墙策略规则】的设置有两种:
    “通”(即 放行)
    “堵”(即 阻止)

如果防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;
如果防火墙的默认策略为允许时(通),就要设置拒绝规则(堵),否则谁都能进来,防火墙也就失去了防范的作用。
  • 3)iptables 服务
iptables服务把用于处理或过滤流量的【策略条目】称之为【规则】,多条规则可以组成一个【规则链】,而规则链则依据数据包处理位置的不同进行分类,具体如下:
  在进行路由选择前处理数据包(PREROUTING)
  处理流入的数据包(INPUT);
    一般来说,从【内网】向【外网】发送的流量一般都是可控且良性的。故:日常使用最多的就是【INPUT规则链】,该规则链可增大黑客人员从外网入侵内网的难度。
  处理流出的数据包(OUTPUT);
  处理转发的数据包(FORWARD);
  在进行路由选择后处理数据包(POSTROUTING)

举一个例子,让各位读者更直观地理解这两个拒绝动作的不同之处:
  有一天您正在家里看电视,突然听到有人敲门,您透过防盗门的猫眼一看是推销商品的,便会在不需要的情况下开门并拒绝他们(【REJECT】)。
  但如果您看到的是债主带了十几个小弟来讨债,此时不仅要拒绝开门,还要默不作声,伪装成自己不在家的样子(【DROP】)。

故:当把Linux系统中的防火墙策略设置为REJECT拒绝动作后,流量发送方会看到端口不可达的响应:

[root@johnnyzen ~]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
From 192.168.10.10 icmp_seq=1 Destination Port Unreachable
From 192.168.10.10 icmp_seq=2 Destination Port Unreachable
From 192.168.10.10 icmp_seq=3 Destination Port Unreachable
From 192.168.10.10 icmp_seq=4 Destination Port Unreachable
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3002ms

而把Linux系统中的防火墙策略修改成【DROP】拒绝动作后,流量发送方会看到响应超时的提醒。
但是流量发送方无法判断流量是被接收方主机拒绝,还是当前接收方主机不在线

[root@johnnyzen ~]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.

--- 192.168.10.10 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3000ms
  • 4) FirewallD 服务 即 Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器,是 iptables前端控制器,用于实现持久的网络流量规则。
    它提供命令行(CLI)和图形界面(GUI),在大多数 Linux 发行版的仓库中都有。
    与直接控制 iptables 相比,使用 FirewallD 有几个主要区别
[相同点]
  iptables、firewalld 的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter;只不过FirewallD和iptables的结构以及使用方法不一样罢了。

[不同点]
  相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了【区域(zone)】的概念。
      区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
      例如:我们有一台笔记本电脑,每天都要在办公室、咖啡厅和家里使用。按常理来讲,这三者的安全性按照由高到低的顺序来排列,应该是家庭、公司办公室、咖啡厅。
           当前,我们希望为这台笔记本电脑指定如下防火墙策略规则:在家中允许访问所有服务;在办公室内仅允许访问文件共享服务;在咖啡厅仅允许上网浏览。
      在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后只需轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。
  储存配置的位置。
    iptables 服务在 /etc/sysconfig/iptables 中储存配置。
      意味着:使用 iptables 时,每一个单独更改意味着清除所有旧有的规则,并从 /etc/sysconfig/iptables 里读取所有新的规则
    FirewallD 服务 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中 储存配置
      意味着:使用 firewalld 时,却不会再创建任何新的规则;仅仅运行规则中的不同,故:FirewallD 可在运行时改变设置而不丢失现行配置。

[优点] 
  Firewalld 使用区域和服务而不是链式规则。
  Firewalld 可动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
  
[缺点] 
  (注:刚安装好后iptables,建议执行此命令清除掉iptables的防火墙规则: iptables -F)

2.1 firewalld中常用的区域名称及策略规则

  • 1) Firewall的原理————【区域管理】: 通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:
trusted 允许所有的数据包
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量
public(默认值) 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关

上面的描述可能难以理解,再转述一下:

阻塞区域(block):任何传入的网络数据包都将被阻止。任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
  注:FirewallD的默认区域是public。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。

FirewallD默认提供了9个zone配置文件(/usr/lib/firewalld/zones/)block.xmlwork.xmlhome.xmlpublic.xmldmz.xmltrusted.xmldrop.xmlinternal.xmlexternal.xml

  • 2)FirewallD的配置方法主要有3种:
firewall-config (图形化工具,适合用于桌面版)

firewall-cmd (命令行工具)

直接编辑xml文件

2.2 终端管理工具(firewall-cmd)

firewall-cmdfirewalld防火墙配置管理工具的CLI(命令行界面)版本。
它的参数一般都是以“长格式”来提供的,大家不要一听到长格式就头大,因为RHEL 7系统支持部分命令的参数补齐,其中就包含这条命令(很酷吧)。
也就是说,现在除了能用Tab键自动补齐命令或文件名等内容之外,还可以用Tab键来补齐下表中所示的长格式参数了:

firewall-cmd (终端管理工具)
参数 作用
--get-default-zone 查询默认的区域名称
--set-default-zone=<区域名称> 设置默认的区域,使其永久生效
--get-zones 显示可用的区域
--get-services 显示预先定义的服务
--get-active-zones 显示当前正在使用的区域与网卡名称
--add-source= 将源自此IP或子网的流量导向指定的区域
--remove-source= 不再将源自此IP或子网的流量导向某个指定区域
--add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
--add-service=<服务名> 设置默认区域允许该服务的流量
--add-port=<端口号/协议> 设置默认区域允许该端口的流量
--remove-service=<服务名> 设置默认区域不再允许该服务的流量
--remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
--reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
--panic-on 开启应急状况模式
--panic-off 关闭应急状况模式

与Linux系统中其他的防火墙策略配置工具一样,使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。
如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效了。
但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。
如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

2.1 查看

  • 查看firewall服务状态
    (centos7)
[centos 7]
systemctl status firewalld
[centos 6/7]
service firewalld status
(如下是刚安装好并启动时的情况)
[johnny@node-a ~]$ sudo systemctl status firewalld -l
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-01-08 00:34:54 CST; 35s ago
     Docs: man:firewalld(1)
 Main PID: 4989 (firewalld)
    Tasks: 2
   CGroup: /system.slice/firewalld.service
           └─4989 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

Jan 08 00:34:53 node-a systemd[1]: Starting firewalld - dynamic firewall daemon...
Jan 08 00:34:54 node-a systemd[1]: Started firewalld - dynamic firewall daemon.
Jan 08 00:34:54 node-a firewalld[4989]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.
  • 查看防火墙状态
firewall-cmd --state 
  • 查看防火墙规则
firewall-cmd --list-all
  • 查询端口是否开放
firewall-cmd --query-port=8080/tcp
  • 查看软件版本
firewall-cmd --version
  • 查看帮助
firewall-cmd --help
  • 查看区域信息
firewall-cmd --get-active-zones

firewall-cmd --get-zone-of-interface=eth0
  // 查看指定接口所属区域

2.2 操纵

  • 开放端口

例如,80端口
--permanent:表示设置为持久;
--add-port:标识添加的端口;

firewall-cmd --permanent --add-port=80/tcp

--permanent:表示设置为持久

--add-port:标识添加的端口

  • 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
  • 更新/重新加载防火墙规则
firewall-cmd --reload
  //方式1: 无需断开连接

firewall-cmd --complete-reload
  //方式2: 需要断开连接,类似重启服务
  • 网口添加到指定的区域,默认接口都在public区域
firewall-cmd --zone=public --add-interface=eth0
  //注: 若想永久生效,再加上 --permanent ,然后 reload 防火墙

firewall-cmd --set-default-zone=public
  //设置默认接口区域(立即生效,无需重启)
  • 查看所有打开的端口
firewall-cmd --zone=dmz --list-ports
  • 加入一个指定端口指定区域
firewall-cmd --zone=dmz --add-port=8080/tcp
  • 开放1个服务
firewall-cmd --zone=work --add-service=smtp
  • 移除1个服务
firewall-cmd --zone=work --remove-service=smtp
  • 拒绝所有包、取消拒绝所有包、查看是否拒绝所有包
firewall-cmd --panic-on
  // 拒绝

firewall-cmd --panic-off
  // 取消拒绝

firewall-cmd --query-panic
  // 查看

2.3 启停

  • 开启
    (centos7)
service firewalld start
  • 关闭
service firewalld stop
  • 重启
    (centos7)
service firewalld restart
# 或者↓ 
firewall-cmd --reload 【重启防火墙(修改配置后,要重启防火墙)】
  • 启用/禁用 开机自启
systemctl enable/disable firewalld.service

2.4 安装

yum install firewalld firewall-config

3 防火墙(iptables)

3.1 安装

# 安装防火墙(iptables)
yum install iptables
  // CENTOS/REDHAT 安装 iptables cmd 
yum install iptables-services
  // CENTOS/REDHAT 安装 iptables service
  // 在CentOS7中,防火墙的管理是由firewalld.service来控制的,iptables.serivce是版本7以下的管理方式,故: CENTOS7中如需使用,需单独安装此服务,否则报: Unit iptables.service not loaded

apt-get install iptables 
  // Debian/Ubuntu

3.2 查看

# 查看防火墙状态
service iptables status

3.3 启停

# 停止防火墙
service iptables stop
# 启动防火墙
service iptables start
# 重启防火墙
service iptables restart

# 永久关闭防火墙 (停用开机自启)
chkconfig iptables off
# 永久关闭后重启 (启用 开机自启)
chkconfig iptables on

2.4 防火墙进阶篇: iptables中常用的参数以及作用

参数 作用
-P 设置默认策略
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号“!”表示除这个IP外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如TCP、UDP、ICMP
--dport num 匹配目标端口号
--sport num 匹配来源端口号
  • 查看已有的所有防火墙规则链

iptables -L -n
iptables -L

[root@johnnyzen ~]# iptables -L
(如下是CENTOS7.9中刚安装好firewalld服务、iptables服务,并停止firewalld,停止iptables时的默认配置)
[johnny@node-b ~]$ sudo iptables -L
[johnny@node-b ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc
[johnny@node-b ~]$ service   iptables status
Redirecting to /bin/systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

(如下是CENTOS7.9中刚安装好firewalld服务、iptables服务,并停止firewalld,启动iptables时的默认配置)
[johnny@node-b ~]$ service iptables start
Redirecting to /bin/systemctl start iptables.service
[johnny@node-b ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

(如下是CENTOS7.9中刚安装好firewalld、iptables,并启动firewalld,iptables时的默认配置)
[johnny@node-b ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
INPUT_direct  all  --  anywhere             anywhere            
INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
INPUT_ZONES  all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere             ctstate INVALID
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
FORWARD_direct  all  --  anywhere             anywhere            
FORWARD_IN_ZONES_SOURCE  all  --  anywhere             anywhere            
FORWARD_IN_ZONES  all  --  anywhere             anywhere            
FORWARD_OUT_ZONES_SOURCE  all  --  anywhere             anywhere            
FORWARD_OUT_ZONES  all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere             ctstate INVALID
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
OUTPUT_direct  all  --  anywhere             anywhere            

Chain FORWARD_IN_ZONES (1 references)
target     prot opt source               destination         
FWDI_public  all  --  anywhere             anywhere            [goto] 
FWDI_public  all  --  anywhere             anywhere            [goto] 

Chain FORWARD_IN_ZONES_SOURCE (1 references)
target     prot opt source               destination         

Chain FORWARD_OUT_ZONES (1 references)
target     prot opt source               destination         
FWDO_public  all  --  anywhere             anywhere            [goto] 
FWDO_public  all  --  anywhere             anywhere            [goto] 

Chain FORWARD_OUT_ZONES_SOURCE (1 references)
target     prot opt source               destination         

Chain FORWARD_direct (1 references)
target     prot opt source               destination         

Chain FWDI_public (2 references)
target     prot opt source               destination         
FWDI_public_log  all  --  anywhere             anywhere            
FWDI_public_deny  all  --  anywhere             anywhere            
FWDI_public_allow  all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            

Chain FWDI_public_allow (1 references)
target     prot opt source               destination         

Chain FWDI_public_deny (1 references)
target     prot opt source               destination         

Chain FWDI_public_log (1 references)
target     prot opt source               destination         

Chain FWDO_public (2 references)
target     prot opt source               destination         
FWDO_public_log  all  --  anywhere             anywhere            
FWDO_public_deny  all  --  anywhere             anywhere            
FWDO_public_allow  all  --  anywhere             anywhere            

Chain FWDO_public_allow (1 references)
target     prot opt source               destination         

Chain FWDO_public_deny (1 references)
target     prot opt source               destination         

Chain FWDO_public_log (1 references)
target     prot opt source               destination         

Chain INPUT_ZONES (1 references)
target     prot opt source               destination         
IN_public  all  --  anywhere             anywhere            [goto] 
IN_public  all  --  anywhere             anywhere            [goto] 

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination         

Chain INPUT_direct (1 references)
target     prot opt source               destination         

Chain IN_public (2 references)
target     prot opt source               destination         
IN_public_log  all  --  anywhere             anywhere            
IN_public_deny  all  --  anywhere             anywhere            
IN_public_allow  all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            

Chain IN_public_allow (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,UNTRACKED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http ctstate NEW,UNTRACKED

Chain IN_public_deny (1 references)
target     prot opt source               destination         

Chain IN_public_log (1 references)
target     prot opt source               destination         

Chain OUTPUT_direct (1 references)
target     prot opt source               destination         

v:显示详细信息,包括每条规则的匹配包数量和匹配字节数

x:在 v 的基础上,禁止自动单位换算(K、M)

n:只显示IP地址和端口号,不将ip解析为域名

  • 清空已有的所有防火墙规则链

iptables -F //全清掉了
iptables -X
iptables -Z

[root@johnnyzen ~]# iptables -F
[root@johnnyzen ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
………………省略部分输出信息………………
  • 把INPUT规则链的默认策略设置为拒绝

如前面所提到的防火墙策略设置无非有两种方式,一种是“通”,一种是“堵”.
当把INPUT链设置为默认拒绝后,就要往里面写入允许策略了,否则所有流入的数据包都会被默认拒绝掉。
故: 需要留意规则链的默认策略拒绝动作只能是DROP,而不能是REJECT

[root@johnnyzen ~]# iptables -P INPUT DROP
[root@johnnyzen ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination 
…………省略部分输出信息………………
  • 屏蔽 MAC
    按来源MAC地址匹配,拒绝转发来自该MAC地址的数据包.
iptables -t filter -A FORWARD -m --mac-source 00:02:b2:03:a5:f6 -j DROP
  • 屏蔽 IP(网段)
iptables -I INPUT -s 124.115.0.199 -j DROP //屏蔽124.115.0.199这个IP

iptables -I INPUT -s 124.115.0.0/16 -j DROP //屏蔽124.115.*.*这一网段段(124.115开头)的所有IP
iptables -I INPUT -s 61.37.80.0/24 -j DROP //屏蔽61.37.80.*这一网段段(61.37.80开头)的所有IP
iptables -I INPUT -s 124.0.0.0/8 -j DROP //屏蔽124.*.*.*这一网段段(124开头)的所有IP
  • 将1分钟内连续超过3次的SSH连接请求拒绝掉
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT --rcheck --seconds 60 --hitcount 3 -j DROP
  • 保存 规则

使用iptables命令配置的防火墙规则默认会在系统下一次重启时将失效,如果想让配置的防火墙策略永久生效,还要执行保存命令:

[root@linuxprobe ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]

//也可指定存储文件:  iptables-save > /etc/sysconfig/iptables
  • 开启/取消屏蔽 IP(网段)
    (只要把参数-I改为-D就好了)
iptables -D INPUT -s 124.0.0.0/8 -j DROP //取消屏蔽 124.*.*.*这一网段段(124开头)的所有IP 【取消 指定对满足条件包的执行DROP的规则】

iptables -D INPUT -s 124.0.0.0/8  -j REJECT //取消屏蔽 124.*.*.*这一网段段(124开头)的所有IP 【取消 指定对满足条件包的执行REJECT的规则】
  • 向INPUT规则链中添加拒绝所有人访问本机12345端口的策略规则
[root@johnnyzen ~]# iptables -I INPUT -p tcp --dport 12345 -j REJECT
[root@johnnyzen ~]# iptables -I INPUT -p udp --dport 12345 -j REJECT
[root@johnnyzen ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
………………省略部分输出信息………………
  • 将INPUT规则链设置为只允许指定网段的主机访问本机的指定端口,拒绝来自其他所有主机的流量 【重要操作】

防火墙策略规则是按照从上到下的顺序匹配的。故:一定要把允许动作放到拒绝动作前面,否则,所有的流量就将被拒绝掉,从而导致任何主机都无法访问目标服务。

[root@johnnyzen ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
[root@johnnyzen ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
[root@johnnyzen ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
………………省略部分输出信息………………
  • 只允许指定主机访问本机的指定端口,且拒绝来自其他主机的流量 【重要操作】
# step1 对node57开放 8080 端口
iptables -A INPUT -p tcp -s 10.3.109.57 --dport 8080 -j ACCEPT
	注: 多个ip之间用','分隔
[johnny@node-b ~]$ sudo iptables -F
[johnny@node-b ~]$ sudo iptables -A INPUT -p tcp -s 172.16.20.105 --dport 80 -j ACCEPT
[johnny@node-b ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  node-a               anywhere             tcp dpt:http
REJECT     tcp  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    


# step2 对所有IP禁止访问 8080 端口
iptables -A INPUT -p tcp --dport 8080 -j REJECT
[johnny@node-b ~]$ sudo iptables -A INPUT -p tcp --dport 80 -j REJECT
[johnny@node-b ~]$ iptables -nvL
iptables v1.4.21: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
[johnny@node-b ~]$ sudo iptables -nvL
[sudo] password for johnny: 
Chain INPUT (policy ACCEPT 125 packets, 163K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    8   587 ACCEPT     tcp  --  *      *       172.16.20.105        0.0.0.0/0            tcp dpt:80
    1    60 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable

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

Chain OUTPUT (policy ACCEPT 7 packets, 4243 bytes)
 pkts bytes target     prot opt in     out     source               destination    
[johnny@node-b ~]$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 80/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
(说明 iptables.service 与 firewalld.service 是相通的,均基于iptables.cmd、内核的netfilter)     
  • 向INPUT规则链中添加拒绝指定主机访问本机80端口(Web服务)的策略规则
[root@johnnyzen ~]# iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
[root@johnnyzen ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination 
REJECT tcp -- 192.168.10.5 anywhere tcp dpt:http reject-with icmp-port-unreachable
REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
………………省略部分输出信息………………
  • 向INPUT链中添加允许ICMP流量进入的策略规则

向防火墙的INPUT规则链中添加一条允许ICMP流量进入的策略规则就默认允许了ping命令的检测行为

[root@johnnyzen ~]# iptables -I INPUT -p icmp -j ACCEPT
[root@johnnyzen ~]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.156 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.117 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.099 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.090 ms
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.090/0.115/0.156/0.027 ms
  • 删除INPUT规则链中刚刚加入的那条策略(允许ICMP流量),并把默认策略设置为允许
[root@johnnyzen ~]# iptables -D INPUT 1
[root@johnnyzen ~]# iptables -P INPUT ACCEPT
[root@johnnyzen ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
………………省略部分输出信息………………

2.5 防火墙进阶篇: 四表五链

  • iptables的结构: 四表五链

参见
CentOS iptables防火墙的理解和使用 - 博客园
iptables工具__过滤包—命令... - CSDN

【四张表】:Raw追踪表——mangle修改表——nat地址转换——filter过滤表(默认表,常用)(四张表按优先级从高到低)  使用参数-t 表选择表

【五条链】:prerouting、input(常用)、forward、output、postrouting

在链前使用参数:
-P/--policy:新建链。定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
-L/--list:列出规则 
-A/--append:追加规则 
-D/--delete:删除规则 
-I/--insert:插入规则。插入一条规则,原本该位置(这里是位置1)上的规则将会往后移动一个顺位。
-R/--replace:替换规则 (取代现行规则,规则被取代后并不会改变顺序)
-N/--new-chain: 新增链。定义新的规则链

-F/--flush:删除规则。删除某规则链(这里是INPUT规则链)中的所有规则(Eg:  iptables -F INPUT)
-Z/--zero:清零 计数。将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
-X/--delete-chain:删除链

【过滤规则】:源IP -s、源PORT --sport / 目标IP -d、目标PORT --dport / 协议(tcp、udp、icmp)-p、状态--state / 数据流入接口,进网卡 -i、数据流出接口,出网卡-o

【执行动作】:-j :ACCEPT接受报、DROP丢弃报、REJECT丢弃报并通知对方、REDIRECT重定向包、MASQUERADE (改写源IP为防火墙ip)等

ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。

REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 例如:iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。 例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费......等。

RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。

MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

【加载其他过滤模块】 -m (state 状态(NEW、ESTABLISHED、RELATED、INVALID)、multiport 多端口、limit 包流量、mac 网卡地址)

参数 -m multiport --source-port
    例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
    说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。

参数 -m multiport --destination-port
    例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
    说明 用来比对不连续的多个目的地埠号,设定方式同上。

参数 -m multiport --port
    例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
    说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。
    注意:在本范例中,如果来源端口号为 80目的地埠号为 110,这种封包并不算符合条件。

参数 --icmp-type
    例如: iptables -A INPUT -p icmp --icmp-type 8
    说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。
    请打 iptables -p icmp --help 来查看有哪些代码可用。

参数 -m limit --limit
    例如: iptables -A INPUT -m limit --limit 3/hour
    说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,
    默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。

参数 --limit-burst
    范例 iptables -A INPUT -m limit --limit-burst 5
    说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。

参数 -m mac --mac-source
    范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
    说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。

参数 --mark
    范例 iptables -t mangle -A INPUT -m mark --mark 1
    说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。

参数 -m owner --uid-owner
    范例 iptables -A OUTPUT -m owner --uid-owner 500
    说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。

参数 -m owner --gid-owner
    范例 iptables -A OUTPUT -m owner --gid-owner 0
    说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

参数 -m owner --pid-owner
    范例 iptables -A OUTPUT -m owner --pid-owner 78
    说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。

参数 -m owner --sid-owner
    范例 iptables -A OUTPUT -m owner --sid-owner 100
    说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。

参数 -m state --state
    范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
    说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
        INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
        ESTABLISHED 表示该封包属于某个已经建立的联机。
        NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
        RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

三 开机自启

3.1 Linux的运行级别

Linux的运行级别有6个,而这6个运行级都有各自的功能,某个程序在一个运行级别里面运行,在另一个级别就不运行。

  • 0 - halt (Do NOT set initdefault to this) 系统停止 / 关机模式
  • 1 - Single user mode 单用户运行模式
  • 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 无网络多用户模式
  • 3 - Full multiuser mode 有网络多用户(完整多用户模式)
  • 4 - unused 未使用
  • 5 - X11 有网络支持,且有X-Window支持的多用户模式 (图形模式)
  • 6 - reboot (Do NOT set initdefault to this) 重新引导系统 (即 重启)

一般情况下,我们处于的运行级在3或者5。

这6种模式还有许多功能,比如说:
如果忘记了root密码就可以进入单用户模式,
在启动后的提示符界面下输入init = /bin/sh rw就进入了模式1,
把root文件挂为读写就可以跳过系统认证,
直接用passwd程序来更改root用户口令了,
然后,再启动到正常的运行级去即可。

查看6大运行级别信息 、 修改运行级别(启动模式)

CentOS6/RHEL6 及之前的版本,查看、修改启动模式,都是在 /etc/inittab 文件里直接修改,修改id后面的数字即可。

shell# cat /etc/inittab

# inittab is only used by upstart for the default runlevel.

#

# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# System initialization is started by /etc/init/rcS.conf

#

# Individual runlevels are started by /etc/init/rc.conf

#

# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf

#

# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

# with configuration in /etc/sysconfig/init.

#

# For information on how to write upstart event handlers, or how

# upstart works, see init(5), init(8), and initctl(8).

#

# Default runlevel. The runlevels used are:

# 0 - halt (Do NOT set initdefault to this)

# 1 - Single user mode

# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)

# 3 - Full multiuser mode

# 4 - unused

# 5 - X11

# 6 - reboot (Do NOT set initdefault to this)

#

id:3:initdefault:

CentOS7/RHEL7 之后版本,查看、修改启动模式,也在 /etc/inittab 里有介绍

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses 'targets' instead of runlevels. By default, there are two main targets:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

查看当前的启动模式/运行级别

[CentOS6/RHEL6 及之前的版本]
查看模式,在 /etc/inittab 文件里直接查看末行的id后面的数字即可。

[centos7]

  • runlevel0.target -> poweroff.target
  • runlevel1.target -> rescue.target
  • runlevel2.target -> multi-user.target
  • runlevel3.target -> multi-user.target

multi-user.target: analogous to runlevel 3

  • runlevel4.target -> multi-user.target

  • runlevel5.target -> graphical.target

graphical.target: analogous to runlevel 5

  • runlevel6.target -> reboot.targe
systemctl get-default

查看指定运行模式下可使用的功能服务

怎么查看在当前模式下可以使用什么功能呢?查看/etc/rc.d/init.d这个文件夹下

ll /etc/rc.d/init.d

怎么查看在不同运行模式下,可以使用什么功能呢?
查看/etc/rc.d/init.d这个文件夹下,就是可以运行的脚本.如下图:

ll /etc/rc.d

或者:

ll /etc/rc[0-6].d

通过下图,可以发现: 在/etc下也有同样的7个文件夹即 /etc/rc[0-6].d ,通过查看发现/etc/rc[0-6].d其实就是/etc/rc.d/rc[0-6].d软连接,只是为了保持和Unix兼容

ll /etc/rcN.d
   或者  ll /etc/rc.d/rc[0-6].d

↓↓↓
这些文件是按照如下格式命名的 [KS][1-100]servicename ,它表示当系统的运行级别为5时,它会关掉以K开头的所有服务,并启动所有以S开头的服务。
其实,这些服务都是/etc/init.d/中某个服务的软连接,所以真正启动的服务是/etc/init.d目录中的某一个服务,而以K/S开头建立软连接是为了表明在对应级别下应该采取的行为,K/S后面紧跟的数字表示开/关服务的优先级。

因此,如果我们自己写了一个脚本代码 如cleanupd,需要在开机级别为3的时候自启动的话,那么我们只需要把可执行的cleanupd脚本文件放到 /etc/init.d目录下,并在对应的运行级别目录下 如/etc/rc.d/rc3.d/ 建立一个以S开头后加数字的软连接到/etc/init.d/cleanupd即可,如

ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup

设置、切换启动模式/运行级别

那么如何切换启动模式呢?
[通用方法]
使用"init + 运行级别"回车即可直接进入,比如:输入init 0电脑就会关机,输入init 6电脑就会重启

[centos7]

systemctl set-default <TARGET.target>

修改完成,重启服务器,即生效。

3.2 查看 开机自启

  • 查看 开机自启的所有服务
[centos6/7/8/...]
chkconfig --list

[centos7/8/...]
systemctl list-unit-files
  或者 systemctl list-unit-files | grep -i xxx
  • 查看是否有定时执行任务

参考文献

[查看 定时服务是否已开启]
systemctl status crond

[查看 定时 执行任务列表]
crontab -e 

3.3 设置 开机自启

方式1: chkconfig 【推荐】

Linux chkconfig命令用于检查,设置系统的各种服务。用来设置服务的运行级信息,该设置并非立即启动,或者禁用制定服务。

这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。

这个命令是centos7之前版本使用的,但是目前是过渡期,在centos7上依然可以使用,这个命令只列出SysV服务机制的服务,并不包含centos7上systemd服务

注: Linux默认允许任何人按下Ctrl+Alt+Del来重启系统。但是在生产环境中,应该停用按下Ctrl-Alt-Del 重启系统的功能。

  • 停用/启用 指定服务的开机自启
chkconfig network off/on  | 关闭network
chkconfig iptables off/on | 关闭防火墙
linux有7个运行级别: 0-6
0级别表示:关机状态
1级别表示:单用户模式
2级别表示:没有nfs服务
3级别表示:多用户模式,不带图形界面
4级别表示:保留的级别
5级别表示:多用户模式,带图形界面
6级别表示:重启
  • 自定义设置 开机自启服务

/etc/inittab在centos7之前版本中,可修改此配置文件来定义系统运行级别,只不过在centos7系统中,已经不使用了。

#chkconfig --level 3 network off //关闭3级别的network服务
#chkconfig --level 35 network off //关闭3级别和5级别的network服务
#chkconfig --level 345 network on //开启3、4、5级别的network服务

在/etc/init.d/下创建一个自己的脚本,然后使用命令:

chkconfig --add +脚本名称 //就可以把自己的脚本添加到开机服务列表中

自己添加的脚本中必须要有:chkconfig: 2345 10 90 description: Activates/Deactivates all network interfaces configured to \ start at boot time.

这两部分才能被识别,其中必须是shell脚本,2345表示启动级别是2、3、4、5级别,10表示启动顺序是第10位,90是第90位关闭

#chkconfig --del +脚本名称 //删除开机自启动服务

方式2: 修改 /etc/rc.d/rc.local 文件

  • step1 赋予脚本可执行权限(/opt/script/autostart.sh是你的脚本路径)
chmod +x /opt/script/autostart.sh
  • step2 打开/etc/rc.d/rc/local文件,配置、指定具体功能模块的开机自启的shell启动操作
    例如: 例如将 apache、MySQL、samba、autostart.sh(自定义的用户启动脚本)等这些服务的开机自启动问题一起搞定:
vi/etc/rc.d/rc.local
  /usr/sbin/apachectl start
  /etc/rc.d/init.d/mysqld start
  /etc/rc.d/init.d/smb start
  /opt/script/autostart.sh
  • 在centos7中,/etc/rc.d/rc.local的权限被降低了,所以需要执行如下命令赋予其可执行权限
chmod +x /etc/rc.d/rc.local

方式3: 修改 /etc/rc.d/init.d 文件 + chkconfig

  • step1 将脚本移动到/etc/rc.d/init.d目录下
mv  /opt/script/autostart.sh /etc/rc.d/init.d
  • step2 增加脚本的可执行权限
chmod +x  /etc/rc.d/init.d/autostart.sh
  • step3 添加脚本到开机自动启动项目中
cd /etc/rc.d/init.d
chkconfig --add autostart.shchkconfig autostart.sh on

方式4: ln -s 建立软连接

如果我们自己写了一个脚本代码 如 cleanupd,需要在开机级别为3的时候自启动的话.
那么,我们只需要把可执行的cleanupd脚本文件放到 /etc/init.d目录下,并在对应的运行级别目录下 如/etc/rc.d/rc3.d/ 建立一个以S开头后加数字的软连接到/etc/init.d/cleanupd即可,如:

ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup

方式5: systemctl

仅对 CENTOS/RedHat 7 及以上OS 支持

systemctl enable/disable xxService

X 参考文档

posted @ 2020-06-12 16:33  千千寰宇  阅读(9779)  评论(0编辑  收藏  举报