Dan Nanni 发布的文章

Mutt 是一个 Linux/UNIX 终端环境下的开源的邮件客户端。Mutt 以及 Alpine 在 Linux 命令行爱好者中有着最忠诚的追随者,这不是没有原因的。想一下你所期待邮件客户端应有的功能,Mutt 拥有:多协议支持(例如,POP3、IMAP 和 SMTP),S/MIME 和 PGP/GPG 集成,会话线索,颜色标记,可定制宏/快捷键,等等。另外,基于命令行的 Mutt 相比粗重的基于浏览器的邮件客户端(如:Gmail,Ymail)或图形用户界面的邮件客户端(如:Thunderbird,MS Outlook)而言,是一个使用电子邮件的轻量级替代品。

当你想使用 Mutt 通过公司的 SMTP/IMAP 服务器访问或发送邮件,或取代网页邮件服务,可能所关心的一个问题是如何保护您的邮件凭据(如:SMTP/IMAP 密码),它们存储在一个纯文本 Mutt 配置文件(~/.muttrc)中。

对于这些人对安全的担忧,确实有一个容易的方法来加密 Mutt 配置文件*,以防止这种风险。在这个教程中,我描述了如何加密 Mutt 敏感配置,比如使用 GnuPG(GPG)加密 SMTP/IMAP 密码,GPG 是一个开源的 OpenPGP 实现。

第一步 (可选):创建 GPG 密钥

因为我们将要使用 GPG 加密 Mutt 配置文件,如果你没有 GPG 密钥,第一步就是创建一个(公钥/私钥对)。如果有,请忽略这步。

创建一个新 GPG 密钥,输入下面命令:

$ gpg --gen-key

选择密钥类型(RSA),密钥长度(2048 bits),和过期时间(0 代表不过期)。当出现用户 ID 提示时,输入关联到该公钥/私钥对的名字(Dan Nanni) 和邮箱地址([email protected])。最后,输入一个密码来保护你的私钥。

生成一个 GPG 密钥需要大量的随机字节来构成熵,所以在生成密钥期间确保在你的系统上执行一些随机行为(如:敲打键盘,移动鼠标或者读写磁盘)。根据密钥长度,生成 GPG 密钥要花几分钟或更多时间。

第二步:加密 Mutt 敏感配置

下一步,在 ~/.mutt 目录创建一个新的文本文件,然后把一些你想隐藏的 Mutt 敏感配置放进去。这个例子里,我指定了 SMTP/IMAP 密码。

$ mkdir ~/.mutt
$ vi ~/.mutt/password

set smtp_pass="XXXXXXX"
set imap_pass="XXXXXXX"

现在通过 GPG 使用你的公钥加密这个文件如下:

$ gpg -r [email protected] -e ~/.mutt/password

这将创建 ~/.mutt/password.gpg,这是一个原始文件的 GPG 加密版本。

然后删除 ~/.mutt/password,只保留 GPG 加密版本。

第三步:创建完整 Mutt 配置文件

现在你已经在一个单独的文件放置了加密的 Mutt 敏感配置,你可以在 ~/.muttrc 指定其余的 Mutt 配置。然后增加下面这行在 ~/.muttrc 末尾。

source "gpg -d ~/.mutt/password.gpg |"

当你启动 Mutt 时,这行将解密 ~/.mutt/password.gpg ,然后将解密内容应用到你的 Mutt 配置中。

下面展示一个完整 Mutt 配置例子,这可以让你通过 Mutt 访问 Gmail,而没有暴露你的 SMTP/IMAP 密码。用你的 Gmail ID 替代下面的 yourgmailaccount,此外你也需要在你的 Goolgle 账户设置中启用“支持不太安全的应用访问”。

