作者归档:Windows Hao

关于Windows Hao

力求做到最好的数据恢复效果,降低数据丢失带来的损失,为您的数据安全保驾护航。

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

Visual Studio 2015 - Windows XP (v140_xp) 编译工具 ucrtbased.dll缺失

先写结论,最好不要使用VS2015-WinXP编译工具来编译VC++程序,因为你最终会发现,编译出来的程序如果是动态链接到运行库的话,即便你已经拷贝了所有需要的运行库dll,当在xp系统上运行时,还是会提示缺少ucrtbased.dll(Debug版)或者ucrtbase.dll(Release版)。

解决办法有两个:

1.静态链接到运行时库  (MT 或者 MTd)    如果使用了MFC,还要静态链接到MFC

2.安装VS2013  直接用VS2013-WinXP来编译,编译出的程序只要附带上运行库dll即可直接在XP上运行

下面记录一下自己使用Visual Studio 2015 - Windows XP (v140_xp) 碰到的坑:

开始时,使用的VS2015 SP1,platform toolset选择的Visual Studio 2015 - Windows XP (v140_xp) ,编译出来debug版的程序,是动态连接到MFC和CRT的,我把所有需要的vc runtime dlls都拷贝到了xp虚拟机里面,但是发现程序无法运行,弹出无法找到ucrtbased.dll,于是google开始找解决办法,微软的官方说法是 VS2015修改了CRT runtime,增加了ucrtbase.dll这么个组件,这个组件必须得操作系统安装一个补丁才能有,直接把文件拷贝过去是不行的。但是XP没有这个补丁,最低是WIN7。

然后从VS2015SP2开始,微软修复了这个问题,XP也可以安装ucrtbase.dll这个组件了,方法就是必须安装VS2015的vcredist_x86.exe,这个文件的路径在D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\1033下面,于是我开始更新我的VS2015,下载了SP3的更新包(下载链接),更新完毕花了将近4个小时。

然后我用VS2015SP3重新编译了release版的程序,并且在我xp的虚拟机里面安装了SP3版本的vcredist_x86.exe,程序可以运行了。

但是还是有如下问题:

1.编译出来的debug版的程序仍然无法在xp上运行,因为缺少ucrtbased.dll,我也没有找到debug版的vcredist_x86.exe

2.我的程序没有安装包,我不想用户在使用的时候还必须得安装一个vcredist_x86.exe,那跟使用C#程序之前必须安装一个.net framework有什么区别?

最后我决定使用VS2013-Windows XP 来编译我的程序,因为我电脑上之前装有VS2013,后来装的VS2015,所以工程-属性里面可以直接选择VS2013的platform toolset。这样的话就可以使用VS2015的IDE来写代码,使用VS2013的编译器来编译生成程序。

而且我可以确定的说,VS2013-Windows XP编译出来的无论是debug版还是release版,32位或者64位,只需将对应的VC Runtime dll拷贝到程序目录下,就可以直接在XP上运行,方便调试和使用。

至于说如何为VS2015安装VS2013的平台工具集(platform toolset),老老实实再装一个VS2013吧,装完之后,VS2015里面会自动识别出来的。简单的办法我用google也没有找到,如果谁找到了,评论里面留言下,多谢~。毕竟再装一个VS2013是要花很多时间和精力的~~

 

转载:http://blog.csdn.net/atceedsun/article/details/53583824