分类目录归档:技术文献

FFmpeg之ffplay命令使用

一些通用选项

'-L' 显示 license
'-h, -?, -help, --help [arg]' 打印帮助信息;可以指定一个参数 arg ,如果不指定,只打印基本选项
可选的 arg 选项:
'long' 除基本选项外,还将打印高级选项
'full' 打印一个完整的选项列表,包含 encoders, decoders, demuxers, muxers, filters 等的共享以及私有选项
'decoder=decoder_name' 打印名称为 "decoder_name" 的解码器的详细信息
'encoder=encoder_name' 打印名称为 "encoder_name" 的编码器的详细信息
'demuxer=demuxer_name' 打印名称为 "demuxer_name" 的 demuxer 的详细信息
'muxer=muxer_name' 打印名称为 "muxer_name" 的 muxer 的详细信息
'filter=filter_name' 打印名称为 "filter_name" 的过滤器的详细信息
'-version' 显示版本信息
'-formats' 显示有效的格式
'-codecs' 显示 libavcodec 已知的所有编解码器
'-decoders' 显示有效的解码器
'-encoders' 显示有效的编码器
'-bsfs' 显示有效的比特流过滤器
'-protocols' 显示有效的协议
'-filters' 显示 libavfilter 有效的过滤器
'-pix_fmts' 显示有效的像素格式
'-sample_fmts' 显示有效的采样格式
'-layouts' 显示通道名称以及标准通道布局
'-colors' 显示认可的颜色名称
'-hide_banner' 禁止打印欢迎语;也就是禁止默认会显示的版权信息、编译选项以及库版本信息等

一些主要选项

'-x width' 强制以 "width" 宽度显示

'-y height' 强制以 "height" 高度显示

'-an' 禁止音频

'-vn' 禁止视频

'-ss pos' 跳转到指定的位置(秒)

'-t duration' 播放 "duration" 秒音/视频

'-bytes' 按字节跳转

'-nodisp' 禁止图像显示(只输出音频)

'-f fmt' 强制使用 "fmt" 格式

'-window_title title' 设置窗口标题(默认为输入文件名)

'-loop number' 循环播放 "number" 次(0将一直循环)

'-showmode mode' 设置显示模式

可选的 mode :

'0, video' 显示视频

'1, waves' 显示音频波形

'2, rdft' 显示音频频带

默认值为 'video',你可以在播放进行时,按 "w" 键在这几种模式间切换

'-i input_file' 指定输入文件

一些高级选项

'-sync type' 设置主时钟为音频、视频、或者外部。默认为音频。主时钟用来进行音视频同步

'-threads count' 设置线程个数

'-autoexit' 播放完成后自动退出

'-exitonkeydown' 任意键按下时退出

'-exitonmousedown' 任意鼠标按键按下时退出

'-acodec codec_name' 强制指定音频解码器为 "codec_name"

'-vcodec codec_name' 强制指定视频解码器为 "codec_name"

'-scodec codec_name' 强制指定字幕解码器为 "codec_name"

一些快捷键

'q, ESC' 退出

'f' 全屏

'p, SPC' 暂停

'w' 切换显示模式(视频/音频波形/音频频带)

's' 步进到下一帧

'left/right' 快退/快进 10 秒

'down/up' 快退/快进 1 分钟

'page down/page up' 跳转到前一章/下一章(如果没有章节,快退/快进 10 分钟)

'mouse click' 跳转到鼠标点击的位置(根据鼠标在显示窗口点击的位置计算百分比)

作者:航行在蓝天的蚂蚱
来源:CSDN
原文:https://blog.csdn.net/xuyankuanrong/article/details/77529468
版权声明:本文为博主原创文章,转载请附上博文链接!

GnuPG 使用

开始使用
生成密钥
GnuPG 使用公钥来进行加密,使用私钥来解密。

gpg –gen-key
它用来生成你的密钥:流程如下:

[11:26:12] emacsist:~ $ gpg --gen-key
gpg (GnuPG) 2.0.30; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
# 使用哪种类型的密钥(默认的就够了)
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
# 密钥的长度
What keysize do you want? (2048) 2048
Requested keysize is 2048 bits
# 密钥有效期(默认为永不过期,默认的也够了)
Please specify how long the key should be valid.
0 = key does not expire
= key expires in n days
w = key expires in n weeks
m = key expires in n months
y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
# 以上信息是否正确
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.
# 你的真实名
Real name: emacsist
# 你的邮箱
Email address: emacsist@qq.com
# 备注
Comment:
You selected this USER-ID:
"emacsist "

