和以前的版本相比,CentOS7主要加入以下新特性。
(1) 从CentOS6.x在线升级到 CentOS7;
(2) 加入了linux容器(LinuX Containers, LXC)支持,使用轻量级的Docker进行容器实现;
(3) 默认的XFS文件系统;
(4) 使用systemd后台程序管理linux系统和服务;
(5) 使用firewalld后台程序管理防火墙服务。
本文主要介绍利用systemd 和firewalld管理linux系统和服务的相关用法。
1. systemd是linux系统的一个超级后台程序,它是系统初始化时的控制单元,主要用于管理linux系统后台程序和服务。使用pstree命令查看系统程序时,发现systemd是所有程序的祖辈程序。
(1) systemctl是管理systemd程序的基本命令。如果系统安装了systemd-ui包,也可以使用与systemctl对应的命令systemadm命令调出界面,进行systemd管理。
systemctl 命令的主要用法如下。其中unit可以是服务(.service),装载点(.mount),装置(.device)或套接字(.socket), 定时器(.timer)和系统快照(.snapshot)等。这些unit可以看作是其对应的服务、装置等等配置文件,systemd依据这些unit文件控制或监视对应程序的运行。使用systemctl 命令管理unit对应的程序时,应包含上述 .* 形式的后缀名来指明是服务还是装置等,如果没有后缀名,则默认为服务。
systemctl (or) systemctl list-units ## To list all the running units
systemctl --failed ## To list all the failed units
systemctl list-unit-files ## To show all installed unit files
systemctl list-unit-files --type=service ## To show all installed service unit files
systemctl start/stop/restart service_name.service ## To start/stop/restart a service with name service_name
systemctl status service_name.service ## To view the current status of a service
systemctl reload service_name.service ## Reload the configuration file for a service
systemctl enable/disable service_name.service ## To make a service run/don’t run at booting time
systemctl daemon-reload ## Restart systemd
(2) 在systemd管理下,运行级别也成为一种unit(.target)出现。而使用systemctl管理运行级别,也取代了原来init的方式。
systemctl isolate multi-user.target ## switch to multi user run level (runlevel 3)
systemctl isolate graphical.target ## swith to graphical run level (runlevel 5)
systemctl set-default levelname.target ## Set levelname as the default run level
(3) systemd 还自带了系统日志功能(journald),取代了syslog后台程序。journald的配置文件位于
/etc/systemd/journal.conf
如果不修改该文件,则使用默认值处理日志。例如Storage域默认值为auto,该选项的意义是系统将自动将日志文件写入/var/log/journal/目录下,但如果该目录不存在,不会创建该目录,也不写入日志文件。这样日志文件每次重启都会被清空。所以如果我们要持久化日志文件,就应该手动创建/var/log/journal/,或者修改Storage域的值。该文件每个域的意义可参看 man journald.conf
可以使用
journalctl
命令查看日志。 主要用法有以下内容。
journalctl –b [-num] ## if num is omitted, show all messages from this boot.
## Or else show logs from the boot which were happened num times before this boot.
journalctl -f ## Follow new messages
journalctl /usr/lib/systemd/systemd ## Show all messages by a specific executable
journalctl _PID=pid ## Show all messages by a specific process
journalctl –u netcfg ## Show all messages by a specific unit
journalctl _TRANSPORT=kernel ## Show kernel ring buffer
可以利用journald 的日志功能debug某个启动失败的unit,也可以修改系统启动时日志等级,debug系统启动过程中出现的问题。
2. CentOS 7使用firewalld动态管理系统防火墙,支持network/firewall分段(zones)管理信任级别,支持界面(firewall-config命令)管理规则。firewall完全替代了iptables的功能。
firewalld分级管理网络连接信任程度,每一个网络连接都在一个防火墙级别下工作。为每一个级别设定其独特的防火墙规则,防火墙规则可以是针对预定义的服务、端口和传输协议、端口转发等方面。默认各个防火墙级别的规则,从最不信任到最信任排列如下。
Drop: 只允许计算机通过网络连接向外发送数据包。所有外部传来的数据包将被丢弃,无应答。
Block: 任何进入到网络连接的数据都被拒绝,只返回ipv4的icmp-host-prohibited报文或ipv6的icmp6-host-prohibited报文。
Public:只允许选中连接的数据包进入通信。选中规则可以使用firewall-cmd自定义。
External: 用在路由器等启用伪装的网络,只允许选中的连接接入。
Dmz: 用以限制隔离区(dmz)中的电脑被外部访问,只允许选中的连接。
Work: 用于工作网络,假定大多数联网计算机都是正常的,只允许被选中的连接。
Home: 用在家庭网络,只允许被选中的连接。
Internal:适用内部局域网。
Trusted:允许所有的网络连接。
默认的各个防火墙级别的配置文件在/lib/firewalld/zones中保存。用户自定义防火墙级别时,应该保存在/etc/firewalld/zones中。系统启动firewalld时,按照网络连接配置文件(/etc/sysconfig/network-scripts/ifcfg *)中ZONE域设定的级别(ZONE域未被设定时,系统使用默认的级别)读取上述两个文件夹中对应级别的配置文件,初始化防火墙规则。
firewall-cmd 命令是管理firewalld行为的主要命令,一般需要root权限才能执行,主要用法如下。
firewall-cmd --state ## To check if the firewalld were running or not
firewall-cmd --reload ## Keep current running firewalld status, and reload firewalld configuration
firewall-cmd --complete-reload ## Reload firewalld and abandon current status
firewall-cmd --get-zones ## To show all supported zones
firewall-cmd --get-services ## To show all supported services which can be add to the zone
firewall-cmd --list-all-zones ## To list all zones with enabled features (services)
firewall-cmd [--zone= zone_name] –list-all ## Print zone zone_name with its enabled features
firewall-cmd --get-default-zone / --set-default-zone=zone_name ## Get/Set the default zone set for all
##new network connections
firewall-cmd --get-active-zones ## Get current active zone with belonging interfaces (connections)
firewall-cmd --get-zone-of-interface=interface_name ## Get zone related to interface interface_name
firewall-cmd [--zone=zone_nm] --add-interface=interface_nm ## Add interface_nm to zone_nm, use
##default if zone options is omitted
firewall-cmd [--zone=zone_nm] --change-interface=interface_nm ## Reassign zone for interface_nm
firewall-cmd [--zone=zone_nm] --list-services ## List the enabled services in a zone
## To enable a service in zone_nm for n seconds, if zone is not set, the default zone be used, if timeout is
##not set, the service will be affective until manually disable or the time when PC is shut down
firewall-cmd [--zone=zone_nm] --add-service=service_nm [--timeout=n_seconds]
## To enable a service in zone_nm permanently, if zone is not set, the default zone be used
firewall-cmd --permanent [--zone=zone_nm] --add-service=service_nm
firewall-cmd [--zone=zone_nm] --remove-service=service_nm ## Disabled service_nm for current runtime
## Disabled service_nm in zone_nm permanently
firewall-cmd --permanent [--zone=zone_nm] --remove-service=service_nm
## To enable a port or port range from port_no_start to port_no_end in zone_nm for n seconds
firewall-cmd [--zone=zone_nm] --add-port=port_no_start[-port_no_end]/protocol_nm
[--timeout=n_seconds]
## To enable a port or port range from port_no_start to port_no_end in zone_nm permanently
firewall-cmd --permanent [--zone=zone_nm] --add-port=port_no_start[-port_no_end]/protocol_nm
## To disable a port or port range from port_no_start to port_no_end
firewall-cmd [--zone=zone_nm] --remove-port=port_no_start[-port_no_end]/protocol_nm
## To disable a port or port range from port_no_start to port_no_end in zone_nm permanently
firewall-cmd --permanent [--zone=zone_nm] --remove-port=port_no_start[-port_no_end]/protocol_nm
## To enable port forwarding or port mapping in a zone
firewall-cmd [--zone=] --add-forward-port=port=[-]:proto=
{ :toport=[-] | :toaddr= | :toport=[-]:toaddr= }
3. Public级别下允许远程SSH连接的一个实例。CentOS 7默认安装了SSH服务器,无需另行安装。
为了增加安全性,更改SSH服务的默认端口。SSH默认端口为22,但可以通过手动更改配置的方式更改为其它端口。
vi /etc/ssh/sshd_config
在其中添加
Port 5432
保存后退出。
如果启用了SElinux安全工具,还要允许ssh端口的网络通信。
semanage port -a -t ssh_port_t -p tcp 5432
然后利用systemctl启动或重新载入ssh服务。
systemctl start/reload sshd.service
这样SSH服务就开始侦听端口5432了。但是,这时由于Public防火墙规则中并未允许SSH服务,因此实际上远程SSH是不可用的。可以利用firewall-cmd进行开始SSH服务和端口的操作。
firewall-cmd --permanent --zone=public --add-service=ssh ## No necessary, ssh is enabled by default
firewall-cmd --permanent --zone=public --add-port=5432/tcp ## No necessary, ssh is in public by default
firewall-cmd --reload ## Reload and enforce the preceding configurations
经过上面的操作之后,就可以远程SSH控制了。