目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Centos7 Features

Hostname

临时修改(需要开启新的会话)

[root@localhost ~]hostname test123

永久修改

[root@localhost ~]# vim /etc/hostname
localhost.localdomain

OS Directory Detail

/	#根目录,起点。
	etc  # 系统和应用的配置文件
	home  #普通用户的家目录	
	bin  #可执行二进制文件 (系统指令) bin -> /usr/bin
	sbin  #可执行二进制文件(超级用户指令)sbin -> /usr/sbin
	usr  # 可执行二进制文件(用户程序)
	boot  #系统引导目录(存放系统引导文件)
	lib  # 系统库文件
	tmp	#临时文件(此自带定时清理机制,不适合存放需要长期持久化的数据)
	var	#系统日志(/var/log)、帮助文档、比较杂乱。
	proc	#保存进程的动态信息(内存使用率、CPU使用率等…)
	sys	#/proc类似,是一个虚拟的文件系统,主要记录与系统核心相关的信息(系统当前已经载入的模块信息等,这个目录实际不占磁盘容量)。
	dev 	#设备文件、驱动程序(硬盘、鼠标等…)
	opt #大型软件和特殊软件的目录
	srv  #服务数据
	run	# 类似于tmp(区别在于服务所需要的临时文件)

TimeZone

# 修改时区
[root@localhost /]# timedatectl set-timezone Asia/Shanghai
[root@localhost /]# timedatectl 
      Local time: 一 2019-07-15 10:21:19 CST	#操作系统时间
  Universal time: 一 2019-07-15 02:21:19 UTC
        RTC time: 一 2019-07-15 02:21:19
	#主板时间
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no

# 主机时间同步至操作系统时间
[root@localhost /]# timedatectl set-local-rtc 1

# 显示当所在时区和时间
[root@localhost /]# date -R
Mon, 15 Jul 2019 10:13:50 +0800

Network Interface Naming Notations

net.ifnames默认是基于固件、拓扑、位置信息来分配。
biosdevname提供给戴尔部分 PowerEdge 的帮助程序,可根据系统 BIOS 提供的信息对网络接口进行重命名

阿里云 ECS 默认规则禁用了 net.ifnames 和 biosdevname 的命名规范

# biosdevname=0 net.ifnames=0
[root@BlogSystem ~]# cat /etc/sysconfig/grub 
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet idle=halt biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8 noibrs"
GRUB_DISABLE_RECOVERY="true"

Network Setting Command ip

 CentOS7 默认采用 minimal 模式安装没有集成"net-tools"软件包,而是使用 ip 命令作为网络管理的替代品,官方推荐使用 ip 命令。

查看、修改 ip 地址信息

# 方式一:修改配置配置文件
[root@localhost /]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPADDR=192.168.31.220
GATEWAY=192.168.31.1
NETMASK=255.255.255.0
DNS1=192.168.31.1
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=c64114f2-50d3-4622-8998-0ea0336361ee
DEVICE=eth0
ONBOOT=yes

# 方式二:使用ip命令
[root@localhost /]# ip addr add 192.168.31.220/24 dev eth0	#添加指定ip
[root@localhost /]# ip addr add 192.168.31.221/24 dev eth0:1 #第一个ip地址默认为0,如果需要在同一个设备中添加多个ip地址,别名后面的需要需要从1开始,以此类推。
[root@localhost /]# ip addr[a] show eth0	# 查看是否生效
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:9d:01:06 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.220/24 brd 192.168.31.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::84d1:a131:eeb7:5014/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@localhost /]# ip addr del 192.168.31.220/24 dev eth0  #删除ip

控制网络接口

[root@localhost /]# ip link set dev eth0 down  #关闭指定接口设备
[root@localhost /]# ip link set dev eth0 up	#开启指定接口设备

配置路由信息

[root@localhost /]# ip route show  #列出路由表条目

Auto-completion options

 CentOS7 中支持参数补全,此功能基于"bash-completion"软件包。

[root@localhost ~]# systemctl status docker.service

Memory Partition