# 是否要修改名字,备注,邮箱或OK、退出?
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

# 以上步骤完成后,就要输入保护私钥的密码了,这个也是整个GnuPG最脆弱的环节
密钥的废除
如果你忘记了私钥的保护密码或者丢失了私钥,你可以使用这个来发布通知,让其他人知道该公钥已经不再会使用:

gpg --output revoke.asc --gen-revoke emacsist@qq.com
这个要在确认你的密钥无效了的情况下才公布这个证书,在此之前,要确保其他人访问不了这个证书,否则其他人也可以发布这个证书然后让你的公钥失效。

交换密钥
导出公钥
为了发送你的公钥给其他人,首先你要导出它。

gpg --output emacsist.gpg --export emacsist@qq.com
默认情况下,导出的是二进制格式的。GnuPG 支持一个选项: –armor 它可以导出为 ASCII 格式。在任何导出的选项中,都可以使用这个选项来指定导出为 ASCII 格式。

列出公密钥
gpg --list-keys
导入公钥
gpg --import emacsist.gpg
删除某个公钥
gpg --delete-key emacsist@qq.com
验证公钥
一旦导入了一个公钥,就需要去进行验证它了

[11:56:22] emacsist:/tmp $ gpg --edit-key emacsist@qq.co
gpg (GnuPG) 2.0.30; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

pub 2048R/2E67BCA8 created: 2017-03-29 expires: never usage: SC
trust: ultimate validity: ultimate
sub 2048R/FCB22855 created: 2017-03-29 expires: never usage: E
[ultimate] (1). emacsist

gpg> fpr
pub 2048R/2E67BCA8 2017-03-29 emacsist
Primary key fingerprint: B698 23B4 571F 98EE CEDA 59C9 2B07 0A29 2E67 BCA8

gpg>
fpr 就会打印出该密钥的指纹,然后再通过拥有者的电话,或者email(或其他任何方式,只要你能保证他是该密钥的真实拥有者即可),然后让密钥拥有者将它的密钥指纹发给你,然后再进行二者对比,验证是否一致即可。

检测完密钥的指纹后,就可以进行签名认证它了。在上面后续命令中,输入 sign 即可。

导出私钥
gpg --output emacsist@qq.com.private.key --export-secret-keys emacsist@qq.com
导入私钥
gpg --allow-secret-key-import --import emacsist@qq.com.private.key
列出私钥
gpg --list-secret-keys
删除一个私钥:
gpg --delete-secret-key emacsist@qq.com
信任密钥
gpg -edit-key emacsist@qq.com
然后输入 trust 注意,此时要将相应的 gpg 进程退出后才能重新生效。不然,还会报 untrust 的警告。

加解密文档
加密文档
使用公钥来进行加密
gpg --output hello.txt.gpg --encrypt --recipient emacsist@qq.com hello.txt
–recipient 可以有多个同名选项来分别指定不同的公钥,加密后的文档,只能用这些公钥对应的私钥之一来进行解密。

多个公钥的话,可以这样子指定:

gpg --output hello.txt.gpg --encrypt --recipient emacsist@qqcom --recipient emacsist1@qq.com hello.txt
特别地,你自己并不能解密你加密后的文档,除非你将你自己的公钥与写在了 –recipient 列表中

使用对称密码来进行加密
gpg --output hello.symmetric.gpg.txt --symmetric hello.txt
回车后,它会要求你输入密码来保护这个文档,注意,这个密码,并不是那个保护私钥的密码,也不要与保护私钥的密码相同。这个在解密时,也需要输入同样的文档密码来进行解密。这一般用在不需要与其他人进行通信时使用的加密方式。

解密文档
解密使用公钥来进行加密的文档
gpg --output hello.decrypt.txt --decrypt hello.txt.gpg
解密使用对称密码来进行加密的文档
gpg --output hello.symmetric.txt --decrypt hello.symmetric.gpg.txt

[12:18:26] emacsist:/tmp $ cat hello.symmetric.txt
Hello World
数字签名
签名
它是使用私钥来创建,然后使用公钥来进行验证的。

gpg --output hello.txt.sign --sign hello.txt
验证或恢复原文
给出一个签名的文档,你可以验证它或者验证并恢复原文。(因为签名后的内容是压缩的,并且是二进制格式的)

