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
在 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 四次挥手
# 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 体系,带来了很多突出的变化、更加全面、更加友好
。
Centos6 | CentOS7 | |
---|---|---|
服务管理 | service | systemctl |
启动项管理 | chkconfig | systemctl |
系统启动级别 | init | systemctl |
定时任务 | cron | timer |
日志管理 | syslog | Systemd-journal |
其他… | 环境变量设置、系统挂载、远程主机管理等… |
systemctl 支持管理的单元类型
systemctl 把不同的服务项定义成不同的单元类型,每个单位类型有专属的扩展名。
文件扩展名 | 作用 |
---|---|
.service | 用于定义系统服务 |
.target | 模拟实现"运行级别" |
.device | 定义内核识别设备 |
.mount | 文件系统挂载点 |
.socket | 进程间通信用的 socket 文件 |
.timer | 定时器 |
.snapshot | 管理系统快照 |
.swap | Swap 设备 |
.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(存在日志丢失的情况)
基础单元管理命令
基础命令 | 作用 |
---|---|
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 间可以互相关联
SysVinit | Systemd | |
---|---|---|
关闭 | 0 | runlevel0.target,poweroff.target |
单用户模式 | 1,s,single | runlevel1.target,poweroff.target |
多用户模式 | 2 | runlevel2.target,multi-user.target |
多用户带网络模式 | 3 | runlevel3.target,multi-user.target |
多用户、网络、图形化模式 | 5 | runlevel5.target,graphical.target |
重启操作系统 | 6 | runlevel6.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
SysVinit | Systemd | |
---|---|---|
启动服务 | service name start | systemctl start name |
关闭服务 | service name stop | systemctl stop name |
重启服务 | service name restart | systemctl restart name |
重载服务 | service name reload | systemctl reload name |
服务状态 | service name status | systemctl status name |
判断服务启动则重启服务 | service name condrestart | systemctl condrestart name |
编写单元文件
- 软件包安装的单元:/usr/lib/systemd/system/
- 系统管理员安装的单元:/etc/systemd/system/
定义服务启动类型 Type
服务类型 | 描述 |
---|---|
simple | (默认值)systemd 认为该服务将立即启动 |
forking | systemd 认为当该服务进程 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 #上次任务激活之后,每隔一周执行一次
- 实时定时器:通过日历事件激活定时任务。使用 OnCalender= 的方式来定义实时定时器。
实时定时器OnCalendar举例
[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:是 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 可以控制三种封包的流向:
- 封包进入 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 规则组成
组成部分:表[filter] + 链 + 规则
示例参考
数据包访问控制:
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 防火墙规则配置以及如何添加端口白名单
- 流入方向:默认阻止所有流量
- 出口方向:允许
- 配置原则:基于默认规则的基础上,添加白名单规则就可以了:允许哪些服务、哪些端口、哪些地址可以访问。
基于端口的白名单设置
# 查看默认区域下的状态信息
[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 ...