set from = "[email protected]"
set realname = "Your Name"
set smtp_url = "smtp://[email protected]:587/"
set imap_user = "[email protected]"
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed = "+[Google Mail]/Drafts"
set trash = "+[Google Mail]/Trash"
set header_cache =~/.mutt/cache/headers
set message_cachedir =~/.mutt/cache/bodies
set certificate_file =~/.mutt/certificates
set move = no
set imap_keepalive = 900

# encrypted IMAP/SMTP passwords
source "gpg -d ~/.mutt/password.gpg |"

第四步(可选):配置 GPG 代理

这时候,你将可以使用加密了IMAP/SMTP 密码的 Mutt。然而,每次你运行 Mutt,你都要先被提示输入一个 GPG 密码来使用你的私钥解密 IMAP/SMTP 密码。

如果你想避免这样的 GPG 密码提示,你可以部署一个 gpg-agent。它以后台守护进程方式运行,gpg-agent 可以安全地缓存你的 GPG 密码,无需手工干预,gpg 可以自动从 gpg-agent 获得你的 GPG 密码。如果你正在使用 Linux 桌面,你可以配置使用一些等同于 gpg-agent 的特定的桌面软件,例如,GNOME 桌面的 gnome-keyring-daemon。

你可以在基于 Debian 系统安装 gpg-agent:

$ sudo apt-get install gpg-agent

gpg-agent 在基于 Red Hat 的系统上是预装好的。

现在增加下面这些到你的 .bashrc 文件中。

envfile="$HOME/.gnupg/gpg-agent.env"
if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
    eval "$(cat "$envfile")"
else
    eval "$(gpg-agent --daemon --allow-preset-passphrase --write-env-file "$envfile")"
fi
export GPG_AGENT_INFO

重载 .bashrc,或简单的登出然后重新登录。

$ source ~/.bashrc

现在确认 GPGAGENTINFO 环境变量已经设置妥当。

$ echo $GPG_AGENT_INFO

/tmp/gpg-0SKJw8/S.gpg-agent:942:1

并且,当你输入 gpg-agent 命令时,你应该看到下面的信息。

$ gpg-agent

gpg-agent: gpg-agent running and available

一旦 gpg-agent 启动运行,它将会在第一次提示你输入密码时缓存你的 GPG 密码。随后你多次运行 Mutt ,都不会被提示要 GPG 密码(gpg-agent 一直开着,缓存就不会过期)。

结论

在这个指导里,我提供一个使用 GnuPG 加密如 SMTP/IMAP 密码这样的 Mutt 敏感配置的方法。注意,如果你想在 Mutt 上使用 GnuPG 来加密或签名你的邮件,你可以参考官方指南关于 GPG 与 Mutt 结合的部分。

如果你知道任何使用 Mutt 的安全技巧,欢迎分享它。


via: http://xmodulo.com/mutt-email-client-encrypted-passwords.html

作者:Dan Nanni 译者:wyangsun 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

作为一名维护 Linux 生产服务器的系统管理员,你可能会遇到这样一些情形:你需要根据地理位置,选择性地阻断或允许网络流量通过。 例如你正经历一次由注册在某个特定国家的 IP 发起的 DoS 攻击;或者基于安全考虑,你想阻止来自未知国家的 SSH 登录请求;又或者你的公司对某些在线视频有分销权,它要求只能在特定的国家内合法发行;抑或是由于公司的政策,你需要阻止某个本地主机将文件上传至任意一个非美国的远程云端存储。

所有的上述情形都需要设置防火墙,使之具有基于国家位置过滤流量的功能。有几个方法可以做到这一点,其中之一是你可以使用 TCP wrappers 来为某个应用(例如 SSH,NFS, httpd)设置条件阻塞。但其缺点是你想要保护的那个应用必须以支持 TCP wrappers 的方式构建。另外,TCP wrappers 并不总是能够在各个平台中获取到(例如,Arch Linux 放弃了对它的支持)。另一种方式是结合基于国家的 GeoIP 信息,设置 ipset,并将它应用到 iptables 的规则中。后一种方式看起来更有希望一些,因为基于 iptables 的过滤器是与应用无关的,且容易设置。