仅验证
gpg --verify hello.txt.sign
验证和恢复
gpg --output hello.sig.txt --decrypt hello.txt.sign
签名但并不压缩文档
默认情况下,使用 –sign 会进行签名并压缩文档。 但也可以使用 –clearsign 选项,来将文档和签名分开显示。例如:

gpg --output hello.sign --clearsign hello.txt
它的输出如下:

[12:36:42] emacsist:/tmp $ cat hello.sign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Hello World
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBCAAGBQJY3ItWAAoJECsHCikuZ7yo7rwH/1mfxVtxXexHsnKamR434Fjt
jjhIy27PajVecm7byyHLHrBCP/meDk4jl+wDDPpE8+0FJE17M8opW1YFZUzUXj52
bG+0kLZNtuIn2f3ybbsXGfcvmxo4n7B7jvDHJBqHDS8OMoc2nfUurN/XbYO10Mm3
YmBoEKjxk2Q6DHU3eJlnaOWXdPhZzCt24zjCrMdkG5iZln80TMHJyxXJD63zBzB1
dkHpX/vYgmy2EzDMZXBApatzSoys0/siGlZ64jnS8m61zlWPLhpMl3haSAPk5VDx
+ydw/c/9SO3cVjTzWLmXfW3hvvN/UW/HDOHb1j29yUhalztI1zTtEm2VyHiKJFo=
=LP7m
-----END PGP SIGNATURE-----
可以看到,上面显示了文档的原文,下面显示了文档的签名。

分开签名
gpg --output hello.detached.sign.txt --detach-sign hello.txt
这样子签名后,需要同时验证原文件和签名文件,用选项: –verify :

[12:40:37] emacsist:/tmp $ gpg --verify hello.detached.sign.txt hello.txt
gpg: Signature made Thu Mar 30 12:40:28 2017 CST using RSA key ID 2E67BCA8
gpg: Good signature from "emacsist " [ultimate]
没问题的话,它会报告: Good signature

概念
GnuPG 使用几种加密方式:

对称加密
使用同样的 key 来进行加解密,例子有: 3DES , Blowfish , 以及 IDEA
公钥加密
使用对称加密的问题并不在于它的安全性,而是在交换 key 。攻击者容易拦截 key 并破解它;另一个问题是如果有N个人需要通信,则就需要有 n(n-1)/2 个 key了。这在小范围通信还好,如果是与大量的人进行这样子的通信,就不是一个明智的选择了。 公钥加密就是用来避交换 key 的问题的。公钥用来进行加密,私钥来来进行解密。
(no term)
单向散列
杂交加密
公钥加密并不是万能的。它同时使用对称加密和公钥加密。
数字签名
一个哈希函数,是一个多对一映射的函数。一个文档的数字签名就是将一份文档应用到一个哈希函数得出的结果。这个函数要满足以下两个特性:

比较困难地将两份不同的文档产生出同一个值
给出一个哈希值,比较困难地还原该文档
密钥管理
篡改密钥是一个使用公钥方式的一个主要弱点。在GnuPG 中管理密钥的关键就是 签名密钥

比如:

chloe% gpg -edit-key chloe@cyb.org
Secret key is available.
pub 1024D/26B6AAE1 created: 1999-06-15 expires: never
sub 2048g/0CF8CB7A created: 1999-06-15 expires: never
sub 1792G/08224617 created: 1999-06-15 expires: 2002-06-14
sub 960D/B1F423E7 created: 1999-06-15 expires: 2002-06-14
(1) Chloe (Jester)
(2) Chloe (Plebian)
Command>
说明:

第一列
pub 表示是 master signing key 的公开部分
第二列
指示该 key 的位的长度,类型以及ID。D表示类型为 DSA; g表示是仅为加密的 ElGamal key ;G表示是 ElGamal key 它可用时用于加密和签名。
第三列
创建时间
第四列
过期时间
用户的ID也紧跟其后。

GnuPG1 与 GnuPG2 、GnuPG2.1 区别
https://superuser.com/questions/655246/are-gnupg-1-and-gnupg-2-compatible-with-each-other

GnuPG 1
gpg 仍然保留用作嵌入式和服务器端使用,这个更少依赖以及更小的二进制文件。 来自 man gpg :

This is the standalone version of gpg. For desktop use you should consider using gpg2.

GnuPG 2
gpg2 是 gpg 的重新设计版本—— 但是更多的是在内部级别的更改。较新的版本分为多个模块,例如,有可用于 X.509 的模块

来自 man gpg2

In contrast to the standalone version gpg, which is more suited for server and embedded platforms, this version is commonly installed under the name gpg2 and more targeted to the desktop as it requires several other modules to be installed.

