Secure-Linux
Linux 加固+维护+应急响应参考
文档内容仅限 Linux ,web 服务和中间件的加固内容请看
加固
大纲
文件
可疑文件
最近文件
find / -ctime -2 # 查找72小时内新增的文件
find ./ -mtime 0 -name "*.jsp" # 查找24小时内被修改的 JSP 文件
find / *.jsp -perm 4777 # 查找777的权限的文件
临时文件
ls -a /tmp # 查看临时目录
配置文件
strings /usr/sbin/sshd | egrep '[1-9]{1,3}.[1-9]{1,3}.' # 分析 sshd 文件,是否包括IP信息
文件恢复
一点建议 : 业务系统,rm 删除后,没有立即关机,运行的系统会持续覆盖误删数据.所以对于重要数据,误删后请立即关机
apt-get install -y foremost
rm -f /dev/sdb1/photo1.png
foremost -t png -i /dev/sdb1
# 恢复完成后会在当前目录建立一个 output 目录,在 output 目录下会建立 png 子目录下会包括所有可以恢复的 png 格式的文件.
# 需要说明的是 png 子目录下会包括的 png 格式的文件名称已经改变,另外 output 目录下的 audit.txt 文件是恢复文件列表.
apt-get install -y extundelete
mkdir -p /backupdate/deldate
mkfs.ext4 /dev/sdd1
mount /dev/sdd1 /backupdate
cd /backupdate/deldate
touch del1.txt
echo " test 1" > del1.txt
md5sum del1.txt # 获取文件校验码
66fb6627dbaa37721048e4549db3224d del1.txt
rm -fr /backupdate/*
umount /backupdate # 卸载文件系统或者挂载为只读
extundelete /dev/sdd1 --inode 2 #查询恢复数据信息,注意这里的 --inode 2 这里会扫描分区 :
extundelete /dev/sdd1 --restore-file del1.txt # 如果恢复一个目录
extundelete /dev/sdd1 --restore-directory /backupdate/deldate # 恢复所有文件
extundelete /dev/sdd1 --restore-all # 获取恢复文件校验码,对比检测是否恢复成功
md5sum RECOVERED_FILES/ del1.txt
66fb6627dbaa37721048e4549db3224d RECOVERED_FILES/del1.txt
如果被误删的文件在根分区,那么你最好重启计算机,进入单用户模式,以只读的方式挂载根分区,然后再进行恢复.
进入单用户模式后,根分区还是以读写方式 mount 的,用下面的命令,把挂载方式由读写(rw)改为只读(ro): mount -o ro,remount /
如果被删除的文件不是根分区,也可以用 unmount 的方式将该分区卸载.假设文件在分区 /dev/sda3中,该分区挂载到 /home,那么我们用下面的命令来卸载: umount /dev/sda3
当然,在卸载前要保证没有程序在访问该分区,否则卸载会失败.所以,一般推荐进入单用户模式来恢复文件.
安装
访问 https://code.google.com/archive/p/ext3grep/downloads 下载源代码,这里以 ext3grep-0.10.2.tar.gz 为例
yum install -y e2fsprogs
yum install -y e2fsprogs-devel
tar zxf ext3grep-0.10.2.tar.gz
cd ./ext3grep-0.10.2
./configure
make
make install
如果 make 出错,修改 src/ext3.h
// ext3grep -- An ext3 file system investigation and undelete tool
//
//! @file ext3.h Declaration of ext3 types and macros.
//
// Copyright (C) 2008, by
//
// Carlo Wood, Run on IRC <[email protected]>
// RSA-1024 0x624ACAD5 1997-01-26 Sign & Encrypt
// Fingerprint16 = 32 EC A7 B6 AC DB 65 A6 F6 F6 55 DD 1C DC FF 61
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef EXT3_H
#define EXT3_H
#ifdef _LINUX_EXT2_FS_H
#error please include this file before any other includes of ext2fs/ext2_fs.h
#endif
#define s_clusters_per_group s_frags_per_group
// Use the header files from e2progs (http://e2fsprogs.sourceforge.net)
// We can use these headers and then everything named ext2 or ext3.
#include <ext2fs/ext2_fs.h> // Definitions of ext2, ext3 and ext4.
// All of the following is backwards compatible, so we can use the EXT2 versions.
#define EXT3_BLOCK_SIZE EXT2_BLOCK_SIZE
#define EXT3_FRAG_SIZE EXT2_FRAG_SIZE
#define EXT3_BLOCKS_PER_GROUP EXT2_BLOCKS_PER_GROUP
#define EXT3_INODES_PER_GROUP EXT2_INODES_PER_GROUP
#define EXT3_FIRST_INO EXT2_FIRST_INO
#define EXT3_INODE_SIZE EXT2_INODE_SIZE
#define EXT3_BLOCK_SIZE_BITS EXT2_BLOCK_SIZE_BITS
#define EXT3_DESC_PER_BLOCK EXT2_DESC_PER_BLOCK
#define EXT3_DIR_ROUND EXT2_DIR_ROUND
#define EXT3_DIR_REC_LEN EXT2_DIR_REC_LEN
#define EXT3_FT_DIR EXT2_FT_DIR
#define EXT3_FT_UNKNOWN EXT2_FT_UNKNOWN
#define EXT3_FT_MAX EXT2_FT_MAX
#define EXT3_MAX_BLOCK_SIZE EXT2_MAX_BLOCK_SIZE
#define EXT3_NDIR_BLOCKS EXT2_NDIR_BLOCKS
#define EXT3_IND_BLOCK EXT2_IND_BLOCK
#define EXT3_DIND_BLOCK EXT2_DIND_BLOCK
#define EXT3_TIND_BLOCK EXT2_TIND_BLOCK
#define EXT3_VALID_FS EXT2_VALID_FS
#define EXT3_ERROR_FS EXT2_ERROR_FS
#define EXT3_FT_REG_FILE EXT2_FT_REG_FILE
#define EXT3_FT_CHRDEV EXT2_FT_CHRDEV
#define EXT3_FT_BLKDEV EXT2_FT_BLKDEV
#define EXT3_FT_FIFO EXT2_FT_FIFO
#define EXT3_FT_SOCK EXT2_FT_SOCK
#define EXT3_FT_SYMLINK EXT2_FT_SYMLINK
#define EXT3_N_BLOCKS EXT2_N_BLOCKS
#define EXT3_DIR_PAD EXT2_DIR_PAD
#define EXT3_ROOT_INO EXT2_ROOT_INO
#define EXT3_I_SIZE EXT2_I_SIZE
#define EXT3_FEATURE_COMPAT_DIR_PREALLOC EXT2_FEATURE_COMPAT_DIR_PREALLOC
#define EXT3_FEATURE_COMPAT_IMAGIC_INODES EXT2_FEATURE_COMPAT_IMAGIC_INODES
#define EXT3_FEATURE_COMPAT_EXT_ATTR EXT2_FEATURE_COMPAT_EXT_ATTR
#define EXT3_FEATURE_COMPAT_RESIZE_INODE EXT2_FEATURE_COMPAT_RESIZE_INODE
#define EXT3_FEATURE_COMPAT_DIR_INDEX EXT2_FEATURE_COMPAT_DIR_INDEX
#define EXT3_FEATURE_INCOMPAT_COMPRESSION EXT2_FEATURE_INCOMPAT_COMPRESSION
#define EXT3_FEATURE_INCOMPAT_FILETYPE EXT2_FEATURE_INCOMPAT_FILETYPE
#define EXT3_FEATURE_INCOMPAT_META_BG EXT2_FEATURE_INCOMPAT_META_BG
#define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER
#define EXT3_FEATURE_RO_COMPAT_LARGE_FILE EXT2_FEATURE_RO_COMPAT_LARGE_FILE
#define EXT3_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
typedef ext2_super_block ext3_super_block;
typedef ext2_group_desc ext3_group_desc;
typedef ext2_inode ext3_inode;
typedef ext2_dir_entry_2 ext3_dir_entry_2;
// Get declaration of journal_superblock_t
#include <ext2fs/ext2fs.h>
// This header is a copy from e2fsprogs-1.40.7 except that the type
// of 'journal_revoke_header_t::r_count' was changed from int to __s32.
#include "kernel-jbd.h"
#ifndef USE_PCH
#include <stdint.h>
#endif
extern uint32_t inode_count_;
// This (POD) struct protects it's members so we
// can do access control for debugging purposes.
struct Inode : protected ext3_inode {
public:
__u16 mode(void) const { return i_mode; }
__u16 uid_low(void) const { return i_uid_low; }
off_t size(void) const { return EXT3_I_SIZE(this); }
__u32 atime(void) const { return i_atime; }
__u32 ctime(void) const { return i_ctime; }
__u32 mtime(void) const { return i_mtime; }
__u32 dtime(void) const { return i_dtime; }
__u16 gid_low(void) const { return i_gid_low; }
__u16 links_count(void) const { return i_links_count; }
__u32 blocks(void) const { return i_blocks; }
__u32 flags(void) const { return i_flags; }
__u32 const* block(void) const { return i_block; }
__u32 generation(void) const { return i_generation; }
__u32 file_acl(void) const { return i_file_acl; }
__u32 dir_acl(void) const { return i_dir_acl; }
__u32 faddr(void) const { return i_faddr; }
__u16 uid_high(void) const { return i_uid_high; }
__u16 gid_high(void) const { return i_gid_high; }
#ifndef i_reseved2
#define i_reserved2 osd2.hurd2.h_i_author
#endif
__u32 reserved2(void) const { return i_reserved2; }
void set_reserved2(__u32 val) { i_reserved2 = val; }
// Returns true if this inode is part of an ORPHAN list.
// In that case, dtime is overloaded to point to the next orphan and contains an inode number.
bool is_orphan(void) const
{
// This relies on the fact that time_t is larger than the number of inodes.
// Assuming we might deal with files as old as five years, then this would
// go wrong for partitions larger than ~ 8 TB (assuming a block size of 4096
// and twice as many blocks as inodes).
return i_links_count == 0 && i_atime && i_dtime < i_atime && i_dtime <= inode_count_;
}
// This returns true if dtime() is expected to contain a date.
bool has_valid_dtime(void) const
{
return i_dtime && !is_orphan();
}
// This returns true if the inode appears to contain data refering to a previously
// deleted file, directory or symlink but does not contain the block list anymore.
// That means it will return false for orphan-ed inodes, although they are basically
// (partially) deleted.
bool is_deleted(void) const
{
return i_links_count == 0 && i_mode && (i_block[0] == 0 ||
!((i_mode & 0xf000) == 0x4000 || (i_mode & 0xf000) == 0x8000));
}
};
#endif // EXT3_H
使用
在开始恢复前,选择一个目录来存放被恢复的文件.ext3grep 程序会在当前目录下创建一个名为 RESTORED_FILES 的目录来存放被恢复的文件.因此在运行 ext3grep 命令前,先要切换到一个你可读写的目录中.
因为进入了单用户模式,并且将根分区设成了只读,那么只能把恢复出来的文件放在U盘中了.因此,先 cd /mnt 进入U盘目录.如果你有幸记得你误删除的文件名及其路径的话,就可以直接用下面的命令进行恢复了:
ext3grep /dev/your-device --restore-file path/to/your/file/filename
# 需要注意的是,上面的文件路径,是在该分区上文件路径.假设我们要恢复 /dev/sda3 分区上文件,这个分区原来的安装点是 /home,现在想恢复文件 /home//vi/tips.xml,那么输入的命令应该是:
ext3grep /dev/sda3 --restore-file /vi/tips.xml
# 如果你忘记了文件名,或者你误删除的是一个目录而你无法记全该目录中的文件,你可以先用下面的命令查询一下文件名:
ext3grep /dev/sda3 --dump-names | tee filename.txt
上面的命令把 ext3grep 命令的输出记录到文件 filename.txt 中,你可以慢慢查看,或者使用 grep 命令过滤出你需要的信息.
当你知道了目录/文件的信息后,就可以用上面说的命令进行恢复了.
# 这款软件不能按目录恢复文件,只能执行恢复全部命令:
ext3grep /dev/sda3 --restore-all
binlog
开启 Binlog,让 ext3grep 从 Binlog 中恢复,对数据库场景有用.
系统
密码重置
centos7
- 在启动菜单选择启动内核,按 e 编辑,找到 rhgb quiet 一行,把
rhgb quiet
替换为init=/bin/bash
(临时生效) - 按
CTRL+X
进入单用户模式 - 挂载根文件系统:
mount -o remount,rw /
- 使用
passwd
命令直接设置 root 密码:passwd root
输入两次新密码. - 最后,执行如下命令更新 SELinux:
touch /.autorelabel
- 进入正常模式:
exec /sbin/init
现在可以使用新设置的 root 密码登录了.
Ubuntu14
-
方案一
- 重启电脑长按 shift 键直到进入进入 GRUB 引导模式,选择第二行 Ubuntu 高级选项, 选中直接回车
- 按 e 进入(recovery mode) 编译kernel进行启动参数
- 倒数第四行,删除
recovery nomodeset
,添加quiet splash rw init=/bin/bash
。然后按 F10, 启动。 - 运行后系统直接进入 root mode,输入:
passwd
-
方案二
- 重启电脑长按 shift 键直到进入进入 GRUB 引导模式,选择第二行 Ubuntu 高级选项, 选中直接回车
- 选择一个括号里是 recovery mode 的系统发行编号,回车进入
- 选择 root 项,回车
- 最下方输入 root 密码,回车,便会切换到 root 用户;此时需要输入此条命令
mount -o remount,rw /
回车,再用passwd 用户名
便可以修改密码了; - 继续输入
exit
返回,选中resume
,回车,此时会跳出一个确认界面,再回车即可
会话
查
who # 查看当前登录用户
w # 查看登录用户行为
last # 查看登录用户历史
防
pkill -u linfengfeiye # 直接剔除用户
ps -ef| grep pts/0 # 得到用户登录相应的进程号 pid 后执行
kill -9 pid # 安全剔除用户
修改账户超时值,设置自动注销时间
vim /etc/profile
TMOUT=600
命令记录
histroy # 查看 root 的历史命令
进入 /home
各帐号目录下的 .bash_history
查看普通帐号的历史命令
history优化
# 保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
# 记录IP,在 /etc/profile 的文件尾部添加如下行数配置信息
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
# 让配置生效
source /etc/profile
开机启动
查看开机启动服务
chkconfig # 查看开机启动服务命令
chkconfig --list | grep "3:启用\|3:开\|3:on\|5:启用\|5:开\|5:on"
ls /etc/init.d # 查看开机启动配置文件命令
cat /etc/rc.local # 查看 rc 启动文件
ls /etc/rc.d/rc[0~6].d
runlevel # 查看运行级别命令
查看计划任务
crontab -l # 计划任务列表
ls -alh /var/spool/cron # 默认编写的 crontab 文件会保存在 /var/spool/cron/用户名 下
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root
账号
异常查找
awk -F: '{if($3==0||$4==0)print $1}' /etc/passwd # 查看 UID\GID 为0的帐号
awk -F: '{if($7!="/usr/sbin/nologin"&&$7!="/sbin/nologin")print $1}' /etc/passwd # 查看能够登录的帐号
awk '/\$1|\$6/{print $1}' /etc/shadow # 查询可以远程登录的帐号信息
lastlog # 系统中所有用户最近一次登录信息
lastb # 显示用户错误的登录列表
users # 打印当前登录的用户,每个用户名对应一个登录会话。如果一个用户不止一个登录会话,其用户名显示相同次数
异常设置
/etc/passwd
- 若用户 ID=0,则表示该用户拥有超级用户的权限
- 检查是否有多个 ID=0
- 禁用或删除多余的账号
/etc/login.defs
PASS_MAX_DAYS 90 # 用户的密码最长使用天数
PASS_MIN_DAYS 0 # 两次修改密码的最小时间间隔
PASS_MIN_LEN 7 # 密码的最小长度
PASS_WARN_AGE 9 # 密码过期前多少天开始提示
当查到异常用户时,需要立即禁用
usermod -L user # 禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
userdel user # 删除user用户
userdel -r admin # 将删除user用户,并且将/home目录下的admin目录一并删除
安全配置
设置账户锁定登录失败锁定次数、锁定时间
vim /etc/pam.d/system-auth
auth required pam_tally.so onerr=fail deny=6 unlock_time=300 # 设置为密码连续输错6次,锁定时间300秒
auth required pam_tally.so deny=2 unlock_time=60 even_day_root root_unlock_time=60
安全审计
ps -ef | grep auditd # 查看是否开启系统安全审计功能
more /etc/audit/audit.rules # 查看审计的规则文件
- w 文件 -p 权限(r读 w写 x执行 a修改文件属性) -k 关键字
- w /etc/passwd -p wa -k passwd_changes # 对重要文件的操作行为进行监控
- a -系列动作 -S 系统调用名称 -F 字段-值 -k 关键字
- a exit,always -S mount -S umount # 对系统调用进行监控
more /etc/audit/auditd.conf # 查看安全事件配置
ausearch -i | less # 查看审计日志
more /var/log/audit/audit.log # 查看审计日志
audit
linux audit 子系统是一个用于收集记录系统、内核、用户进程发生的行为事件的一种安全审计系统。该系统可以可靠地收集有关上任何与安全相关(或与安全无关)事件的信息,它可以帮助跟踪在系统上执行过的一些操作。
audit 和 syslog 有本质区别。syslog 记录的信息有限,主要目的是软件调试,对于用户的操作行为(如某用户修改删除了某文件)却无法通过这些日志文件来查看。而 audit 的目的则不同,它是 linux 安全体系的重要组成部分,是一种 “被动” 的防御体系。
yum install audit*.* -y # 安装 audit
service auditd start # 启动 audit
service auditd status # 查看 audit 状态
# 开启了 autid 服务后,所有的审计日志会记录在 /var/log/audit/audit.log 文件中。
audit 安装后会生成 2 个配置文件:
- /etc/audit/auditd.conf
- /etc/audit/audit.rules
具体配置信息请查看 文件
audit 常用命令
ausearch # 查询 audit log 工具
aureport # 输出 audit 系统报告
auditctl -l # 查看 audit 规则
aureport --user
aureport --file
aureport --summary
# 配置记录命令rm命令执行
auditctl -w /bin/rm -p x -k removefile
SELinux
关闭 SELinux
-
需要重启
vim /etc/selinux/config SELINUX=disabled
-
不需要重启
setenforce 0
进程
进程定位
ps -aux # 列出所有进程以及相关信息命令
ps -ef
service --status-all | grep running
top # 总览系统全面信息命令
pidof name # 定位程序的 pid
pidof -x name # 定位脚本的 pid
lsof -g gid # 寻找恶意文件关联的 lib 文件
进程限制
ulimit -u 20 # 临时性允许用户最多创建 20 个进程,预防类似 fork 炸弹
vim /etc/security/limits.conf
user1 - nproc 20 # 退出后重新登录,就会发现最大进程数已经更改为 20 了
负载
文章
查询负载、进程监控
ps aux | grep Z # 列出进程表中所有僵尸进程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head # 获取占用CPU资源最多的10个进程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head # 获取占用内存资源最多的10个进程
清理缓存
sync # sync 命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件.否则在释放缓存的过程中,可能会丢失未保存的文件.
echo 1 > /proc/sys/vm/drop_caches # 清理 pagecache(页面缓存)
echo 2 > /proc/sys/vm/drop_caches # 清理 dentries(目录缓存)和inodes
echo 3 > /proc/sys/vm/drop_caches # 清理 pagecache、dentries 和 inodes
sync
系统完整性
通过 rpm 自带的 -Va 来校验检查所有的 rpm 软件包,查看哪些命令是否被替换了
rpm -Va
# 如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串,每个字符都用以表示文件与RPM数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。
验证内容中的8个信息的具体内容如下:
- S 文件大小是否改变
- M 文件的类型或文件的权限(rwx)是否被改变
- 5 文件MD5校验是否改变(可以看成文件内容是否改变)
- D 设备中,从代码是否改变
- L 文件路径是否改变
- U 文件的属主(所有者)是否改变
- G 文件的属组是否改变
- T 文件的修改时间是否改变
还原替换命令
rpm -qf /bin/ls # 查询 ls 命令属于哪个软件包
mv /bin/ls /tmp # 先把 ls 转移到 tmp 目录下,造成 ls 命令丢失的假象
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls # 提取 rpm 包中 ls 命令到当前目录的/bin/ls下
cp /root/bin/ls /bin/ # 把 ls 命令复制到 /bin/ 目录,修复文件丢失
日志
系统日志
- 内容见 日志
对于日志文件的保护
chattr +a xxx
chattr +a -R xxx # 递归式增加a权限
# a选项为append (追加) only ,即给日志文件加上a权限后,将只可以追加,不可以删除和修改之前的内容。
web日志
- 内容见 取证 中间件服务器程序日志部分
数据库日志
- 内容见 取证 数据库取证部分
Net
端口
查
getent services # 查看所有服务的默认端口名称和端口号
lsof -i -P # 显示进程使用端口使用情况
lsof -i:22 # 只查 22 端口
ss -tnlp
ss -tnlp | grep ssh
ss -tnlp | grep ":22"
netstat -tnlp
netstat -tnlp | grep ssh
nmap -sV -p 22 localhost
更多内容查看 网络
防
- EtherDream/anti-portscan: 使用 iptables 防止端口扫描
git clone https://github.com/EtherDream/anti-portscan cd anti-portscan vim install.sh # 修改需要打开的端口 sh install.sh
Firewall
查
firewall-cmd --list-services # 查看防火墙设置
firewall-cmd --state # 显示防火墙状态
firewall-cmd --get-zones # 列出当前有几个 zone
firewall-cmd --get-active-zones # 取得当前活动的 zones
firewall-cmd --get-default-zone # 取得默认的 zone
firewall-cmd --get-service # 取得当前支持 service
firewall-cmd --get-service --permanent # 检查下一次重载后将激活的服务
firewall-cmd --zone=public --list-ports # 列出 zone public 端口
firewall-cmd --zone=public --list-all # 列出 zone public 当前设置
cat /etc/hosts.deny # tcp_Wrappers 防火墙的配置文件,详情见 文件.md
cat /etc/hosts.allow # tcp_Wrappers 防火墙的配置文件,详情见 文件.md
防
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=internal --add-source=1.1.1.1
firewall-cmd --reload # 重启防火墙服务
在上面的配置中,如果有人尝试从 1.1.1.1 去 ssh,这个请求将会成功,因为这个源区域(internal)被首先应用,并且它允许 ssh 访问.
如果有人尝试从其它的地址,如 2.2.2.2,去访问 ssh,它不是这个源区域的,因为和这个源区域不匹配.因此,这个请求被直接转到接口区域(public),它没有显式处理 ssh,因为,public 的目标是 default,这个请求被传递到默认动作,它将被拒绝.
如果 1.1.1.1 尝试进行 http 访问会怎样?源区域(internal)不允许它,但是,目标是 default,因此,请求将传递到接口区域(public),它被允许访问.
现在,让我们假设有人从 3.3.3.3 拖你的网站.要限制从那个 IP 的访问,简单地增加它到预定义的 drop 区域,正如其名,它将丢弃所有的连接:
firewall-cmd --permanent --zone=drop --add-source=3.3.3.3
firewall-cmd --reload
下一次 3.3.3.3 尝试去访问你的网站,firewalld 将转发请求到源区域(drop).因为目标是 DROP,请求将被拒绝,并且它不会被转发到接口区域(public).
注:配置了 firewalld 服务后一定要去检查下规则,因为他不会阻掉正在进行的连接,只能阻掉配置命令后进行的连接,所以你不知道你的ssh会话会不会一断就再也连不上了,血的教训