Memory Partition
 在 Centos6 中,当应用程序需要时,可以回收 Cache 和 Buffers 的内存区域,以便应用程序全完接管 Cache 和 Buffers 的内存区域。
 在 CentOS7 中,应用程序可以回收 Cache/Buffers 中绝大部分内存,有一小部分是需要保留,无法回收给应用程序使用。

  • Buffer:解决速率不同、优先级不同的设备之间传输数据的缓存区。
  • Cached:CPU 读取文件的一个缓存区(disk -> memory[hit] -> cpu)。
    查看内容使用状况
# total = used + free + buff/cache
# available= free + buff/cache - Non-recoverable
# Non-recoverable = free + buff/cache - available
[root@localhost ~]# free -m	#以MB为单位显示
              total        used        free      shared  buff/cache   available
Mem:           2608         847         907          11         853        1636
Swap:          2047           0        2047

Port Status

 CentOS7 默认采用 minimal 模式安装没有集成"net-tools"软件包,而是使用 ss 命令代替 netstat 作为查看 TCP 连接的工具。ss 在大量并发情况下的连接信息时执行速度要远远优于 netstat。
TCP 三次握手
三次握手
TCP 四次挥手
TCP四次挥手

# netstat命令
[root@localhost ~]# netstat -an | grep ssh
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1121/sshd           
tcp        0      0 192.168.31.220:22       192.168.31.230:55349    ESTABLISHED 14160/sshd: root@pt 
tcp6       0      0 :::22                   :::*                    LISTEN      1121/sshd          

# ss命令使用
	-l	LISTEN
	-t	TCP
	-u	UDP
	-n	以端口的形式展现(默认是以服务名的方式展现)
	-p	现实进程对应的PID
	-a	查看所有连接状态的信息(三次握手、四次挥手):LISTEN、ESTAB等……
	state	用于过滤TCP状态,后可跟不同的TCP状态,例如:established
	-s	查看本机socket利用率概要

[root@localhost ~]# ss -lntp state established
Recv-Q Send-Q                                         Local Address:Port                                                        Peer Address:Port              
0      0                                             192.168.31.220:22                                                        192.168.31.230:55349               users:(("sshd",pid=14160,fd=3))