GnuPG 2.1
GnuPG 2.1是一个重要的变化,它将以前分开的公钥和私钥(pubring.gpg vs secring.gpg)组合到公钥匙中。这是以兼容的方式实现的,所以当GnuPG 2.1集成了私有密钥环时,您仍然可以使用GnuPG 1,但私有密钥的更改不会出现在相应的其他实现中。

[…]允许与GnuPG 2.1共同存在较旧的GnuPG版本。 然而,使用新gpg的私钥的任何更改在使用2.1版本的GnuPG之前都不会出现,反之亦然。

emacs 中使用 GnuPG 来加解密注意事项
本人在使用的过程中,最好在 emacs orgmode 中使用 GnuPG1 来进行加解密。不然容易有一些其他的问题。比如这个:

https://emacs-china.org/t/org-crypt/2585

Iptables与Firewalld防火墙

章节简述:

保障数据的安全性是继保障数据的可用性之后最为重要的一项工作。防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用。考虑到大家还不了解RHEL 7中新增的firewalld防火墙与先前版本中iptables防火墙之间的区别,刘遄老师决定先带领读者从理论层面和实际层面正确地认识在这两款防火墙之间的关系。

本章将分别使用iptables、firewall-cmd、firewall-config和TCP Wrappers等防火墙策略配置服务来完成数十个根据真实工作需求而设计的防火墙策略配置实验。在学习完这些实验之后,各位读者不仅可以熟练地过滤请求的流量,还可以基于服务程序的名称对流量进行允许和拒绝操作,确保Linux系统的安全性万无一失。

 

8.1 防火墙管理工具

众所周知,相较于企业内网,外部的公网环境更加恶劣,罪恶丛生。在公网与企业内网之间充当保护屏障的防火墙(见图8-1)虽然有软件或硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就可以保证仅有合法的流量在企业内网和外部公网之间流动了。

图8-1  防火墙作为公网与内网之间的保护屏障

在RHEL 7系统中,firewalld防火墙取代了iptables防火墙。对于接触Linux系统比较早或学习过RHEL 6系统的读者来说,当他们发现曾经掌握的知识在RHEL 7中不再适用,需要全新学习firewalld时,难免会有抵触心理。其实,iptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。换句话说,当前在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。大家甚至可以不用完全掌握本章介绍的内容,只要在这多个防火墙管理工具中任选一款并将其学透,就足以满足日常的工作需求了。

8.2 Iptables

在早期的Linux系统中,默认使用的是iptables防火墙管理服务来配置防火墙。尽管新型的firewalld防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用iptables。考虑到iptables在当前生产环境中还具有顽强的生命力,以及为了使大家在求职面试过程中被问到iptables的相关知识时能胸有成竹,刘遄老师觉得还是有必要在本书中好好地讲解一下这项技术。更何况前文也提到,各个防火墙管理工具的配置思路是一致的,在掌握了iptables后再学习其他防火墙管理工具时,也有借鉴意义。

8.2.1 策略与规则链

防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。

iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:

在进行路由选择前处理数据包(PREROUTING);

处理流入的数据包(INPUT);

处理流出的数据包(OUTPUT);

处理转发的数据包(FORWARD);

在进行路由选择后处理数据包(POSTROUTING)。

一般来说,从内网向外网发送的流量一般都是可控且良性的,因此我们使用最多的就是INPUT规则链,该规则链可以增大黑客人员从外网入侵内网的难度。

比如在您居住的社区内,物业管理公司有两条规定:禁止小商小贩进入社区;各种车辆在进入社区时都要登记。显而易见,这两条规定应该是用于社区的正门的(流量必须经过的地方),而不是每家每户的防盗门上。根据前面提到的防火墙策略的匹配顺序,可能会存在多种情况。比如,来访人员是小商小贩,则直接会被物业公司的保安拒之门外,也就无需再对车辆进行登记。如果来访人员乘坐一辆汽车进入社区正门,则“禁止小商小贩进入社区”的第一条规则就没有被匹配到,因此按照顺序匹配第二条策略,即需要对车辆进行登记。如果是社区居民要进入正门,则这两条规定都不会匹配到,因此会执行默认的放行策略。

