Linux基础-14-加密+安全
墨菲定律:一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的, 原话:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导 致灾难,则必定有人会做出这种选择
主要内容:
- 任何事都没有表面看起来那么简单
- 所有的事都会比你预计的时间长
- 会出错的事总会出错
- 如果你担心某种情况发生,那么它就更有可能发生
安全
安全机制
信息安全防护的目标
- 保密性 Confidentiality
- 完整性 Integrity
- 可用性 Usability
- 可控制性 Controlability
- 不可否认性 Non-repudiation
安全防护环节
- 物理安全:各种设备/主机、机房环境
- 系统安全:主机或设备的操作系统
- 应用安全:各种网络服务、应用程序
- 网络安全:对网络访问的控制、防火墙规则
- 数据安全:信息的备份与恢复、加密解密
- 管理安全:各种保障性的规范、流程、方法
安全攻击: STRIDE
- Spoofing 假冒
- Tampering 篡改
- Repudiation 否认
- Information Disclosure 信息泄漏
- Denial of Service 拒绝服务
- Elevation of Privilege 提升权限
设计原则
- 使用成熟的安全系统
- 以小人之心度输入数据
- 外部系统是不安全的
- 最小授权
- 减少外部接口
- 缺省使用安全模式
- 安全不是似是而非
- 从STRIDE思考
- 在入口处检查
- 从管理上保护好你的系统
安全算法
- 常用安全技术
- 认证
- 授权
- 审计
- 安全通信
- 加密算法和协议
- 对称加密
- 公钥加密
- 单向加密
- 认证协议
对称加密算法
- 对称加密:加密和解密使用同一个密钥
- DES:Data Encryption Standard,64bits
- 3DES:Triple DES
- AES:Advanced (128, 192, 256, 384bits)
- Blowfish
- Twofish
- IDEA
- RC6
- CAST5
- 特性:
- 加密、解密使用同一个密钥,效率高
- 将原始数据分割成固定大小的块,逐个进行加密
- 缺陷:
- 密钥过多
- 密钥分发
- 数据来源无法确认
非对称加密算法
- 基于一对公钥/密钥对
- 用密钥对中的一个加密,另一个解密
- 实现加密:
- 接收者
- 生成公钥/密钥对:P和S
- 公开公钥P,保密密钥S
- 发送者
- 使用接收者的公钥来加密消息M
- 将P(M)发送给接收者
- 接收者
- 使用密钥S来解密:M=S(P(M))
- 接收者
- 实现数字签名:
- 发送者
- 生成公钥/密钥对:P和S
- 公开公钥P,保密密钥S
- 使用密钥S来加密消息M
- 发送给接收者S(M)
- 接收者
- 使用发送者的公钥来解密M=P(S(M))
- 发送者
- 结合签名和加密
- 分离签名
RSA和DSA
RSA:公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA 数据安全有限公司。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目 前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于 一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积 进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
DSA (Digital Signature Algorithm):1991年7月26日提交,并归属于DavidW. Kravitz前NSA员工,DSA是Schnorr和ElGamal签名算法的变种,被美国 NIST作为SS(DigitalSignature Standard), DSA是基于整数有限域离散对数难 题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多
单向散列
将任意数据缩小成固定大小的“指纹”
- 任意长度输入
- 固定长度输出
- 有雪崩效应
- 若修改数据,指纹也会改变(“不会产生冲突”)
无法从指纹中重新生成数据(“单向”)
功能:校验数据完整性
常见算法
- md5: 128bits
- sha1: 160bits
- sha224
- sha256
- sha384
- 512
常用工具
- md5sum | sha1sum [ –check ] file
- openssl、gpg
- rpm -V
数字签名

应用程序:RPM
文件完整性的两种实施方式
被安装的文件
MD5单向散列
rpm --verify package_name(or -V)
发行的软件包文件
- GPG公钥签名
- rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
- rpm –checksig pakage_file_name (or -K)
密钥交换
密钥交换:IKE( Internet Key Exchange )
公钥加密:DH (Deffie-Hellman):生成会话密钥,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表,参看:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
DH:
A: g,p 协商生成公开的整数g, 大素数p
B: g,p
A:生成隐私数据 :a (a<p ),计算得出 g^a%p,发送给B
B:生成隐私数据 :b,计算得出 g^b%p,发送给A
A:计算得出 [(g^b%p)^a] %p = g^ab%p,生成为密钥
B:计算得出 [(g^a%p)^b] %p = g^ab%p,生成为密钥
gpg加密
对称加密
对称加密file文件
gpg -c filels file.gpg在另一台主机上解密file
gpg -o file -d file.gpg
公钥加密
在hostB主机上用公钥加密,在hostA主机上解密
在hostA主机上生成公钥/私钥对
gpg --gen-key在hostA主机上查看公钥
gpg --list-keys在hostA主机上导出公钥到xxx.pubkey
gpg -a --export -o xxx.pubkey从hostA主机上复制公钥文件到需加密的B主机上
scp xxx.pubkey hostB:在需加密数据的hostB主机上生成公钥/私钥对
gpg --list-keysgpg --gen-key在hostB主机上导入公钥
gpg --import xxx.pubkeygpg --list-keys用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
gpg -e -r wangxiaochun filefile file.gpg复制加密文件到hostA主机
scp fstab.gpg hostA:在hostA主机解密文件
gpg -d file.gpggpg -o file -d file.gpg删除公钥和私钥
gpg --delete-keys xxxgpg --delete-secret-keys xxx
中间人攻击