在本教程中,我将展示 另一个基于 iptables 的 GeoIP 过滤器,它由 xtables-addons 来实现。对于那些不熟悉它的人来说, xtables-addons 是用于 netfilter/iptables 的一系列扩展。一个包含在 xtables-addons 中的名为 xt\_geoip 的模块扩展了 netfilter/iptables 的功能,使得它可以根据流量来自或流向的国家来进行过滤,IP 掩蔽(NAT)或丢包。若你想使用 xt\_geoip,你不必重新编译内核或 iptables,你只需要使用当前的内核构建环境(/lib/modules/uname -r/build)以模块的形式构建 xtables-addons。同时也不需要进行重启。只要你构建并安装了 xtables-addons , xt\_geoip 便能够配合 iptables 使用。

至于 xt\_geoip 和 ipset 之间的比较,xtables-addons 的官方网站 上是这么说的: 相比于 ipset,xt\_geoip 在内存占用上更胜一筹,但对于匹配速度,基于哈希的 ipset 可能更有优势。

在教程的余下部分,我将展示如何使用 iptables/xt\_geoip 来根据流量的来源地或流入的国家阻断网络流量

在 Linux 中安装 xtables-addons

下面介绍如何在各种 Linux 平台中编译和安装 xtables-addons。

为了编译 xtables-addons,首先你需要安装一些依赖软件包。

在 Debian,Ubuntu 或 Linux Mint 中安装依赖

$ sudo apt-get install iptables-dev xtables-addons-common libtext-csv-xs-perl pkg-config

在 CentOS,RHEL 或 Fedora 中安装依赖

CentOS/RHEL 6 需要事先设置好 EPEL 仓库(为 perl-Text-CSV\_XS 所需要)。

$ sudo yum install gcc-c++ make automake kernel-devel-`uname -r` wget unzip iptables-devel perl-Text-CSV_XS

编译并安装 xtables-addons

xtables-addons官方网站 下载源码包,然后按照下面的指令编译安装它。

$ wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.10.tar.xz
$ tar xf xtables-addons-2.10.tar.xz
$ cd xtables-addons-2.10
$ ./configure
$ make
$ sudo make install

需要注意的是,对于基于红帽的系统(CentOS、RHEL、Fedora),它们默认开启了 SELinux,所以有必要像下面这样调整 SELinux 的策略。否则,SELinux 将阻止 iptables 加载 xt\_geoip 模块。

$ sudo chcon -vR --user=system_u /lib/modules/$(uname -r)/extra/*.ko
$ sudo chcon -vR --type=lib_t /lib64/xtables/*.so

为 xtables-addons 安装 GeoIP 数据库

下一步是安装 GeoIP 数据库,它将被 xt\_geoip 用来查询 IP 地址与国家地区之间的对应关系。方便的是,xtables-addons 的源码包中带有两个帮助脚本,它们被用来从 MaxMind 下载 GeoIP 数据库并将它转化为 xt\_geoip 可识别的二进制形式文件;它们可以在源码包中的 geoip 目录下找到。请遵循下面的指导来在你的系统中构建和安装 GeoIP 数据库。

$ cd geoip
$ ./xt_geoip_dl
$ ./xt_geoip_build GeoIPCountryWhois.csv
$ sudo mkdir -p /usr/share/xt_geoip
$ sudo cp -r {BE,LE} /usr/share/xt_geoip

根据 MaxMind 的说明,他们的 GeoIP 数据库能够以 99.8% 的准确率识别出 ip 所对应的国家,并且每月这个数据库将进行更新。为了使得本地安装的 GeoIP 数据是最新的,或许你需要设置一个按月执行的 cron job 来时常更新你本地的 GeoIP 数据库。

阻断来自或流向某个国家的网络流量

一旦 xt\_geoip 模块和 GeoIP 数据库安装好后,你就可以在 iptabels 命令中使用 geoip 的匹配选项。

$ sudo iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

你想要阻断流量的那些国家是使用2个字母的 ISO3166 代码 来特别指定的(例如 US(美国)、CN(中国)、IN(印度)、FR(法国))。

例如,假如你想阻断来自也门(YE) 和 赞比亚(ZM)的流量,下面的 iptabels 命令便可以达到此目的。

$ sudo iptables -I INPUT -m geoip --src-cc YE,ZM -j DROP

假如你想阻断流向中国(CN) 的流量,可以运行下面的命令:

$ sudo iptables -A OUTPUT -m geoip --dst-cc CN -j DROP

匹配条件也可以通过在 --src-cc--dst-cc 选项前加 ! 来达到相反的目的:

假如你想在你的服务器上阻断来自所有非美国的流量,可以运行:

$ sudo iptables -I INPUT -m geoip ! --src-cc US -j DROP

对于使用 Firewall-cmd 的用户

某些发行版本例如 CentOS/RHEL7 或 Fedora 已经用 firewalld 替代了 iptables 来作为默认的防火墙服务。在这些系统中,你可以类似使用 xt\_geoip 那样,使用 firewall-cmd 来阻断流量。利用 firewall-cmd 命令,上面的三个例子可被重新写为:

$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip --src-cc YE,ZM -j DROP
$ sudo firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -m geoip --dst-cc CN -j DROP
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip ! --src-cc US -j DROP

总结

在本教程中,我展示了使用 iptables/xt\_geoip 来根据流量的来源地或流入的国家轻松地阻断网络流量。假如你有这方面的需求,把它部署到你的防火墙系统中可以使之成为一个实用的办法。作为最后的警告,我应该提醒你的是:在你的服务器上通过基于 GeoIP 的流量过滤来禁止特定国家的流量并不总是万无一失的。GeoIP 数据库本身就不是很准确或齐全,且流量的来源或目的地可以轻易地通过使用 VPN、Tor 或其他任意易受攻击的中继主机来达到欺骗的目的。基于地理位置的过滤器甚至可能会阻止本不该阻止的合法网络流量。在你决定把它部署到你的生产环境之前请仔细考虑这个限制。


via: http://xmodulo.com/block-network-traffic-by-country-linux.html

作者:Dan Nanni 译者:FSSlc 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在当今这个多设备的环境下,云存储无处不在。无论身处何方,人们都想通过多种设备来从云存储中获取所需的内容。由于拥有漂亮的 UI 和完美的跨平台兼容性,Dropbox 已成为最为广泛使用的云存储服务。 Dropbox 的流行已引发了一系列官方或非官方 Dropbox 客户端的出现,它们支持不同的操作系统平台。

当然 Linux 平台下也有着自己的 Dropbox 客户端: 既有命令行的,也有图形界面客户端。Dropbox Uploader 是一个简单易用的 Dropbox 命令行客户端,它是用 Bash 脚本语言所编写的(LCTT 译注:对,你没看错, 就是 Bash)。在这篇教程中,我将描述 在 Linux 中如何使用 Dropbox Uploader 通过命令行来访问 Dropbox

Linux 中安装和配置 Dropbox Uploader

要使用 Dropbox Uploader,你需要下载该脚本并使其可被执行。

$ wget https://raw.github.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh
$ chmod +x dropbox_uploader.sh

请确保你已经在系统中安装了 curl,因为 Dropbox Uploader 通过 curl 来运行 Dropbox 的 API。

要配置 Dropbox Uploader,只需运行 dropbox\_uploader.sh 即可。当你第一次运行这个脚本时,它将请求得到授权以使得脚本可以访问你的 Dropbox 账户。

$ ./dropbox_uploader.sh

如上图所指示的那样,你需要通过浏览器访问 https://www.dropbox.com/developers/apps 页面,并创建一个新的 Dropbox app。接着像下图那样填入新 app 的相关信息,并输入 app 的名称,它与 Dropbox Uploader 所生成的 app 名称类似。

在你创建好一个新的 app 之后,你将在下一个页面看到 app key 和 app secret。请记住它们。

然后在正运行着 dropboxuploader.sh 的终端窗口中输入 app key 和 app secret。然后 dropboxuploader.sh 将产生一个 oAUTH 网址(例如,https://www.dropbox.com/1/oauth/authorize?oauth\_token=XXXXXXXXXXXX)。%E3%80%82)

接着通过浏览器访问那个 oAUTH 网址,并同意访问你的 Dropbox 账户。

这便完成了 Dropbox Uploader 的配置。若要确认 Dropbox Uploader 是否真的被成功地认证了,可以运行下面的命令。

$ ./dropbox_uploader.sh info

Dropbox Uploader v0.12

 > Getting info... 

Name:   Dan Nanni
UID:    XXXXXXXXXX
Email:  my@email_address
Quota:  2048 Mb
Used:   13 Mb
Free:   2034 Mb

Dropbox Uploader 示例

要显示根目录中的所有内容,运行:

$ ./dropbox_uploader.sh list

要列出某个特定文件夹中的所有内容,运行:

$ ./dropbox_uploader.sh list Documents/manuals

要上传一个本地文件到一个远程的 Dropbox 文件夹,使用:

$ ./dropbox_uploader.sh upload snort.pdf Documents/manuals

要从 Dropbox 下载一个远程的文件到本地,使用:

$ ./dropbox_uploader.sh download Documents/manuals/mysql.pdf ./mysql.pdf

要从 Dropbox 下载一个完整的远程文件夹到一个本地的文件夹,运行:

$ ./dropbox_uploader.sh download Documents/manuals ./manuals

要在 Dropbox 上创建一个新的远程文件夹,使用:

$ ./dropbox_uploader.sh mkdir Documents/whitepapers

要完全删除 Dropbox 中某个远程的文件夹(包括它所含的所有内容),运行:

$ ./dropbox_uploader.sh delete Documents/manuals

via: http://xmodulo.com/access-dropbox-command-line-linux.html

作者:Dan Nanni 译者:FSSlc 校对:Caroline

本文由 LCTT 原创编译,Linux中国 荣誉推出

红帽企业版 linux(RHEL)和它的社区版分支——CentOS,提供10年的生命周期,这意味着 RHEL/CentOS 的每个版本会提供长达10年的安全更新。虽然这么长的生命周期为企业用户提供了迫切需要的系统兼容性和可靠性,但也存在一个缺点:随着底层的 RHEL/CentOS 版本接近生命周期的结束,核心应用和运行时环境变得陈旧过时。例如 CentOS 6.5,它的生命周期结束时间是2020年11月30日,其所携带的 Python 2.6.6和 MySQL 5.1.73,以今天的标准来看已经非常古老了。

另一方面,在 RHEL/CentOS 上试图手动升级开发工具链和运行时环境存在使系统崩溃的潜在可能,除非所有依赖都被正确解决。通常情况下,手动升级都是不推荐的,除非你知道你在干什么。

SCL

软件集 Software Collections (SCL)源出现了,以帮助解决 RHEL/CentOS 下的这种问题。SCL 的创建就是为了给 RHEL/CentOS 用户提供一种以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版本的方式,同时避免把系统搞乱。与之相对的是第三方源,它们可能会在已安装的包之间引起冲突。

最新的 SCL 提供了:

  • Python 3.3 和 2.7
  • PHP 5.4
  • Node.js 0.10
  • Ruby 1.9.3
  • Perl 5.16.3
  • MariaDB 和 MySQL 5.5
  • Apache httpd 2.4.6

在这篇教程的剩余部分,我会展示一下如何配置 SCL 源,以及如何安装和启用 SCL 中的包。

配置 SCL 源

SCL 可用于 CentOS 6.5 及更新的版本。要配置 SCL 源,只需执行:

$ sudo yum install centos-release-SCL

要启用和运行 SCL 中的应用,你还需要安装下列包:

$ sudo yum install scl-utils-build

执行下面的命令可以查看 SCL 中可用包的完整列表:

$ yum --disablerepo="*" --enablerepo="scl" list available

从 SCL 中安装和启用包

既然你已配置好了 SCL,你可以继续并从 SCL 中安装包了。

你可以搜索 SCL 中的包:

$ yum --disablerepo="*" --enablerepo="scl" search <keyword>

我们假设你要安装 Python 3.3。

继续,就像通常安装包那样使用 yum 安装:

$ sudo yum install python33

任何时候你都可以查看从 SCL 中安装的包的列表,只需执行:

$ scl --list

python33

SCL 的优点之一是安装其中的包不会覆盖任何系统文件,并且保证不会引起与系统中其它库和应用的冲突。

例如,如果在安装 python33 包后检查默认的 python 版本,你会发现默认的版本并没有改变:

$ python --version

Python 2.6.6

如果想使用一个已经安装的 SCL 包,你需要在每个命令中使用 scl 命令显式启用它(LCTT 译注:即想在哪条命令中使用 SCL 中的包,就得通过scl命令执行该命令)

$ scl enable <scl-package-name> <command>

例如,要针对python命令启用 python33 包:

$ scl enable python33 'python --version'

Python 3.3.2

如果想在启用 python33 包时执行多条命令,你可以像下面那样创建一个启用 SCL 的 bash 会话:

$ scl enable python33 bash

在这个 bash 会话中,默认的 python 会被切换为3.3版本,直到你输入exit,退出会话。

简而言之,SCL 有几分像 Python 的虚拟环境,但更通用,因为你可以为远比 Python 更多的应用启用/禁用 SCL 会话。

更详细的 SCL 指南,参考官方的快速入门指南


via: http://xmodulo.com/enable-software-collections-centos.html

作者:Dan Nanni 译者:bianjp 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

问题: 我经常在命令行中切换 shell。是否有一个快速简便的方法来找出我当前正在使用的 shell 呢?此外,我怎么能找到当前 shell 的版本?

找到你当前正在使用的 Shell 版本

有多种方式可以查看你目前在使用什么 shell,最简单的方法就是通过使用 shell 的特殊参数。

其一,一个名为 "$$" 的特殊参数 表示当前你正在运行的 shell 实例的 PID。此参数是只读的,不能被修改。所以,下面的命令也将显示你正在运行的 shell 的名字:

$ ps -p $$

  PID TTY          TIME CMD
21666 pts/4    00:00:00 bash

上述命令可在所有可用的 shell 中工作。

如果你不使用 csh,找到当前使用的 shell 的另外一个办法是使用特殊参数 “$0” ,它表示当前正在运行的 shell 或 shell 脚本的名称。这是 Bash 的一个特殊参数,但也可用在其他 shell 中,如 sh、zsh、tcsh 或 dash。使用 echo 命令可以查看你目前正在使用的 shell 的名称。

$ echo $0

bash

不要被一个叫做 $SHELL 的单独的环境变量所迷惑,它被设置为你的默认 shell 的完整路径。因此,这个变量并不一定指向你当前使用的 shell。例如,即使你在终端中调用不同的 shell,$SHELL 也保持不变。

$ echo $SHELL

/bin/shell

因此,找出当前的shell,你应该使用 $$ 或 $0,但不是 $SHELL。

找出当前 Shell 的版本

一旦你知道你使用的是哪个 shell,你可能想知道此 shell 的版本。为此,在命令行中输入 shell 并在后面加上 “--version” 参数可以查看版本信息。例如:

对于 bash shell :

$ bash --version

GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

对于 zsh shell:

$ zsh --version

zsh 5.0.7 (x86_64-pc-linux-gnu)

对于 tcsh shell: $ tcsh --version

tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,nd,color,filec

对于某些 shell,你还可以使用 shell 特定的变量(例如,$BASH*VERSION 或 $ZSH*VERSION)。

$ echo $BASH_VERSION

4.3.8(1)-release

via: http://ask.xmodulo.com/which-shell-am-i-using.html

作者:Dan Nanni 译者:strugglingyouth 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 世界里,对 systemd 的采用一直是激烈争论的主题,它的支持者和反对者之间的战火仍然在燃烧。到了今天,大部分主流 Linux 发行版都已经采用了 systemd 作为默认的 初始化 init 系统。

正如其作者所说,作为一个 “从未完成、从未完善、但一直追随技术进步” 的系统,systemd 已经不只是一个初始化进程,它被设计为一个更广泛的系统以及服务管理平台,这个平台是一个包含了不断增长的核心系统进程、库和工具的生态系统。

systemd 的其中一部分是 systemd-networkd,它负责 systemd 生态中的网络配置。使用 systemd-networkd,你可以为网络设备配置基础的 DHCP/静态 IP 网络。它还可以配置虚拟网络功能,例如网桥、隧道和 VLAN。systemd-networkd 目前还不能直接支持无线网络,但你可以使用 wpa\_supplicant 服务配置无线适配器,然后把它和 systemd-networkd 联系起来。

在很多 Linux 发行版中,NetworkManager 仍然作为默认的网络配置管理器。和 NetworkManager 相比,systemd-networkd 仍处于积极的开发状态,还缺少一些功能。例如,它还不能像 NetworkManager 那样能让你的计算机在任何时候通过多种接口保持连接。它还没有为更高层面的脚本编程提供 ifup/ifdown 钩子函数。但是,systemd-networkd 和其它 systemd 组件(例如用于域名解析的 resolved、NTP 的timesyncd,用于命名的 udevd)结合的非常好。随着时间增长,systemd-networkd只会在 systemd 环境中扮演越来越重要的角色。

如果你对 systemd-networkd 的进步感到高兴,从 NetworkManager 切换到 systemd-networkd 是值得你考虑的一件事。如果你强烈反对 systemd,对 NetworkManager 或基础网络服务感到很满意,那也很好。

但对于那些想尝试 systemd-networkd 的人,可以继续看下去,在这篇指南中学会在 Linux 中怎么从 NetworkManager 切换到 systemd-networkd。

需求

systemd 210 及其更高版本提供了 systemd-networkd。因此诸如 Debian 8 "Jessie" (systemd 215)、 Fedora 21 (systemd 217)、 Ubuntu 15.04 (systemd 219) 或更高版本的 Linux 发行版和 systemd-networkd 兼容。

对于其它发行版,在开始下一步之前先检查一下你的 systemd 版本。

$ systemctl --version

从 NetworkManager 切换到 Systemd-networkd

从 NetworkManager 切换到 systemd-networkd 其实非常简答(反过来也一样)。

首先,按照下面这样先停用 NetworkManager 服务,然后启用 systemd-networkd。

$ sudo systemctl disable NetworkManager
$ sudo systemctl enable systemd-networkd

你还要启用 systemd-resolved 服务,systemd-networkd用它来进行域名解析。该服务还实现了一个缓存式 DNS 服务器。

$ sudo systemctl enable systemd-resolved
$ sudo systemctl start systemd-resolved

当启动后,systemd-resolved 就会在 /run/systemd 目录下某个地方创建它自己的 resolv.conf。但是,把 DNS 解析信息存放在 /etc/resolv.conf 是更普遍的做法,很多应用程序也会依赖于 /etc/resolv.conf。因此为了兼容性,按照下面的方式创建一个到 /etc/resolv.conf 的符号链接。

$ sudo rm /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

用 systemd-networkd 配置网络连接

要用 systemd-networkd 配置网络服务,你必须指定带.network 扩展名的配置信息文本文件。这些网络配置文件保存到 /etc/systemd/network 并从这里加载。当有多个文件时,systemd-networkd 会按照字母顺序一个个加载并处理。

首先创建 /etc/systemd/network 目录。

$ sudo mkdir /etc/systemd/network

DHCP 网络

首先来配置 DHCP 网络。对于此,先要创建下面的配置文件。文件名可以任意,但记住文件是按照字母顺序处理的。

$ sudo vi /etc/systemd/network/20-dhcp.network

[Match]
Name=enp3*

[Network]
DHCP=yes

正如你上面看到的,每个网络配置文件包括了一个或多个 “sections”,每个 “section”都用 [XXX] 开头。每个 section 包括了一个或多个键值对。[Match] 部分决定这个配置文件配置哪个(些)网络设备。例如,这个文件匹配所有名称以 ens3 开头的网络设备(例如 enp3s0、 enp3s1、 enp3s2 等等)对于匹配的接口,然后启用 [Network] 部分指定的 DHCP 网络配置。

静态 IP 网络

如果你想给网络设备分配一个静态 IP 地址,那就新建下面的配置文件。

$ sudo vi /etc/systemd/network/10-static-enp3s0.network

[Match]
Name=enp3s0

[Network]
Address=192.168.10.50/24
Gateway=192.168.10.1
DNS=8.8.8.8

正如你猜测的, enp3s0 接口地址会被指定为 192.168.10.50/24,默认网关是 192.168.10.1, DNS 服务器是 8.8.8.8。这里微妙的一点是,接口名 enp3s0 事实上也匹配了之前 DHCP 配置中定义的模式规则。但是,根据词汇顺序,文件 "10-static-enp3s0.network" 在 "20-dhcp.network" 之前被处理,对于 enp3s0 接口静态配置比 DHCP 配置有更高的优先级。

一旦你完成了创建配置文件,重启 systemd-networkd 服务或者重启机器。

$ sudo systemctl restart systemd-networkd

运行以下命令检查服务状态:

$ systemctl status systemd-networkd
$ systemctl status systemd-resolved

用 systemd-networkd 配置虚拟网络设备

systemd-networkd 同样允许你配置虚拟网络设备,例如网桥、VLAN、隧道、VXLAN、绑定等。你必须在用 .netdev 作为扩展名的文件中配置这些虚拟设备。

这里我展示了如何配置一个桥接接口。

Linux 网桥

如果你想创建一个 Linux 网桥(br0) 并把物理接口(eth1) 添加到网桥,你可以新建下面的配置。

$ sudo vi /etc/systemd/network/bridge-br0.netdev

[NetDev]
Name=br0
Kind=bridge

然后按照下面这样用 .network 文件配置网桥接口 br0 和从接口 eth1。

$ sudo vi /etc/systemd/network/bridge-br0-slave.network

[Match]
Name=eth1

[Network]
Bridge=br0

$ sudo vi /etc/systemd/network/bridge-br0.network

[Match]
Name=br0

[Network]
Address=192.168.10.100/24
Gateway=192.168.10.1
DNS=8.8.8.8

最后,重启 systemd-networkd。

$ sudo systemctl restart systemd-networkd

你可以用 brctl 工具 来验证是否创建好了网桥 br0。

总结

当 systemd 誓言成为 Linux 的系统管理器时,有类似 systemd-networkd 的东西来管理网络配置也就不足为奇。但是在现阶段,systemd-networkd 看起来更适合于网络配置相对稳定的服务器环境。对于桌面/笔记本环境,它们有多种临时有线/无线接口,NetworkManager 仍然是比较好的选择。

对于想进一步了解 systemd-networkd 的人,可以参考官方man 手册了解完整的支持列表和关键点。


via: http://xmodulo.com/switch-from-networkmanager-to-systemd-networkd.html

作者:Dan Nanni 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出