但是,仅有策略规则还不能保证社区的安全,保安还应该知道采用什么样的动作来处理这些匹配的流量,比如“允许”、“拒绝”、“登记”、“不理它”。这些动作对应到iptables服务的术语中分别是ACCEPT(允许流量通过)、REJECT(拒绝流量通过)、LOG(记录日志信息)、DROP(拒绝流量通过)。“允许流量通过”和“记录日志信息”都比较好理解,这里需要着重讲解的是REJECT和DROP的不同点。就DROP来说,它是直接将流量丢弃而且不响应;REJECT则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。

我们来举一个例子,让各位读者更直观地理解这两个拒绝动作的不同之处。比如有一天您正在家里看电视,突然听到有人敲门,您透过防盗门的猫眼一看是推销商品的,便会在不需要的情况下开门并拒绝他们(REJECT)。但如果您看到的是债主带了十几个小弟来讨债,此时不仅要拒绝开门,还要默不作声,伪装成自己不在家的样子(DROP)。

当把Linux系统中的防火墙策略设置为REJECT拒绝动作后,流量发送方会看到端口不可达的响应:

而把Linux系统中的防火墙策略修改成DROP拒绝动作后,流量发送方会看到响应超时的提醒。但是流量发送方无法判断流量是被拒绝,还是接收方主机当前不在线:

8.2.2 基本的命令参数

iptables是一款基于命令行的防火墙策略管理工具,具有大量参数,学习难度较大。好在对于日常的防火墙策略配置来讲,大家无需深入了解诸如“四表五链”的理论概念,只需要掌握常用的参数并做到灵活搭配即可,这就足以应对日常工作了。

iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。另外,再次提醒一下,防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。表8-1总结归纳了常用的iptables命令参数。再次强调,我们无需死记硬背这些参数,只需借助下面的实验来理解掌握即可。

表8-1                                           iptables中常用的参数以及作用

参数 作用
-P 设置默认策略
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号“!”表示除这个IP外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如TCP、UDP、ICMP
--dport num 匹配目标端口号
--sport num 匹配来源端口号

在iptables命令后添加-L参数查看已有的防火墙规则链:

在iptables命令后添加-F参数清空已有的防火墙规则链:

把INPUT规则链的默认策略设置为拒绝:

如前面所提到的防火墙策略设置无非有两种方式,一种是“通”,一种是“堵”,当把INPUT链设置为默认拒绝后,就要往里面写入允许策略了,否则所有流入的数据包都会被默认拒绝掉,同学们需要留意规则链的默认策略拒绝动作只能是DROP,而不能是REJECT。

向INPUT链中添加允许ICMP流量进入的策略规则:

在日常运维工作中,经常会使用ping命令来检查对方主机是否在线,而向防火墙的INPUT规则链中添加一条允许ICMP流量进入的策略规则就默认允许了这种ping命令检测行为。

删除INPUT规则链中刚刚加入的那条策略(允许ICMP流量),并把默认策略设置为允许:

将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量

再次重申,防火墙策略规则是按照从上到下的顺序匹配的,因此一定要把允许动作放到拒绝动作前面,否则所有的流量就将被拒绝掉,从而导致任何主机都无法访问我们的服务。另外,这里提到的22号端口是ssh服务使用的(有关ssh服务,请见下一章),刘遄老师先在这里挖坑,等大家学完第9章后可再验证这个实验的效果。

在设置完上述INPUT规则链之后,我们使用IP地址在192.168.10.0/24网段内的主机访问服务器(即前面提到的设置了INPUT规则链的主机)的22端口,效果如下:

然后,我们再使用IP地址在192.168.20.0/24网段内的主机访问服务器的22端口(虽网段不同,但已确认可以相互通信),效果如下,就会提示连接请求被拒绝了(Connection failed):

向INPUT规则链中添加拒绝所有人访问本机12345端口的策略规则

向INPUT规则链中添加拒绝192.168.10.5主机访问本机80端口(Web服务)的策略规则

向INPUT规则链中添加拒绝所有主机访问本机10001024端口的策略规则

有关iptables命令的知识讲解到此就结束了,大家是不是意犹未尽?考虑到Linux防火墙的发展趋势,大家只要能把上面的实例吸收消化,就可以完全搞定日常的iptables配置工作了。但是请特别注意,使用iptables命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,还要执行保存命令:

8.3 Firewalld

RHEL 7系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。

相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。例如,我们有一台笔记本电脑,每天都要在办公室、咖啡厅和家里使用。按常理来讲,这三者的安全性按照由高到低的顺序来排列,应该是家庭、公司办公室、咖啡厅。当前,我们希望为这台笔记本电脑指定如下防火墙策略规则:在家中允许访问所有服务;在办公室内仅允许访问文件共享服务;在咖啡厅仅允许上网浏览。在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后只需轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。firewalld中常见的区域名称(默认为public)以及相应的策略规则如表8-2所示。

表8-2                                     firewalld中常用的区域名称及策略规则

区域 默认规则策略
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 拒绝流入的流量,除非与流出的流量相关
8.3.1 终端管理工具

第2章在讲解Linux命令时曾经听到,命令行终端是一种极富效率的工作方式,firewalld-cmd是firewalld防火墙配置管理工具的CLI(命令行界面)版本。它的参数一般都是以“长格式”来提供的,大家不要一听到长格式就头大,因为RHEL 7系统支持部分命令的参数补齐,其中就包含这条命令(很酷吧)。也就是说,现在除了能用Tab键自动补齐命令或文件名等内容之外,还可以用Tab键来补齐表8-3中所示的长格式参数了(这太棒了)。

表8-3                                   firewalld-cmd命令中使用的参数以及作用

参数 作用
--get-default-zone 查询默认的区域名称
--set-default-zone=<区域名称> 设置默认的区域,使其永久生效
--get-zones 显示可用的区域
--get-services 显示预先定义的服务
--get-active-zones 显示当前正在使用的区域与网卡名称
--remove-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 关闭应急状况模式

与Linux系统中其他的防火墙策略配置工具一样,使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

接下来的实验都很简单,但是提醒大家一定要仔细查看刘遄老师使用的是Runtime模式还是Permanent模式。如果不关注这个细节,就算是正确配置了防火墙策略,也可能无法达到预期的效果。

查看firewalld服务当前所使用的区域:

查询eno16777728网卡在firewalld服务中的区域:

把firewalld服务中eno16777728网卡的默认区域修改为external,并在系统重启后生效。分别查看当前与永久模式下的区域名称:

把firewalld服务的当前默认区域设置为public:

启动/关闭firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用):

查询public区域是否允许请求SSH和HTTPS协议的流量:

把firewalld服务中请求HTTPS协议的流量设置为永久允许,并立即生效:

把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效:

把在firewalld服务中访问8080和8081端口的流量策略设置为允许,但仅限当前生效:

把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效:

流量转发命令格式为firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>

在客户端使用ssh命令尝试访问192.168.10.10主机的888端口:

firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有正对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在firewalld服务中配置一条富规则,使其拒绝192.168.10.0/24网段的所有用户访问本机的ssh服务(22端口):

在客户端使用ssh命令尝试访问192.168.10.10主机的ssh服务(22端口):

8.3.2 图形管理工具

在各种版本的Linux系统中,几乎没有能让刘遄老师欣慰并推荐的图形化工具,但是firewall-config做到了。它是firewalld防火墙配置管理工具的GUI(图形用户界面)版本,几乎可以实现所有以命令行来执行的操作。毫不夸张的说,即使读者没有扎实的Linux命令基础,也完全可以通过它来妥善配置RHEL 7中的防火墙策略。firewall-config的界面如图8-2所示,其功能具体如下。

1:选择运行时(Runtime)模式或永久(Permanent)模式的配置。

2:可选的策略集合区域列表。

3:常用的系统服务列表。

4:当前正在使用的区域。

5:管理当前被选中区域中的服务。

6:管理当前被选中区域中的端口。

7:开启或关闭SNAT(源地址转换协议)技术。

8:设置端口转发策略。

9:控制请求icmp服务的流量。

10:管理防火墙的富规则。

11:管理网卡设备。

12:被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与之相关的流量。

13:firewall-config工具的运行状态。

图8-2  firewall-config的界面

刘遄老师再啰嗦几句。在使用firewall-config工具配置完防火墙策略之后,无须进行二次确认,因为只要有修改内容,它就自动进行保存。下面进行动手实践环节。

我们先将当前区域中请求http服务的流量设置为允许,但仅限当前生效。具体配置如图8-3所示。

图8-3  放行请求http服务的流量

尝试添加一条防火墙策略规则,使其放行访问8080~8088端口(TCP协议)的流量,并将其设置为永久生效,以达到系统重启后防火墙策略依然生效的目的。在按照图8-4所示的界面配置完毕之后,还需要在Options菜单中单击Reload Firewalld命令,让配置的防火墙策略立即生效(见图8-5)。这与在命令行中执行--reload参数的效果一样。

图8-4  放行访问8080~8088端口的流量

图8-5  让配置的防火墙策略规则立即生效

前面在讲解firewall-config工具的功能时,曾经提到了SNAT(Source Network Address Translation,源网络地址转换)技术。SNAT是一种为了解决IP地址匮乏而设计的技术,它可以使得多个内网中的用户通过同一个外网IP接入Internet。该技术的应用非常广泛,甚至可以说我们每天都在使用,只不过没有察觉到罢了。比如,当我们通过家中的网关设备(比如无线路由器)访问本书配套站点www.linuxprobe.com时,就用到了SNAT技术。

大家可以看一下在网络中不使用SNAT技术(见图8-6)和使用SNAT技术(见图8-7)时的情况。在图8-6所示的局域网中有多台PC,如果网关服务器没有应用SNAT技术,则互联网中的网站服务器在收到PC的请求数据包,并回送响应数据包时,将无法在网络中找到这个私有网络的IP地址,所以PC也就收不到响应数据包了。在图8-7所示的局域网中,由于网关服务器应用了SNAT技术,所以互联网中的网站服务器会将响应数据包发给网关服务器,再由后者转发给局域网中的PC。

图8-6  没有使用SNAT技术的网络

图8-7  使用SNAT技术处理过的网络

使用iptables命令实现SNAT技术是一件很麻烦的事情,但是在firewall-config中却是小菜一碟了。用户只需按照图8-8进行配置,并选中Masquerade zone复选框,就自动开启了SNAT技术。

图8-8  开启防火墙的SNAT技术

为了让大家直观查看不同工具在实现相同功能的区别,这里使用firewall-config工具重新演示了前面使用firewalld-cmd来配置防火墙策略规则,将本机888端口的流量转发到22端口,且要求当前和长期均有效,具体如图8-9和图8-10所示。

图8-9  配置本地的端口转发

图8-10  让防火墙效策略规则立即生效

配置富规则,让192.168.10.20主机访问到本机的1234端口号,如图8-11所示。

图8-11 配置防火墙富规则策略

如果生产环境中的服务器有多块网卡在同时提供服务(这种情况很常见),则对内网和对外网提供服务的网卡要选择的防火墙策略区域也是不一样的。也就是说,可以把网卡与防火墙策略区域进行绑定(见图8-12),这样就可以使用不同的防火墙区域策略,对源自不同网卡的流量进行针对性的监控,效果会更好。

最后,刘遄老师想说的是,firewall-config工具真的非常实用,很多原本复杂的长命令被用图形化按钮替代,设置规则也简单明了,足以应对日常工作。所以再次向大家强调配置防火墙策略的原则—只要能实现所需的功能,用什么工具请随君便。

图8-12  把网卡与防火墙策略区域进行绑定

8.4 服务的访问控制列表

TCP Wrappers是RHEL 7系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux系统中其实有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤工具,而TCP Wrappers服务则是能允许或禁止Linux系统提供服务的防火墙,从而在更高层面保护了Linux系统的安全运行。

TCP Wrappers服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。

TCP Wrappers服务的控制列表文件配置起来并不复杂,常用的参数如表8-4所示。

表8-4                            TCP Wrappers服务的控制列表文件中常用的参数

客户端类型 示例 满足示例的客户端列表
单一主机 192.168.10.10 IP地址为192.168.10.10的主机
指定网段 192.168.10. IP段为192.168.10.0/24的主机
指定网段 192.168.10.0/255.255.255.0 IP段为192.168.10.0/24的主机
指定DNS后缀 .linuxprobe.com 所有DNS后缀为.linuxprobe.com的主机
指定主机名称 www.linuxprobe.com 主机名称为www.linuxprobe.com的主机
指定所有客户端 ALL 所有主机全部包括在内

在配置TCP Wrappers服务时需要遵循两个原则:

  1. 编写拒绝策略规则时,填写的是服务名称,而非协议名称;
  2. 建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果。

下面编写拒绝策略规则文件,禁止访问本机sshd服务的所有流量(无须/etc/hosts.deny文件中修改原有的注释信息):

接下来,在允许策略规则文件中添加一条规则,使其放行源自192.168.10.0/24网段,访问本机sshd服务的所有流量。可以看到,服务器立刻就放行了访问sshd服务的流量,效果非常直观:

转载:http://www.linuxprobe.com/chapter-08.html

安装Win10后Windows找不到恢复环境解决方法 - 修复WinRE恢复环境

打开“命令提示符(管理员)”。输入reagentc /info命令,回车即可查看恢复环境配置信息,如果电脑配置了恢复环境,在Windows RE位置后面是可以看到WinRE映像存放位置的。对于已配置恢复环境但未能正常加载,一般只需要先将其禁用再启用即可解决,禁用命令reagentc /disable回车,启用命令reagentc /enable回车。

如果运行reagentc /info后,Windows RE位置显示为空,这说明恢复环境已丢失,此时当我们运行reagentc /enable启用恢复环境的时候就会出现未找到Windows RE映像的提示。这个时候就需要自己重新配置一下Windows恢复环境(WinRE)了,具体方法如下:

1、创建恢复环境映像目录:在系统盘根目录新建名为Recovery的文件夹,然后再在Recovery文件夹内新建名为WindowsRE的文件夹。完整路径即为C:\Recovery\WindowsRE。

2、从微软原版ISO镜像中获取WinRE.wim映像:WinRE.wim映像位于原版ISO镜像的install.wim中,可以使用7z文件压缩工具直接从install.wim中提取而不必“解压”install.wim。

具体方法:安装7z工具,打开微软原版ISO镜像,再打开其中的sources目录,用7z工具打开install.wim文件,然后再定位到windows/system32/recovery目录,这里就可以看到所需要的WinRE.wim映像了,选中winre.wim文件,点击上方的“解压到”,出现对话框,将路径更改为C:\Recovery\WindowsRE,点击“确定”开始复制。复制完成后确认一下C:\Recovery\WindowsRE目录中已存在winre.wim文件,WinRE.wim为隐藏文件。提取后需要显示隐藏文件才能在C:\Recovery\WindowsRE中看到它。

3、将获取的WinRE.wim配置为系统默认恢复环境启动映像:打开“命令提示符(管理员)”,输入下面的命令reagentc /setreimage /path C:\Recovery\WindowsRE回车运行即可,设置成功后,还需将其开启,开启命令reagentc /enable现在恢复环境就已经配置成功了。

Q:win 10系统不能打开Recovery文件夹,提示拒绝咋办呢?
A:右键-属性-权限,把所有者设成你、替换子容器的权限、完全控制

CentOS上安装ShadowSocks服务端

1、查看系统
[root@localhost ~]# cat /etc/issue
CentOS release 6.6 (Final)
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-042stab106.6 #1 SMP Mon Apr 20 14:48:47 MSK 2015 x86_64 x86_64 x86_64 GNU/Linux

2、安装ShadowSocks
# yum install python-setuptools && easy_install pip
# pip install shadowsocks

3、创建配置文件/etc/shadowsocks.json
[root@localhost /]# touch /etc/shadowsocks.json
[root@localhost /]# vi /etc/shadowsocks.json
//单用户配置
{
"server":"***.***.***.***",
"server_port":8388,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"MyPass",
"timeout":600,
"method":"rc4-md5"
}
//多用户的配置
{
"server":"***.***.***.***",
"port_password":{
"9001":"pwd001",
"9002":"pwd002",
"9003":"pwd003"
},
"local_address":"127.0.0.1",
"local_port":1080,
"timeout":300,
"method":"rc4-md5"
}

备注:加密方式官方默认使用aes-256-cfb,推荐使用rc4-md5,因为 RC4比AES速度快好几倍。
各字段说明:

server:服务器的IP,VPS的公网IP,注意这也将是服务端监听的IP地址
server_port:服务器端口
local_port:本地端端口
password:用来加密的密码
timeout:超时时间(秒)
method:加密方式。可选择 “bf-cfb”, “aes-256-cfb”, “des-cfb”, “rc4″, 等等。默认是一种不安全的加密,推荐用 “aes-256-cfb”。
Tips:加密方式推荐使用rc4-md5,因为 RC4 比 AES 速度快好几倍,如果用在路由器上会带来显著性能提升。旧的 RC4 加密之所以不安全是因为 Shadowsocks 在每个连接上重复使用 key,没有使用 IV。现在已经重新正确实现,可以放心使用。

4、使用配置文件在后台运行shadowsocks服务
[root@localhost /]# ssserver -c /etc/shadowsocks.json -d start

备注:若无配置文件,在后台可以使用一下命令运行:
[root@localhost /]# ssserver -p 443 -k MyPass -m rc4-md5 -d start

5、停止服务
[root@localhost /]# ssserver -c /etc/shadowsocks.json -d stop

6、配置开机自启动
编辑 /etc/rc.local 文件
sudo vim /etc/rc.local
在exit 0 这一行的上边加入如下
/usr/local/bin/ssserver –c /etc/shadowsocks.json