CA和证书
- PKI:Public Key Infrastructure
- 签证机构:CA(Certificate Authority)
- 注册机构:RA
- 证书吊销列表:CRL
- 证书存取库:
- X.509:定义了证书的结构以及认证协议标准
- 版本
- 序列
- 签名算法
- 颁发者
- 有效期限
- 主体名称
- 主体公钥
- CRL分发点
- 扩展信息
- 发行者签名
证书获取
- 证书类型:
- 证书授权机构的证书
- 服务器
- 用户证书
- 获取证书两种方法:
- 使用证书授权机构
- 生成证书请求(csr)
- 将证书请求csr发送给CA
- CA签名颁发证书
- 自签名的证书
- 自已签发自己的公钥
- 使用证书授权机构
安全协议
SSL:Secure Socket Layer,TLS: Transport Layer Security
- 1995:SSL 2.0 Netscape
- 1996:SSL 3.0
- 1999:TLS 1.0
- 2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346
- 2008:TLS 1.2 当前使用
- 2015:TLS 1.3
功能:机密性,认证,完整性,重放保护
两阶段协议,分为握手阶段和应用阶段
握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使 用的所有密钥都是通过MasterSecret生成
应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密 钥进行安全通信
SSL/TLS

- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身 份认证可选)、密钥交换
- ChangeCipherSpec 协议:一条消息表明握手协议已经完成
- Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别, fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续, 只是会给出错误警告
- Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
- HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二 进制形式传输
HTTPS结构

HTTPS工作过程

OpenSSL
OpenSSL:开源项目
三个组件:
- openssl:多用途的命令行工具,包openssl
- libcrypto:加密算法库,包openssl-libs,主要由开发者使用
- libssl:加密模块应用库,实现了ssl及tls,包nss,主要由开发者使用
openssl命令
两种运行模式:交互模式和批处理模式
openssl version:程序版本号
标准命令、消息摘要命令(dgst子命令)、加密命令(enc子命令)
标准命令:enc, ca, req, …
对称加密:
工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
enc命令:
- 帮助:
man enc- -e 加密 后+算法
- -d 解密 后+算法
- -a 以base64文本格式编码
- -salt 加盐
- -in 要加密的文件
- -out 加密后生成的文件
- 加密:
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher - 解密:
openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
- 帮助:
单向加密:
工具:md5sum, sha1sum, sha224sum,sha256sum…openssl dgst
dgst命令:
帮助:
man dgstopenssl dgst -md5 [-hex默认] /PATH/SOMEFILEopenssl dgst -md5 testfilemd5sum /PATH/TO/SOMEFILE
MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现 网络通信中保证所传输数据的完整性机制
- CBC-MAC
- HMAC:使用md5或sha1算法
生成用户密码:
passwd命令:
- 帮助:
man sslpasswd openssl passwd -1 -salt SALT(最多8位) -1表示使用md5算法- 例:
openssl passwd -1 –salt centos
- 帮助:
生成随机数:
帮助:
man sslrandopenssl rand -base64|-hex NUMNUM: 表示字节数,使用-hex,每个字符为十六进制,相当于4位二进制, 出现的字符数为NUM*2
公钥加密:
- 算法:RSA, ELGamal
- 工具:gpg, openssl rsautl(man rsautl)
数字签名:
- 算法:RSA, DSA, ELGamal
- 工具:gpg, openssl rsautl(man rsautl)
密钥交换:
算法:dh
DSA:Digital Signature Algorithm
DSS:Digital Signature Standard
RSA:
生成密钥对:
man genrsa生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS(umask 077; openssl genrsa –out test.key –des 2048)- umask用来设定/PATH/TO/PRIVATE_KEY文件的权限
- NUMBER_BITS 用来声明字节数,为2的整数倍
- ( )用来表示在子shell中运行,设定的内容对当前shell不产生影响
openssl rsa -in test.key –out test2.key将加密key解密从私钥中提取出公钥
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILEopenssl rsa –in test.key –pubout –out test.key.pub随机数生成器:伪随机数字
- 键盘和鼠标,块设备中断
- /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
- /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
CA和申请证书
PKI:Public Key Infrastructure
- CA
- RA
- CRL
- 证书存取库
建立私有CA:
- OpenCA
- openssl
证书申请及签署步骤:
- 生成申请请求
- RA核验
- CA签署
- 获取证书
创建私有CA:
openssl的配置文件:/etc/pki/tls/openssl.cnf
三种策略:match匹配、optional可选、supplied提供 match:要求申请填写的信息跟CA设置信息必须一致 optional:可有可无,跟CA设置信息可不一致 supplied:必须填写这项申请信息,
创建所需要的文件
touch /etc/pki/CA/index.txt生成证书索引数据库文件echo 01 > /etc/pki/CA/serial指定第一个颁发证书的序列号CA自签证书
生成私钥
cd /etc/pki/CA/(umask 077; openssl genrsa -des3 -out private/cakey.pem 2048)生成自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
选项说明:- -new:生成新证书签署请求
- -x509:生成自签格式证书,专用于创建私有CA时
- -key:生成请求时用到的私钥文件
- -days n:证书的有效期限
- -out /PATH/TO/SOMECERTFILE: 证书的保存路径
- 以上两步可以合成一步:
`openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt`
- 为CA提供所需的目录及文件
mkdir -pv /etc/pkl/CA/{certs,crl,newcerts}
颁发证书
在需要使用证书的主机生成证书请求
给web服务器生成私钥
`(umask 077; openssl genrsa –out /data/test.key 2048)`注意:在CentOS8.1中,密钥的长度不能指定1024,否则会报错!!!
生成证书申请文件
`openssl req -new -key /data/test.key -out /data/test.csr -days 365`
以上两步可合成一步
openssl req - newkey rsa:4096 -nodes sha256 -keyout client.key -out client.csr
将证书请求文件传输给CACA签署证书
`openssl ca -in /tmp/test.csr –out /etc/pki/CA/certs/test.crt -days 365`或者使用以下命令
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key - CAcreateserial out client.crt- 注意:默认要求国家,省,公司名称三项必须和CA一致
将证书颁发给请求者
查看证书中的信息:
`openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates` `openssl ca -status SERIAL` 查看指定编号的证书状态- 吊销证书
在客户端获取要吊销的证书的serial
openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,
吊销证书:openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pemSERIAL要换成证书真正的序列号
指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem查看crl文件:
openssl crl -in /etc/pki/CA/crl.pem -noout -text
SSH
ssh: secure shell, protocol, 22/tcp, 安全的远程登录
具体的软件实现:
- OpenSSH: ssh协议的开源实现,CentOS默认安装
- dropbear:另一个开源实现
SSH协议版本
- v1: 基于CRC-32做MAC,不安全;man-in-middle
- v2:双方主机协议选择安全的MAC方式
- 基于DH算法做密钥交换,基于RSA或DSA实现身份认证
Openssh软件组成
OpenSSH介绍
相关包:
- openssh
- openssh-clients
- openssh-server
工具:
- 基于C/S结构
- Linux Client: ssh, scp, sftp,slogin
- Windows Client:xshell, putty, securecrt, sshsecureshellclient
- Server: sshd
公钥交换