# Total:进程使用的套接字数量(内核使用的套接字数量)
# 属于TCP套接字的: 9个(1个estab、1一个closed 、0个重发、0个synrecv[一般此状态比较快,为0,如果比较高则可能是遭受到了syn攻击] 、0个timewait[如果客户端是以短连接的形式与服务器端建立连接,则timewait值会增高,如果没有高于1W,则一般不会有什么影响,如果高达几W,则有可能影响服务器端对新TCP连接的端口分配。])
[root@localhost ~]# ss -s
Total: 1378 (kernel 1741)
TCP:   9 (estab 1, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*	  1741      -         -        
RAW	  1         0         1        
UDP	  4         2         2        
TCP	  8         4         4        
INET	  13        6         7        
FRAG	  0         0         0

Service Manager in Systemd

Systemd 简介
 Systemd 是 CentOS7 新采用的一套管理体系,可以实现启动及进程服务管理等,对比 Centos6 系统之前所采用的 sysVini 体系,带来了很多突出的变化、更加全面、更加友好

Centos6CentOS7
服务管理servicesystemctl
启动项管理chkconfigsystemctl
系统启动级别initsystemctl
定时任务crontimer
日志管理syslogSystemd-journal
其他…环境变量设置、系统挂载、远程主机管理等…

systemctl 支持管理的单元类型
 systemctl 把不同的服务项定义成不同的单元类型,每个单位类型有专属的扩展名。

文件扩展名作用
.service用于定义系统服务
.target模拟实现"运行级别"
.device定义内核识别设备
.mount文件系统挂载点
.socket进程间通信用的 socket 文件
.timer定时器
.snapshot管理系统快照
.swapSwap 设备
.automount自动挂载点
.path监视文件或目录
.scope外部线程
.slice分层次管理系统进程
# 查看systemctl当前支持的单元类型
[root@localhost ~]# systemctl -t help
Available unit types:
service
socket
busname
target
snapshot
device
mount
automount
swap
timer
path
slice
scope

Systemd 优势

  • 支持并行启动,显著提高开机启动效率。(缩短开机时间)
  • CentOS 关机只关闭正在运行的服务(提高效率)
  • 对于服务的管理不需要基于 init.d 下的脚本
  • Systemd 解决原有模式的缺陷:Service(无法管理服务派生出的子进程)、Syslog(存在日志丢失的情况)

Systemd 中文手册

基础单元管理命令

基础命令作用
systemctl、systemctl list-units查看激活的单元(激活状态才是真可以使用的,并且是正在运行。)
systemctl --failed查看运行失败的单元
systemctl list-units-files查看所有可用的单元
systemctl help < 单元 >显示单元的帮助手册页
systemctl daemon-reload重新载入 systemd,扫描新的或有变动的单元

基础单元管理命令

基础命令作用
systemctl start < 单元 >激活单元
systemctl stop < 单元 >停止单元
systemctl restart < 单元 >重启单元
systemctl reload < 单元 >重载单元
systemctl status< 单元 >输出单元运行状态
systemctl is-enabled < 单元 >检查单元是否配置为自动启动
systemctl enable < 单元 >开机激活单元
systemctl enable --now < 单元 >设置单元为自动启动并立即启动这个单元
systemctl disable < 单元 >取消开机自动激活单元
systemctl mask < 单元 >禁用一个单元(禁用后,间接启动也是不可能的)
systemctl unmask < 单元 >取消禁用的某个单元
  • 如果无扩展名,systemctl 默认把扩展名当作。service。
  • 挂载点、设备名称会自动转化对应的单元
[root@localhost ~]# systemctl list-units | grep 'boot'
  boot.mount                                                                                                                                                       loaded active mounted   /boot
  • 一个软件包可能会提供多个不同的单元。
[root@localhost ~]# rpm -ql docker-ce
/usr/bin/docker-init
/usr/bin/docker-proxy
/usr/bin/dockerd-ce
/usr/lib/systemd/system/docker.service #不同的单元 
/usr/lib/systemd/system/docker.socket  #不同的单元
/var/lib/docker-engine/distribution_based_engine-ce.json

练习

# 查看nginx服务运行状态
[root@localhost ~]# systemctl status nginx
● nginx.service - LSB: starts the nginx web server
   Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

# 查看nginx服务运行状态
[root@localhost ~]# systemctl stop boot.mount 

# 查看文件系统挂载
[root@localhost ~]# df -h
[root@localhost ~]# systemctl stop boot.mount

#查看所有可用的 且单元类型为serivice的单元
[root@localhost ~]# systemctl --type service list-unit-files 

# 重启vsftpd单元
[root@localhost ~]# systemctl restart vsftpd.service
[root@localhost ~]# systemctl status vsftpd.service

Systemd target

  • 涵盖启动级别的概念
  • 理解为目标或组
  • target 间可以互相关联
SysVinitSystemd
关闭0runlevel0.target,poweroff.target
单用户模式1,s,singlerunlevel1.target,poweroff.target
多用户模式2runlevel2.target,multi-user.target
多用户带网络模式3runlevel3.target,multi-user.target
多用户、网络、图形化模式5runlevel5.target,graphical.target
重启操作系统6runlevel6.target,reboot.target

管理系统启动级别

# 显示操作系统当前处于的启动启动级别
[root@localhost ~]# systemctl get-default 
multi-user.target

# 修改系统启动级别:修改为多用户网络启动模式
[root@localhost ~]# systemctl set-default  multi-user.target 

# 重启才会生效
[root@localhost ~]# reboot

# 修改配置文件永久生效
[root@localhost ~]# vim /etc/inittab 
systemctl set-default TARGET.target

系统启动级别依赖关系

# 显示默认defualt target (默认启动级别)所依赖服务关系的树状图
[root@localhost ~]# systemctl list-dependencies 

# 显示指定启动级别依赖的树状图
[root@localhost ~]# systemctl list-dependencies graphical.target 

# 通过服务查询查询和指定启动级别的关系:反查询
[root@localhost ~]# systemctl --reverse list-dependencies docker.service 
docker.service
● └─multi-user.target
●   └─graphical.target

Systemd service

SysVinitSystemd
启动服务service name startsystemctl start name
关闭服务service name stopsystemctl stop name
重启服务service name restartsystemctl restart name
重载服务service name reloadsystemctl reload name
服务状态service name statussystemctl status name
判断服务启动则重启服务service name condrestartsystemctl condrestart name

编写单元文件

  • 软件包安装的单元:/usr/lib/systemd/system/
  • 系统管理员安装的单元:/etc/systemd/system/

定义服务启动类型 Type

服务类型描述
simple(默认值)systemd 认为该服务将立即启动
forkingsystemd 认为当该服务进程 fork,且父进程退出后服务启动成功
oneshot这一选项适用于只执行一项任务、随后立即退出的服务
notify与 Type= simple 相同,但约定服务会在就绪后向 systemd 发送一个信号
dbus当指定的 BusName 出现在 DBus 系统总线上时,systemd 认为服务就绪
idle其他行为与 Type = simple 类似,但 systemd 不会优先处理

自定义服务单元配置

[root@localhost ~]# systemctl cat iptables.service 
# /usr/lib/systemd/system/iptables.service
[Unit] #单元的说明及依赖相关设置 Requires是强依赖,Wants不是强依赖。
Description=IPv4 firewall with iptables
Before=ip6tables.service
After=syslog.target
AssertPathExists=/etc/sysconfig/iptables

[Service]
 # 定义单元的管理方式
Type=oneshot
	#服务单元管理类型
RemainAfterExit=yes
ExecStart=/usr/libexec/iptables/iptables.init start
ExecReload=/usr/libexec/iptables/iptables.init reload
ExecStop=/usr/libexec/iptables/iptables.init stop
Environment=BOOTUP=serial
Environment=CONSOLETYPE=serial
   
StandardOutput=syslog
StandardError=syslog

[Install]
  # 定义加入到target单元中
WantedBy=basic.target

自定义服务单元

# 1、程序准备(编写测试脚本)
[root@localhost ~]# mkdir -pv /opt/work/
[root@localhost ~]# touch /tmp/test.res
[root@localhost ~]# vim /opt/work/soulboy.sh
#!/bin/bash
# test@emial.com
echo $$ > /var/run/soulboy.pid
while :
do
	echo "Hi soulboy!,"$(date)
  >> /tmp/test.res
	sleep 1
done

# 2、编译自定义单元服务文件(pid)
[root@localhost ~]# touch /var/run/soulboy.pid
[root@localhost ~]# vim /usr/lib/systemd/system/soulboy.service
[Unit]
Description=Print info in /tmp/test.res 

[Service]
Type=sim
PIDFile=/var/run/soulboy.pid
ExecStart=/bin/sh /opt/work/soulboy.sh
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
 
# 3、启动及测试
[root@localhost ~]# systemctl daemon-reload 
[root@localhost system]# systemctl start soulboy.service 
[root@localhost system]# tail -f /tmp/test.res 
[root@localhost system]# systemctl stop soulboy.service

Systemd Timers

 Timers 可用来替换系统上的 cron,定时控制服务事件(.service 文件)

  • 定时任务 = service 服务单位 + timer 定时单位

Timer 分类

  • 单调定时器:从一个时间点过一段时间后激活定时任务。
时间点类型代表类型的时间点
OnActive以定时器启动为时间点
OnBootSec以系统启动为时间点
OnStartupSec以 systemd 启动为时间点
OnUnitActiveSec上次定时器任务激活为时间点
OnUnitInativeSec上次定时器任务执行完毕的时间
[Timer]
OnBootSec=15min	#系统启动完成之后的15分钟开始执行任务
OnUnitActiveSec=1W	#上次任务激活之后,每隔一周执行一次
[Timer]
#OnCalender=*-*-* 00:00:00
OnCalender=Fri 2012-11-23 11:12:13

练习
 添加新的 timer 定时任务单位,定时调用服务单位 soulboy.service

# 服务单元 soulboy.service 路径
[root@localhost system]# /usr/lib/systemd/system/soulboy.service

# 新建Timer单元
```bash
# 
[root@localhost system]# vim /usr/lib/systemd/system/soulboy.timer
[Unit]
Description= timer unit - Soul Boy Service
Documentation=http://test.com

[Timer]
Unit=soulboy.service
OnCalendar=2019-08-07 21:25:00

[Install]
WantedBy=multi-user.target


# 重新加载
[root@localhost system]# systemctl daemon-reload 

# 启用Timer单元任务
[root@localhost system]# systemctl start soulboy.timer

# 查看指定Timer定时单元状态
[root@localhost system]# systemctl status soulboy.timer 
● soulboy.timer - timer unit - Soul Boy Service
   Loaded: loaded (/usr/lib/systemd/system/soulboy.timer; disabled; vendor preset: disabled)
   Active: active (waiting) since 二 2019-07-16 17:15:10 CST; 23s ago
     Docs: http://test.com

7月 16 17:15:10 localhost.localdomain systemd[1]: Started timer unit - Soul Boy Service.

# 查看本机所有定时单元的详情
[root@localhost ~]# systemctl list-timers 
NEXT                         LEFT                LAST                         PASSED      UNIT                         ACTIVATES
三 2019-07-17 16:11:49 CST  22h left            二 2019-07-16 16:11:49 CST  1h 6min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
三 2019-08-07 21:25:00 CST  3 weeks 1 days left n/a                          n/a         soulboy.timer                soulboy.service

2 timers listed.
Pass --all to see loaded but inactive timers, too.

Systemd Journald

 Systemd 管理所有单元的日志都会交给 journal 服务进行管理,Journalctl 是用来管理 journal 服务的命令。

-n	显示指定行数
-f	实时显示日志
-p	展示出级别的日志  后可以跟参数  eer
-u	显示指定服务单元的日志
-b	系统启动时日志
--since	指定时间的日志	
	today 	查看今天日志
--until	查看指定时间段的日志
	"30 min ago"	三十分钟之前的日志
_PID=1	查看PID为1的日志
_UID=1	查看指定UID用户的日志	cat /etc/passwd  root:x:0[UID]:0:root:/root:/bin/bash


# 两个小时之前到今天0点开始中间的时间
[root@localhost ~]# journalctl --since today --until "2 hours ago"
[root@localhost ~]# journalctl _UID=0

Iptables

防火墙的核心职能

  • 切割被信任(如子域)与不被信任(如 Internet)的网段;
  • 划分出可提供 Internet 的服务与必须受保护的服务;
  • 分析出可接受与不可接受的封包状态;

防火墙类别划分

  • 网域型:此类防火墙都是当作路由器角色。
  • 单一主机型:主要有封包过滤型的 Netfilter 与依据服务软件程序作为分析的 TCP Wrappers 两种

Netfilter (封包过滤机制)
 所谓的封包过滤,亦即是分析进入主机的网络封包,将封包的表头数据捉出来进行分析,以决定该联机为放行或抵挡的机制。由于这种方式可以直接分析封包表头数据,所以包括硬件地址(MAC),软件地址(IP), TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,因此用途非常的广泛。(其实主要分析的是 OSI 七层协议的 2, 3, 4 层)。Netfilter 机制到底可以进行分析的工作主要有以下方面:

  • 拒绝让 Internet 的封包进入主机的某些端口
  • 拒绝让某些来源 IP 的封包进入
  • 拒绝让带有某些特殊旗标(flag)的封包进入
  • 分析硬件地址(MAC)来决定联机与否

Linux 系统下的防火墙机制
 分别由位于内核空间的 Netfilter 和用户空间的 iptables 组合,数据包会路经 Netfilter 中的 Hook point,iptables 是用户空间用于管理 Netfilter 过滤机制的工具。
Netfilter与iptables的关系

  • Netfilter:是 Linux 操作系统内核空间内部的一个数据包处理模块。
  • Hook point:数据包在 Netfilter 中的挂载点分别是:PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。

iptables 的表格(table) 与链(chain)
表格与链
 Linux 的 iptables 有三个表格,包括管理本机进出的 filter 、管理后端主机(防火墙内部的其他计算机)的 nat 、管理特殊旗标使用的 mangle (较少使用) 。

  • filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table。
*   INPUT:主要与想要进入我们Linux本机的封包有关;
*   OUTPUT:主要与我们Linux本机所要送出的封包有关;
*   FORWARD:这个与Linux本机比较没有关系,他可以『转递封包』到后端的计算机中,与下列nat table相关性较高。
  • nat (地址转换):是 Network Address Translation 的缩写,这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关。
*   PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
*   POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
*   OUTPUT:与发送出去的封包有关
  • mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关,较少使用 mangle 这个表格。

iptables 工作流程图
iptables工作流程图
 如上图所示,iptables 可以控制三种封包的流向:

  • 封包进入 Linux 主机使用资源(路径 A):在路由判断后确定是向 Linux 主机要求数据的封包,主要就会透过 filter 的 INPUT 链来进行控管。
  • 封包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动(路径 B):在路由判断之前进行封包表头的修订作业后,发现到封包主要是要透过防火墙而去后端,此时封包就会透过路径 B 来跑动。也就是说,该封包的目标并非我们的 Linux 本机。主要经过的链是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
  • 封包由 Linux 本机发送出去(路径 C):例如响应客户端的要求,或者是 Linux 本机主动送出的封包,都是透过路径 C 来跑的。先是透过路由判断,决定了输出的路径后,再透过 filter 的 OUTPUT 链来传送的!当然,最终还是会经过 nat 的 POSTROUTING 链。
     由于 mangle 表很少使用,因此可以将 iptables 工作流程简化为如下图所示:
    iptables简图

iptables 规则组成
 组成部分:表[filter] + 链 + 规则
iptables规则组成结构

示例参考

数据包访问控制:
	ACCEPT	DROP(丢弃不响应)	REJECT(丢弃但响应客户端请求)
数据包修改:
	SNAT(源标地址)	DNAT(目标地址)
信息记录:
	LOG	

# 限制指定IP 192.168.31.230 的Remote Host本机web服务的请求数量
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -s 192.168.31.230 -m connlimit --connlimit-above 10 -j REJECT

# 对所有地址开放本机的tcp(80、22、10-21)端口的访问
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT

# 允许对所有的地址开放本机的基于ICMP协议的数据包访问
[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT

# 其他未被允许的端口则禁止访问   -A代表在最后一条后面追加规则
[root@localhost ~]# iptables -A INPUT -j REJECT

# 本机访问本机 (开发lo接口流入数据)
[root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT

# 本机主动发往外部的请求(开放流入数据为ESTABLISHED,RELATED 状态的数据)
root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 只允许192.168.31.230访问本机的web服务
[root@localhost ~]# iptables -D INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -D INPUT -p tcp -s 192.168.31.230 --dport 80 -j ACCEPT

FirewallD

  • CentOS7 里 iptables 和 firewalld 共存。
  • firewalld 的底层调用的 iptables,建立在 iptables 之上。
  • firewalld 在使用方式上要比 iptables 更人性化,支持区域管理。

Firewalld 使用区域管理概念
区域管理概念
 划分不同的区域,指定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。区域管理最大的有点就是便于复用。

区域概念及区域默认类型

  • 有 9 种区域默认类型
  • 默认区域:public
  • 区域分类:活跃区域(active)和非活跃区域,活跃的区域规则才会生效。
# 默认分9种区域类型
[root@localhost ~]# ls /usr/lib/firewalld/zones/
block.xml  dmz.xml  drop.xml  external.xml  home.xml  internal.xml  public.xml  trusted.xml  work.xml

# 查看home区域类型
[root@localhost ~]# cat /usr/lib/firewalld/zones/home.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Home</short>
  <description>For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="mdns"/>
  <service name="samba-client"/>
  <service name="dhcpv6-client"/>
</zone>

# 启动firewalld服务单元
[root@localhost ~]# systemctl start firewalld.service 

# 查看默认使用的区域(发现默认使用的是public区域)
[root@localhost ~]# firewall-cmd --list-all
public (active)	# 发现默认使用的是public区域
  target: default	# 在默认的区域下
  icmp-block-inversion: no	# 控制icmp相关的协议规则
  interfaces: eth0   # 当前区域作用在eth0设备接口上
  sources:   # 访问本机的SIP的控制。
  services: ssh dhcpv6-client
 # 允许对外暴露服务的服务列表
  ports:   # 定义对外开放的端口列表(有些服务端口特殊,没有现成的服务模版)
  protocols:   # 对外开放的协议
  masquerade: no   # ip地址伪装对应规则的设置
  forward-ports:   # 做Dport转发规则
  source-ports:   # 做Sport转发规则
  icmp-blocks:   # icmp相关规则
  rich rules:   # 丰富复杂规则的设置:比如只允许某些IP地址访问

# 查看9个区域
[root@localhost ~]# firewall-cmd --list-all-zones

# 查看活跃区域及其作用的设备接口
[root@localhost ~]# firewall-cmd --get-active-zones 
public
  interfaces: eth0

# 修改默认区域为home区域
[root@localhost ~]# firewall-cmd --set-default-zone=home

Firewalld 防火墙规则配置以及如何添加端口白名单
Firewalld防火墙规则配置

  • 流入方向:默认阻止所有流量
  • 出口方向:允许
  • 配置原则:基于默认规则的基础上,添加白名单规则就可以了:允许哪些服务、哪些端口、哪些地址可以访问。

基于端口的白名单设置

# 查看默认区域下的状态信息
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: ssh dhcpv6-client
  ports: 
	# 发现没有开发任何端口
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 开放本机的8080端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp
success

# 移除端口
[root@localhost ~]# firewall-cmd --zone=public --remove-port=8080/tcp

# 再次查看默认区域下的状态信息
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: ssh dhcpv6-client
  ports: 8080/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 使用浏览器访问http://192.168.31.220:8080/
  ...No Problem...

# 重新加载默认区域规则
[root@localhost ~]# firewall-cmd --reload  (加载默认区域规则文件,但是不会中断当前已经建立的连接)
[root@localhost ~]# firewall-cmd --complete-reload  (加载默认区域规则文件,并中断当前已经建立的连接)

# 将添加规则持久化(将规则同步至当前绑定区域类型的文件中,永久生效)
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent 
[root@localhost ~]# firewall-cmd --reload  (动态加载新规则,配合--permanent 
 使用)

基于服务的白名单设置
 在/usr/lib/firewalld/services/目录下以:servicename.xml 文件的方式来绑定服务与端口之间的关系。

# 查看具体的xml的服务文件:http服务
[root@localhost ~]# cat /usr/lib/firewalld/services/http.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="80"/>
</service>

# 服务白名单中添加指定服务
[root@localhost ~]# firewall-cmd --zone=public --add-service=http
success

# 查看public区域的服务白名单
[root@localhost ~]# firewall-cmd --zone=public --list-services 
ssh dhcpv6-client http

# 将指定服务从public区域的服务白名单中删除
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http
success

# 持久化服务白名单到当前区域文件中
[root@localhost ~]# firewall-cmd --zone=public --add-service=http --permanent 
[root@localhost ~]# firewall-cmd --reload  (动态加载新规则,配合--permanent 
 使用)

多区域规则结合设置场景
 默认的 9 中区域职能如下:

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

 Firewalld 可以同时支持多个活跃区域(active)同时存在,多个区域共同组成最终访问规则。
 活跃区域可以通过添加网络接口激活、或是设置源 IP 白名单规则激活。
多区域结合使用

# 发现public是默认区域
[root@localhost ~]# firewall-cmd --list-all
public (active)

# 设置drop区域为默认区域并绑定网络接口(激活区域)
[root@localhost ~]# firewall-cmd --set-default-zone=drop
[root@localhost ~]# firewall-cmd --zone=drop --change-interface=eth0

# 设置trusted区域并将指定ip段加入trusted区域的sourvce白名单中的。
[root@localhost ~]# firewall-cmd --zone=trusted --add-source=192.168.31.0/24

# 使用192.168.31.230客户端ping 本机 
  ... No Problem  ...

作者:Soulboy