- 客户端发起链接请求
- 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
- 客户端生成密钥对
- 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
- 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
- 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
- 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
ssh加密通讯

ssh客户端
ssh配置文件:/etc/ssh/ssh_config
格式:
ssh [user@]host [COMMAND]ssh [-l user] host [COMMAND]常见选项
- -p:远程服务器监听的端口
- -b:指定连接的源IP
- -v:调试模式
- -C:压缩方式
- -X:支持x11转发
- -t:强制伪tty分配
ssh -t remoteserver1 ssh -t remoteserver2 ssh remoteserver3
允许实现对远程系统经验证地加密安全访问
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
ssh服务登录验证
- ssh服务登录的验证方式
- 用户/口令
- 基于密钥
基于用户/口令

客户端发起ssh请求,服务器会把自己的公钥发送给用户
用户会根据服务器发来的公钥对密码进行加密
加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥

基于密钥的登录方式
- 首先在客户端生成一对密钥(ssh-keygen)
- 并将客户端的公钥ssh-copy-id 拷贝到服务端
- 客户端再次发送一个连接请求,包括ip、用户名
- 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:abcdefg
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串用服务端的公钥发送给服务端
- 服务端接受到客户端发来的字符串后,用自己的私钥跟之前的字符串进行对比,如果一 致,就允许免密码登录
基于密钥的认证
在客户端生成密钥对
ssh-keygen -t rsa [-P ''] [-f “~/.ssh/id_rsa"]把公钥文件传输至远程服务器对应用户的家目录
ssh-copy-id [-i [identity_file]] [user@]host测试
在SecureCRT或Xshell实现基于key验证
在SecureCRT工具—>创建公钥—>生成Identity.pub文件
转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到 需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh 主机上执行:
ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys重设私钥口令:
ssh-keygen –p验证代理(authentication agent)保密解密后的密钥 这样口令就只需要输入一次。在GNOME中,代理被自动提供给root用户,否则运行
ssh-agent bash钥匙通过命令添加给代理 ssh-add
有关ssh的命令
scp命令:
scp [options] SRC... DEST/两种方式:
scp [options] [user@]host:/sourcefile/destpathscp [options] /sourcefile [user@]host:/destpath
常用选项:
-C 压缩数据流
-r 递归复制
-p 保持原文件的属性信息
-q 静默模式
-P PORT 指明remote host的监听的端口
rsync
参考
sftp
交互式文件传输工具
用法和传统的ftp工具相似
利用ssh服务实现安全的文件上传和下载
使用ls cd mkdir rmdir pwd get put等指令,可用?或help获取帮助信息
sftp [user@]hostsftp> help
ssh端口转发
SSH端口转发
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是, SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了 相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet, SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信 息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使 用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
- 加密 SSH Client 端至 SSH Server 端之间的通讯数据
- 突破防火墙的限制完成一些之前无法建立的 TCP 连接
本地转发:
-L localport:remotehost:remotehostport sshserver
选项:
- -f 后台启用
- -N 不打开远程shell,处于等待状态
- -g 启用网关功能
示例
ssh –L 9527:telnetsrv:23 -Nfg sshsrvtelnet 127.0.0.1 9527- 当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23
- data ⬅➡ localhost:9527 ⬅➡localhost:XXXXX ⬅➡sshsrv:22 ⬅➡
sshsrv:YYYYY ⬅➡telnetsrv:23
远程转发:
-R sshserverport:remotehost:remotehostport sshserver
示例:
ssh –R 9527:telnetsrv:23 –Nf sshsrv- 让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23
- Data ⬅➡ sshsrv:9527 ⬅➡ sshsrv:22 ⬅➡ localhost:XXXXX ⬅➡
localhost:YYYYY⬅➡ telnetsrv:23
动态端口转发:
当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internetssh -D 1080 root@sshserver -fNg在本机firefox设置代理socket proxy:127.0.0.1:1080
curl --socks5 127.0.0.1:1080 http://www.google.com
ssh服务端
服务器端:sshd, 配置文件: /etc/ssh/sshd_config
常用参数:
- Port
- ListenAddress ip
- LoginGraceTime 2m
- PermitRootLogin yes
- StrictModes yes 检查.ssh/文件的所有者,权限等
- MaxAuthTries 6
- MaxSessions 10 同一个连接最大会话
- PubkeyAuthentication yes
- PermitEmptyPasswords no
- PasswordAuthentication yes
- PermitEmptyPasswords no
- PasswordAuthentication yes
- GatewayPorts no
- ClientAliveInterval 单位:秒
- ClientAliveCountMax 默认3
- UseDNS yes
- GSSAPIAuthentication yes 提高速度可改为no
- MaxStartups 未认证连接最大值,默认值10
- Banner /path/file
限制可登录用户的办法:
- AllowUsers user1 user2 user3
- DenyUsers
- AllowGroups
- DenyGroups
- DenyGroups
最佳实践
禁止使用protocol version 1
限制可登录用户
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址
基于口令认证时,使用强密码策略
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志
sudo
配置文件:/etc/sudoers, /etc/sudoers.d/
时间戳文件:/var/db/sudo
日志文件:/var/log/secure
配置文件支持使用通配符glob
? 任意单一字符
*匹配任意长度字符
[wxc] 匹配其中一个字符
[!wxc] 除了这三个字符的其它字符
\x 转义
[[alpha]] 字母 示例: /bin/ls [[alpha]]*
配置文件规则有两类
- 别名定义:不是必须的
- 授权规则:必须的
更改身份
su 切换身份:su –l username –c ‘command’
sudo
来自sudo包,man 5 sudoers
sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
sudo可以提供日志,记录每个用户使用sudo操作
sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权 限和使用的主机
sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入 场券”
通过visudo命令编辑配置文件,具有语法检查功能 visudo -c 检查语法
visudo -f /etc/sudoers.d/test
sudoers
授权规则格式:
用户 登入主机=(代表用户) 命令
user host=(runas) command
示例:
root ALL=(ALL) ALL
格式说明:
- user: 运行命令者的身份
- host: 通过哪些主机
- runas:以哪个用户的身份
- command: 运行哪些命令
sudo别名和示例
别名
别名有四种类型:User_Alias,Runas_Alias,Host_Alias,Cmnd_Alias
别名格式:[A-Z]([A-Z][0-9]_)*
别名定义:
Alias_Type NAME1 = item1,item2,item3 : NAME2 = item4, item5User和runas:
- username
- #uid
- %group_name
- %#gid
- user_alias|runas_alias
host:
- ip或hostname
- network(/netmask)
- host_alias
command:
- command name
- directory
- sudoedit
- Cmnd_Alias
示例
示例1:
Student ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
示例2:
student ALL=(root) /sbin/pidof,/sbin/ifconfig
%wheel ALL=(ALL) NOPASSWD: ALL
示例3:
User_Alias NETADMIN= netuser1,netuser2
Cmnd_Alias NETCMD = /usr/sbin/ip
NETADMIN ALL=(root) NETCMD
示例4
User_Alias SYSADER=wang,mage,%admins
User_Alias DISKADER=tom
Host_Alias SERS=www.xxx.com,172.16.0.0/24
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk
SYSADER SERS= SYDCMD,DSKCMD
DISKADER ALL=(OP) DSKCMD
示例5:
User_Alias ADMINUSER = adminuser1,adminuser2
Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root
ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
示例6:
Defaults:wang runas_default=tom
xxx ALL=(tom,jerry) ALL
示例7:
wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd
示例8:
wang ALL=(ALL) /bin/cat /var/log/messages*
sudo命令
- ls -l /usr/bin/sudo
- sudo –i –u wang 切换身份
- sudo [-u user] COMMAND
- -V 显示版本信息等配置信息
- -u user 默认为root
- -l,ll 列出用户在主机上可用的和被禁止的命令
- -v 再延长密码有效期限5分钟,更新时间戳
- -k 清除时间戳(1970-01-01),下次需要重新输密码
- -K 与-k类似,还要删除时间戳文件
- -b 在后台执行指令
- -p 改变询问密码的提示符号
- 示例:-p ”password on %h for user %p:”
SELinux
安全扩展的Linux
工作于Linux内核中
DAC:自主访问控制法则
- MAC:强制访问控制
SELINUX工作级别:
strict: 每个进程都会受到selinux控制
- argetd: 仅有限的进程受到selinux控制,只监控容易被入侵的进程
sandbox:
ubject: 进程
- object:进程、文件
- 文件这里:根据 open read close 等操作作selinux限制
- SELINUX为每个文件提供安全变迁,也为进程提供了安全标签
- user:role:type
- user: selinux用户
- role:角色
- type:类型
- object:进程、文件
selinux规则库:
- 规则:哪种域能够访问哪种文件或那个进程等
- 配置selinux:
- selinux是否开启
- 给文件重新打标签
- 设定布尔值特性
selinux状态:
- enforcing: 强制; 每个受限的进程都必须执行selinux策略
- permissive: 启用,每个受限的进程违规操作不会禁止,但是会被记录到审计日志中
- disabled: 关闭
相关命令:
getenforce # 获取selinux当前状态
setenforce [0|1] # 设置当前selinux状态;
- 0:设置为permissive
- 1: 设置为enforcing
- 临时设置;重启后会失效
配置文件: /etc/selinux/config 永久生效
SELINUX={ enforcing|permissive|disabled }给文件重新打标签:
chcon命令: Change the SELinux security context of each FILE to CONTEXT.
使用方法:1
2
3
4Usage: chcon [OPTION]... CONTEXT FILE...
or: chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
or: chcon [OPTION]... --reference=RFILE FILE...
Change the SELinux security context of each FILE to CONTEXT.-R : 能够递归打标签
还原文件标签:
1
2
3[root@test ~]# restorecon --help
usage: restorecon [-iFnprRv0] [-e excludedir] pathname...
usage: restorecon [-iFnprRv0] [-e excludedir] -f file布尔型规则:
- getsebool # 获取bool规则 -a 参数: 获取所有
- setsebool # 设置bool规则
设置布尔型规则:
setsebool [ -NPV ] boolean value | bool1=val1 bool2=val2...
Iptables
防火墙基本概念
根据逻辑分类:
- 主机防火墙: 对单个主机进行防护
- window上的防火墙
- 云上的安全组
- 网络防火墙:对网络入口进行防护,防火墙的背后是本地局域网
- 安全厂商设备
- 云上的FaaS服务(对VPC网络进行防护)
- 主机防火墙(个人)和网络防火墙(集体)相辅相成的
- 主机防火墙: 对单个主机进行防护
根据物理分类
- 物理防火墙: 硬件级别实现部分防火墙功能;性能高,但是成本也高
- 软件防火墙: 应用软件出力逻辑运行于通用硬件平台上的防火墙;成本低,但是性能低
IPtables: 是一个客户端代理软件,用于将用户安全设定执行到对应的“安全框架”中;所以它能够实现的是软件防火墙
“安全框架” - Netfilter 位于在内核中
Netfilter - 内核空间;是真正去实现软件防火墙功能
Iptables - 用户空间;是一个用户空间的客户端代理软件
在用户空间中使用IPtables工具,将安全策略执行到内核空间中netfilter上从而来实现
Linux主机上的防火墙功能Netfilter是Linux操作系统下的包过滤防火墙的“安全框架”(免费);所以说IPtables没有守护进程,不是真正的服务,而是内核提供的功能
功能:
- 网络地址转换
- 数据包内容修改
- 数据包过滤的防火墙功能
IPtables基础
IPtables能够根据它的rule匹配而进对数据包进行处理:accept drop reject
- 不同的处理方式 -> 动作
rule存储在内核空间的信息过滤表中,这些规则指定:SIP DIP 传输协议类型(Tcp/Udp)等等
Netfilter 位于在内核空间中,设置了”关卡”: Input Output等等
网卡的驱动也是位于内核空间中,所以IPtables+Netfilter可以在内核空间中设置“关卡”,
当用户去访问应用服务的时候,数据包是通过网卡流经内核空间之后到达用户空间如果我们的报文需要转发,则不会经过Input和output链(即不会从用户空间绕一圈);只需要通过prerouting FORWARD postrouting链
- Input链 和 Output链 : 作用于数据包于用户空间和内核空间的流入流出
- prerouting FORWARD postrouting链: 在内核空间中关于数据包的流入流出及转发
常见应用场景:
- 到本地某个进程(服务)的报文: prerouting -> input -> ouput -> postrouting
- 由本地进行转发的报文: prerouting -> forward -> postrouting
IPtables缺点
高并发的情况下,不建议开启IPtables,会影响性能。
没有绝对安全的操作系统,虽然防火墙有这些缺点,但还是能阻挡大多数来自于外网的攻击!
- 防火墙虽然可以过滤互联网的数据包,但却无法过滤内部网络的数据包。因此若有人从内部网络攻击时,防火墙没有作用。
- 电脑本身的操作系统亦可能因一些系统漏洞,使入侵者可以利用这些漏洞绕过防火墙过滤,从而入侵电脑。
- 防火墙无法有效阻挡病毒攻击,尤其是隐藏在数据中的病毒。
- 正常状况下,所有互联网的数据包软件都应经过防火墙的过滤,这将造成网络交通的瓶颈。例如在攻击性数据包出现时,攻击者会不时寄出数据包,让防火墙疲于过滤数据包,而使一些合法数据包软件亦无法正常进出防火墙。
链的概念
- 防火墙的作用在于对经过的报文匹配“规则”,然后执行相对应的动作,如果有多个“规则”组合到一起,那么我们就称之“链”
- 每经过一条链则需要把所有规则都匹配一遍;如果有符合条件的规则,则执行相应动作即可
- 简单来说:多个规则组成链,经过链时,链上的所有规则需要匹配一遍,符合规则的条件,执行相应动作
- prerouting链:对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
- input链:进来的数据包应用此规则链中的策略
- forward链:转发数据包时应用此规则链中的策略
- output链:外出的数据包应用此规则链中的策略
- postrouting链: 对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
表的概念
每个链上都有一些规则,但是有许多相似的规则,这些规则可能是:
- 对IP或者端口进行过滤
- 对报文进行修改
- 对网络地址进行转化
….
把这些功能相似的规则的集合称之为“表”; 多张表的规则的集合叫做“链”
IPtables所有规则的定义:都是去定义到不同的表中
IPtables表:
- raw表:决定是否开启nat上启动的连接追踪机制; iptable_raw模块
- mangle表:解析报文,做出修改,并重新封装的功能; iptable_mangle模块
- nat表: 网络地址转换; iptable_nat模块
- filter表:负责过滤功能(包过滤防火墙使用到的表);iptables_filter模块
表存在优先级:raw -> mangle -> nat -> filter ; 优先级越高的表中规则优先匹配处理
表链关系
是不是每类链上的规则都会存在于4张表中? 肯定不是;每个链只能有某些规则 -> 拥有某些表
总结:每个链中的规则都会存在于哪些表中
- prerouting链: raw mangle nat
- input链: mangle filter nat
- forward链: mangle filter
- output链:raw mangle nat filter
- postrouting链: mangle nat
实际操作过程中,往往都是通过表为操作入口,查看表中对应的规则,以及该表上规则所作用的“链”
表 —— 链- raw表:prerouting output
- mangle表: prerouting input output forward postrouting
- nat表: prerouting input output postrouting
- filter表: input forward output
当一个数据包经过一个“链”的时候,会将当前链上的所有规则进行匹配,而定义的规则都汇聚到表中;匹配时,因此会存在于优先级,所以就拥有了表的优先级
注意:想要主机支持转发功能,需要开启内核中ip_forward参数
1 | echo "1">/proc/sys/net/ipv4/ip_forward |

规则概念

匹配条件 + 动作
规则:规则指定的匹配条件来尝试匹配流经的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理,并不再进行匹配,LOG除外。若未匹配到规则,则按默认的规则处理。
匹配条件:
- 基本匹配条件: SIP DIP等等
- 扩展匹配条件: Sport Dport等等
- 扩展匹配条件也是Netfilter中的一部分,以模块插件的形式存在,如果想要使用,则需要依赖对应的模块
处理动作:在IPtables中称之为“target”
- 常用动作:
- ACCEPT: 允许数据包通过
- DROP:直接丢弃数据包,没有任何响应信息
- REJECT:拒绝数据包通过,必要的时候会向发送端发送一个响应的拒接消息
- SNAT:源地址转换,解决内网用户同一个公网地址上网问题
- MASQUERADE: 是SNAT的一种特殊处理动作,适用于动态的,临时会变的公网IP地址
- DNAT:目的地址转换,解决外部网络访问内部局域网中的服务
- REDIRECT:在本地端口做端口映射,即重定向
- LOG:/var/log/message系统日志文件中记录日志信息,然后将数据包传递给下一条匹配条件,不催数据包做任何处理,只是进行记录
- 常用动作:
规则查询: 以filter表进行操作,filter负责过滤功能
[root@test ~]# iptables -t filter -L-t: 指定表
-L: 列出表中的规则,默认是所有链的规则
1
2
3[root@test ~]# iptables -t filter -vnL INPUT
Chain INPUT (policy ACCEPT 172 packets, 12678 bytes)
pkts bytes target prot opt in out source destination-v : 显示详细信息
-n : 展开数字
–line-numbers: 显示有序序号
policy : 当前链的默认策略
packets: 当前链默认策略匹配到的包的数量
bytes: 当前链默认策略匹配到的包的大小总和
pkts: 对应匹配到的报文个数
bytes: 对应匹配到的报文大小综合
target: 规则对应的处理动作
prot: 规则对应的传输协议
opt: 规格对应的选项
in: 数据包由哪个接口流入
out:数据包由哪个接口流出
- 即设置哪块网卡的报文需要匹配当前规则
source: 规则对应的SIP
destination: 规则对应的DIP
规则操作 : 增删改
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]增:
iptables -t filter -A INPUT -s x.x.x.x -j <action>
实例1:[root@test ~]# iptables -t filter -A INPUT -s 172.16.0.1 -j DROP# 关于源地址为172.16.0.1/16主机数据包报文的流入给drop掉-A : 追加
-I :在链的开头插入 在链名后可加数字代表第几个序列
iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
-j :匹配条件中的所对应动作
清除规则:iptables -t <tables..> -F <chains…>
方法1:根据规则的编号去删除规则
方法2:根据具体的匹配条件去删除规则
-D:删除指定链中的规则
iptables -D INPUT 3- -F:删除操作,清空当前表的所有规则
修改规则:
[root@test ~]# iptables -t filter -R INPUT 1 -s 172.16.10.0/24 -j ACCEPT[root@test ~]# iptables -t filter -P FORWARD DROP- -R:修改规则
- -P:修改链的默认规则的处理动作
保存规则:
iptables-save > /etc/sysconfig/iptables # 是系统启动后可导入的规则导入规则:
iptables-restore < /etc/sysconfig/iptables
注意事项:
- 不指定表名,默认指filter表
- 不指定链名,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 选项、链名、控制类型使用大写字母,其余均为小写字母
匹配条件
基本条件:
-s:指定源地址
-d:指定目的地址
-p:指定协议类型
-i / -o : 指定网卡流入和流出
- -i : prerouting INPUT FORWARD
- -o : output postrouting
tcp/udp扩展模块
- –sport: 指定源端口
- –dport:指定目的端口
–icmp-type ICMP类型
示例:我可以ping别人,别人不能ping通我
iptables -I INPUT -p icmp --icmp-type 0 -i ACCEPTiptables -I INPUT 2 -p icmp --icmp-type 3 -i ACCEPT
扩展条件:-m 需要模块支持
- tcp/udp扩展模块
- multiport 多端口 (,不连续;- 连续)
- –sports: 指定源端口
- –dports:指定目的端口
- multiport 多端口 (,不连续;- 连续)
- iprange扩展模块
- –src-range: 指定源地址范围
- –dst-range:指定目的地址范围
- string扩展模块:指定匹配报文中的字符串
- –algo: 指定匹配算法(bm和kmp)
- –string: 指定需要匹配的字符串
- time扩展模块:时间段匹配,如果报文在到达时间范围内,则符合匹配条件
- –timestart [起始时间] –tiemstop [结束时间]
- –weekdays: 指定星期
- –mouthdays: 指定日
- –datastart [起始日期] –datastop [结束日期]
- connlimit扩展模块:限制每个IP地址同时连接到Server端的连接数量,不需要指定IP地址,默认就是针对每个客户端IP地址
- –connlimit-above : 限制每个客户端IP的并发连接数量;如果高于此数量则执行响应动作
- –connlimit-upto : 限制每个客户端IP的并发连接数量;如果低于次数量则执行响应动作
- state
- –state 连接状态
- mac
- –mac-source 指定源mac地址
- tcp/udp扩展模块
自定义链
当默认链的规则非常多的时候,不方便我们管理,如果INPUT链中放置了几百条规则,我们可以针对不同服务(httpd ftp mysql);有针对性将规则放置到自定义链中,在其他5个链进行引用即可,此时当我们想要去修改关于某个服务的规则时,只需要去对应的自定义链中修改即可
- 创建自定义链:
1 | [root@test ~]# iptables -t filter -N httpd |
-N: 创建自定链
关于自定义链的增删改查同上
删除自定义链:
1
2
3[root@test ~]# iptables -t filter -F httpd # 1.清除自定义链中的规则
[root@test ~]# iptables -t filter -D INPUT 1 # 2.删除引用自定义链中的相关规则
[root@test ~]# iptables -t filter -X httpd # 3.通过-X参数删除自定义链- 关于删除自定义链规则:
- 自定义链中没有任何默认链的引用,即引用参数refer为0
- 自定义链中不能有任何规则,即自定义链为空
- 关于删除自定义链规则:
实验操作
1.批量添加防火墙的脚本(参考,自行更改)
1 |
|
2.网络地址转换
1 | vim /etc/sysctl.conf |
SNAT:将内网地址转化为公网地址
一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?我防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -j SNAT --to-source 10.0.0.1
DNAT:将公网地址转化为内网地址
如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?显然不可能了,所以只能使用PREROUTING
iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT --to-destination 192.168.123.0
3.删除已有规则
在开始创建iptables规则之前,你也许需要删除已有规则。命令如下:
1 | iptables -F |
4.设置链的默认策略
链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒
绝),命令如下:
1 | iptables -P INPUT DROP |
当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。
5. 阻止指定IP地址
例:丢弃来自IP地址x.x.x.x的包
1 | BLOCK_THIS_IP="x.x.x.x" |
注:当你在log里发现来自某ip地址的异常记录,可以通过此命令暂时阻止该地址的访问以做更深入分析
例:阻止来自IP地址x.x.x.x eth0 tcp的包
1 | iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP |
6.允许所有SSH的连接请求
例:允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包
1 | iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT |
7.仅允许来自指定网络的SSH连接请求
例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求
1 | iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j |
8.允许http和https的连接请求
例:允许所有来自web - http的连接请求
1 | iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT |
例:允许所有来自web - https的连接请求
1 | iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT |
9.使用multiport 将多个规则结合在一起
允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一
条规则。如下所示:
例:允许所有ssh,http,https的流量访问
1 | iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED |
10.允许从本地发起的SSH
1 | iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT |
请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。
在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。
11.仅允许从本地发起到一个指定的网络域的SSH请求
例:仅允许从内部连接到网域192.168.100.0/24
1 | iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state |
12.允许从本地发起的HTTPS连接请求
下面的规则允许输出安全的网络流量。如果你想允许用户访问互联网,这是非常有必要的。在服务器上,这些规则能让你使用wget从外部下载一些文件
1 | iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT |
注:对于HTTP web流量的外联请求,只需要将上述命令中的端口从443改成80即可。
13.负载平衡传入的网络流量
使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。
例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。
1 | iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every |
14.允许外部主机ping内部主机
1 | iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT |
15.允许内部主机ping外部主机
1 | iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT |
16.允许回环访问
例:在服务器上允许127.0.0.1回环访问。
1 | iptables -A INPUT -i lo -j ACCEPT |
17.允许内部网络域外部网络的通信
防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用以下规则允许内部网
络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例
如:192.168.1.x)。
1 | iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT |
18.允许出站的DNS连接
1 | iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT |
19.允许NIS连接
如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使
SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口
号,此例中为853和850端口。
1 | rpcinfo -p | grep ypbind |
例:允许来自111端口以及ypbind使用端口的连接请求
1 | iptables -A INPUT -p tcp --dport 111 -j ACCEPT |
注:当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP 2)
编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。
20.允许来自指定网络的rsync连接请求
例:允许来自网络192.168.101.0/24的rsync连接请求
1 | iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED |
21.允许来自指定网络的MySQL连接请求
很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部
网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:
1 | iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state |
22.允许Sendmail, Postfix邮件服务
Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。
1 | iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT |
23.允许IMAP和IMAPS
例:允许IMAP/IMAP2流量,端口为143
1 | iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT |
例:允许IMAPS流量,端口为993
1 | iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT |
24.允许POP3和POP3S
例:允许POP3访问
1 | iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT |
例:允许POP3S访问
1 | iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT |
25.防止DoS攻击
1 | iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT |
上述例子中:
-m limit: 启用limit扩展
–limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。
–limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。
26.端口转发
例:将来自422端口的流量全部转到22端口。
这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。
1 | iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22 |
除此之外,还需要允许连接到422端口的请求
1 | iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT |
27.记录丢弃的数据表
第一步:新建名为LOGGING的链
1 | iptables -N LOGGING |
第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中
1 | iptables -A INPUT -j LOGGING |
第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”
1 | iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --loglevel 7 |
第四步:丢弃这些数据包
1 | iptables -A LOGGING -j DROP |
Firewalld
动态防火墙后台服务程序:提供一个动态管理的防火墙,用以支持网络“Zone”,来分配对一个
网络链接和界面一定程序的信息,它具备对IPv4和Ipv6防火墙设置的支持它支持以太网桥,并有分离运行时间和永久配置选项,可以通过服务程序直接增加规则
图形化配置工具:firewall-config
命令行配置工具:firewall-cmd
用于配置firewalld服务永久性或者非永久性运行时间的改变,它依次用IPtables工具与执行
数据包筛选的内核中Netfilter通信
Firewalld和IPtables的关系
- firewalld和IPtables本身都不具备防火墙功能
- 他们都是在用户空间将执行规则放到内核空间的“安全框架”- Netfilter中去实现
Firewalld和IPtables的区别
- iptables 在 /etc/sysconfig/iptables-config中存放IPtables规则设置;Firewalld 在
/usr/lib/firewalld/* 中进行系统配置和/etc/firewalld/* 中关于服务xml文件格式的配置 - 在使用IPtables的时候,每去操作一条规则立即生效
- Firewalld不会创建任何新的规则,仅仅运行规则中的不同之处,因此Firewalld可以在运行时间内改变配置而不丢失现有的连接
Zone区域
不同区域对于网络连接的设置规范不同
区域 默认策略规则 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 拒绝流入的流量,除非与流出的流量相关
管理防火墙
每个zone中都有一套规则集,对于接收到的请求具体使用哪个zone,Firewalld通过三种方式来判断
- source 源地址优先级最高
- Interface 接收请求的网卡
- firewall.config 中配置的默认zone
1 | [root@test ~]# cat /etc/firewalld/firewalld.conf | grep Zone |
- 查看默认zone:
[root@test ~]# firewall-cmd --get-default-zone - 设置默认zone:
--set-default-zone=<zone> - 查看当前firewalld状态:
[root@test ~]# firewall-cmd --state - 查看当前活动的zone:
[root@test ~]# firewall-cmd --get-active-zones - 列出所有可用zone:
[root@test ~]# firewall-cmd --list-all-zones - 列出所有区域设置:
--list-all - 列出所有预定服务:
--get-services # 所有已经设定好的可直接使用的服务规则 - 将某个网络地址放置/移除某个zone
--add-source=<source>[/<mask>]|<MAC>|ipset:<ipset>--remove-source=<source>[/<mask>]|<MAC>|ipset:<ipset>
管理操作
| 参数 | 作用 |
|---|---|
| –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 | 关闭应急状况模式 |
- 添加、删除、改变网络接口到制定域中(域中会有一条规则)
--list-interfaces--add-interface=<interface>--change-interface=<interface>--remove-interface=<interface>--query-interface=<interface>
- 添加、删除、列出服务
--get-services--delete-service=<service>--add-service=<service>--list-services--remove-service=<service>--query-service=<service>
- 列出、添加、删除端口
--list-ports List ports added for a zone [P] [Z]--add-port=<portid>[-<portid>]/<protocol>--remove-port=<portid>[-<portid>]/<protocol>--query-port=<portid>[-<portid>]/<protocol>
- 永久生效:
--permanent - 重载防火墙:
--reload
实验操作
1.查看firewalld服务当前所使用的区域
1 | [root@localhost ~]# firewall-cmd --get-default-zone |
2.查询ens33网卡再firewalld服务中的区域
1 | [root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33 |
3.把firewalld服务中ens33网卡的默认区域修改为external,并在系统重启后生效。分别查看当前与永久模式下的区域名称
1 | [root@localhost ~]# firewall-cmd --permanent --zone=external --changeinterface=ens33 |
4.把firewalld服务的当前默认区域设置为public
1 | [root@localhost ~]# firewall-cmd --set-default-zone=public |
5.启动/关闭firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用)
1 | [root@localhost ~]# firewall-cmd --panic-on |
6.查询public区域是否允许请求SSH和HTTPS协议的流量
1 | [root@localhost ~]# firewall-cmd --zone=public --query-service=ssh |
7.把firewalld服务中请求HTTPS协议的流量设置为永久允许,并立即生效
1 | [root@localhost ~]# firewall-cmd --zone=public --add-service=https |
8.把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效
1 | [root@localhost ~]# firewall-cmd --zone=public --remove-service=https -- |
9.把在firewalld服务中访问8080和8081端口的流量策略设置为允许,但仅限当前生效
1 | [root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp |
10.把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效firewall-cmd --permanent --zone=<区域> --add-forward-port=port= <源端口号>:proto=<协议 \>:toport=<目标端口号>:toaddr=<目标IP地址>
1 | [root@localhost ~]# firewall-cmd --permanent --zone=public --add-forwardport=port=888:proto=tcp:toport=22:toaddr=192.168.91.128 |
firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和
目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比
如,我们可以在firewalld服务中配置一条富规则,使其拒绝192.168.91.0/24网段的所有用户访问本机的
ssh服务(22端口)
1 | [root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule |


