Fail2ban防止WordPress受到xmlrpc.php CC攻击

WordPress本身是一个非常强大的CMS(内容管理系统),功能强大。但是也正是因为其强大的特性,使其很容易被利用,造成服务器的不稳定甚至崩溃。最容易遭受攻击的就是xmlrpc.php这个文件,攻击者只要每秒发送1个post请求到此文件,不出1分钟,一台512M内存Debian7系统的VPS就会崩溃,php进程和Mysql占用内存过高而导致无法访问。在尝试了网上流传的多个防攻击手段之后,fail2ban是效果最好的一个,下面就简单记录一下过程,供大家参考。

分析日志

在服务器出现异常的时候,首先去分析Nginx日志, /var/log/nginx/access.log ,从代码中可以发现如下可以IP不断发送Post请求到xmlrpc.php,每个IP的发送频率大概在2秒钟一次,严格来说频率并不高但足以让php和mysql进程崩溃。

185.188.204.16 - - [15/Jul/2017:23:51:07 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.6 - - [15/Jul/2017:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "*****"
185.188.204.8 - - [15/Jul/2017:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.14 - - [15/Jul/2017:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "*****"
185.188.204.16 - - [15/Jul/2017:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.7 - - [15/Jul/2017:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.12 - - [15/Jul/2017:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "*****"
185.188.204.11 - - [15/Jul/2017:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.15 - - [15/Jul/2017:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.11 - - [15/Jul/2017:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"

安装fail2ban和iptables

安装fail2ban和iptables,这样能使用ipotables对攻击进行防御,想对于其它js和php的防御方式自动化更高,更为高效。

apt-get install fail2ban iptables

设置fail2ban jail.local

使用jail.local设定

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
[xmlrpc]
enabled = true
filter = xmlrpc
action = iptables[name=xmlrpc, port=http, protocol=tcp]
logpath = /var/log/nginx/access.log
bantime = 43600
maxretry = 2

设置fail2ban 自定义filter

vi /etc/fail2ban/filter.d/xmlrpc.conf
[Definition]
failregex = ^<HOST> .*POST .*xmlrpc.php.*
ignoreregex =

设置fail2ban jail.local

设置好之后重启fail2ban服务既可生效

service fail2ban restart

查看fail2ban日志查看防御情况

tail -f /var/log/fail2ban.log
2017-07-15 23:51:38,265 fail2ban.jail   : INFO   Creating new jail 'ssh'
2017-07-15 23:51:38,266 fail2ban.jail   : INFO   Jail 'ssh' uses Gamin
2017-07-15 23:51:38,287 fail2ban.filter : INFO   Set maxRetry = 6
2017-07-15 23:51:38,288 fail2ban.filter : INFO   Set findtime = 600
2017-07-15 23:51:38,288 fail2ban.actions: INFO   Set banTime = 600
2017-07-15 23:51:38,320 fail2ban.jail   : INFO   Creating new jail 'xmlrpc'
2017-07-15 23:51:38,320 fail2ban.jail   : INFO   Jail 'xmlrpc' uses Gamin
2017-07-15 23:51:38,321 fail2ban.filter : INFO   Added logfile = /var/log/nginx/access.log
2017-07-15 23:51:38,322 fail2ban.filter : INFO   Set maxRetry = 2
2017-07-15 23:51:38,323 fail2ban.filter : INFO   Set findtime = 600
2017-07-15 23:51:38,323 fail2ban.actions: INFO   Set banTime = 43600
2017-07-15 23:51:38,328 fail2ban.jail   : INFO   Jail 'ssh' started
2017-07-15 23:51:38,329 fail2ban.jail   : INFO   Jail 'xmlrpc' started
# 以上日志显示自定义的xmlrpc filter已经生效
2017-07-15 23:51:45,350 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.8
2017-07-15 23:51:45,361 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.9
2017-07-15 23:51:45,368 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.6
2017-07-15 23:51:45,376 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.7
2017-07-15 23:51:45,382 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.16
2017-07-15 23:51:45,387 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.14
2017-07-15 23:51:45,392 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.15
2017-07-15 23:51:45,400 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.12
2017-07-15 23:51:45,415 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.10
2017-07-15 23:51:45,426 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.11
# 以上日志则显示成功防御对xmlrpc进行攻击的IP等情况

参考链接:https://rbgeek.wordpress.com/2014/09/11/block-wordpress-xmlprc-php-ddos-attacks-using-fail2ban/

WordPress插件:https://wordpress.org/plugins/wp-fail2ban/

Related posts:

  1. WordPress 启用HTTPS设置
  2. Wp Super Cache + Nginx规则
  3. Akismet:强大的反垃圾评论插件
  4. 浅谈博客的友情链接与链接
  5. WordPress移除静态资源版本号

9个常用iptables配置实例

iptables命令可用于配置Linux的包过滤规则,常用于实现防火墙、NAT。咋一看iptables的配置很复杂,掌握规律后,其实用iptables完成指定任务并不难,下面我们通过具体实例,学习iptables的详细用法。

1. 删除已有规则

在新设定iptables规则时,我们一般先确保旧规则被清除,用以下命令清除旧规则:

iptables -F
(or iptables --flush)

2. 设置chain策略

对于filter table,默认的chain策略为ACCEPT,我们可以通过以下命令修改chain的策略:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

以上命令配置将接收、转发和发出包均丢弃,施行比较严格的包管理。由于接收和发包均被设置为丢弃,当进一步配置其他规则的时候,需要注意针对INPUT和OUTPUT分别配置。当然,如果信任本机器往外发包,以上第三条规则可不必配置。

3. 屏蔽指定ip

有时候我们发现某个ip不停的往服务器发包,这时我们可以使用以下命令,将指定ip发来的包丢弃:

BLOCK_THIS_IP="x.x.x.x"iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

以上命令设置将由x.x.x.x ip发往eth0网口的tcp包丢弃。

4. 配置服务项

利用iptables,我们可以对日常用到的服务项进行安全管理,比如设定只能通过指定网段、由指定网口通过SSH连接本机:

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

若要支持由本机通过SSH连接其他机器,由于在本机端口建立连接,因而还需要设置以下规则:

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

类似的,对于HTTP/HTTPS(80/443)、pop3(110)、rsync(873)、MySQL(3306)等基于tcp连接的服务,也可以参照上述命令配置。

对于基于udp的dns服务,使用以下命令开启端口服务:

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

5. 网口转发配置

对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的包转发到该网口实现内网向公网通信,假设eth0连接内网,eth1连接公网,配置规则如下:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

6. 端口转发配置

对于端口,我们也可以运用iptables完成转发配置:

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

以上命令将422端口的包转发到22端口,因而通过422端口也可进行SSH连接,当然对于422端口,我们也需要像以上“4.配置服务项”一节一样,配置其支持连接建立的规则。

7. DoS攻击防范

利用扩展模块limit,我们还可以配置iptables规则,实现DoS攻击防范:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

–litmit 25/minute 指示每分钟限制最大连接数为25

–litmit-burst 100 指示当总连接数超过100时,启动 litmit/minute 限制

8. 配置web流量均衡

我们可以将一台服务器作为前端服务器,利用iptables进行流量分发,配置方法如下:

iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80 

iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.102:80 

iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.103:80

以上配置规则用到nth扩展模块,将80端口的流量均衡到三台服务器。

9. 将丢弃包情况记入日志

使用LOG目标和syslog服务,我们可以记录某协议某端口下的收发包情况。拿记录丢包情况举例,可以通过以下方式实现。

首先自定义一个chain:

iptables -N LOGGING

其次将所有接收包导入LOGGING chain中:

iptables -A INPUT -j LOGGING

然后设置日志前缀、日志级别:

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

最后将包倒向DROP,将包丢弃:

iptables -A LOGGING -j DROP

另可以配置syslog.conf文件,指定iptables的日志输出。

iptables配置只允许PHP 9000端口访问

以一键安装包搭建的环境为基础,php 默认是监听在 127.0.0.1:9000 。本文以此为例进行配置说明:

通常,设置 iptables 会对于服务器的对外访问都设置为允许比如:

filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0]

允许 9000 端口入站规则就可以 ,配置示例如下:

服务器安全

如果出站规则设置的比较严格,设置默认 OUTPUT 为 DROP,则需补充设置对应的规则:

-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

服务器安全

备注:默认情况下,CentOS 下 iptables 的配置文件在 /etc/sysconfig/iptables,修改配置文件之后需要重启 iptables 生效。

Linux桌面系统iptables安全配置

服务器安全

Linux 的安全声誉一直比 Windows 系统要好,但它也并不完美。有许多 Linux 发行版都没有采用最佳的安全默认值,所以用户在安装好系统之后,大多需要自行实施安全配置。

例如:Linux 桌面安装完成后,默认的防火墙配置都不像 Windows 那样已经内置了很多常用的安全策略,而需要用户手动进行安全配置。

而不论是 Linux 桌面版还是服务器版本,都内置了 iptables 这一包过滤器(严格来说只是包过滤器的控制器),在本指南中,系统极客将向大家介绍如何使用 iptables 来保护您的 Linux 桌面系统安全。

什么是iptables

iptables 是内置于 Linux 内核中的包过滤器,几乎所有 Linux 发行版都自带了此功能。它是控制计算机进、出网络流量的最直接方式,在很多场景下都被当作防火墙来使用。

iptables 在开源领域、Linux 行业或普通用户中都有不小的名声,你不需要了解 iptables 的繁杂内容就可以在 Linux 桌面上有效地使用它,但还是需要掌握一些基本知识才能用好。

iptables命令结构

所有 iptables 规则都遵循相同的基本结构。简单来说,每条规则其实都是可以单独执行的 iptables 命令,它会告诉 Linux 内核如何处理特定端口的流量。 示例如下:

-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED,RELATED --sport 80 -j ACCEPT

上述命令看似复杂,但我们将其拆开来看的话,其实真的很简单。首先,这条规则的 -A 表示将此条规则附加到你的 iptables 规则上。

随后的 -i 标志指定了此规则所用的网络接口 eth0。(你在编写自己的规则时,请确保知道通过哪个网口连接到网络。)

-p 标志用于指定协议,以上这条规则适用于 tcp 协议。

-m 标志有点不同,它用于判断必须满足的条件才能使流量不被拒绝。 此规则的条件是状态。

–sport 代表「源端口」,它告诉 iptables 流量来自哪个端口。 还有一个 –dport 标志代表「目标端口」,它用于处理哪些端口流量可到达 OUTPUT。

最后还有 -j 标志,它用于对符合此条 iptables 规则的数据包执行 ACCEPT、DROP 或 REJECT 操作。

对于普通用户来说,最常见的 iptables 命令参数就是如此,普通桌面 Linux 用户应该够用了。但如果你想要详细并全面了解 iptables,还需要把表(tables)、链(chain)、规则(rules)以及 iptables 的数据包处理流程都研究清楚才行,在这里我们不做详细说明。

使用iptables规则文件

所有 Linux 用户在配置 iptables 策略时都可以逐条输入命令,但每次都单独配置的话会非常繁琐,而且不利于复用。所以,创建单独的 iptables 规则文件就要明智得多。

iptables 规则文件只要是文本文件类型即可,而且必需以如下格式开头和结尾。本文我们使用 /tmp/iptables-ip4 文件作为示例,在文件中添加以下两行,所有规则都被包在它们之间。

*filter
#规则
#规则
#规则
COMMIT

适用于Linux桌面安全的iptables规则

回到本文的主题,现在开始介绍用于保护 Linux 桌面安全的常见 iptables 规则。当然,如下规则只是对普通 Linux 桌面环境的安全建议,如果你还在运行其他服务或需要打开其他端口,也可以调整某些内容或添加自己的规则。

Loopback

环回接口是 Linux 使用的内部接口:

-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

Ping

有许多用户都喜欢对自己的桌面计算机禁 Ping,但系统极客建议大家尽量不要对桌面系统禁 Ping,这对于日常的网络连接测试还是很有用的。如果要允许 ping,请添加下面的规则:

-A INPUT -i ens33 -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
-A INPUT -i ens33 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o ens33 -p icmp -j ACCEPT

Web访问

大家日常办公的机器显然是需要访问网页的,所以可用如下规则打开 Web 服务访问:

-A INPUT -i ens33 -p tcp -m state --state ESTABLISHED,RELATED --sport 80 -j ACCEPT
-A INPUT -i ens33 -p tcp -m state --state ESTABLISHED,RELATED --sport 443 -j ACCEPT

-A OUTPUT -o ens33 -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -o ens33 -p tcp -m tcp --dport 443 -j ACCEPT

当然,要将网站的域名解析为 IP 地址还需要允许 DNS 查询:

-A INPUT -i ens3 -s 192.168.1.1 -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o ens3 -d 192.168.1.1 -p udp --dport 53 -m udp -j ACCEPT

时间服务

大多数 Linux 桌面会使用 NTP 服务来设置和维护来自 Internet 的系统时间。 所以,需要允许你的计算机连接到 NTP 服务器以获取时间:

-A INPUT -i ens33 -p udp -m state --state ESTABLISHED,RELATED --dport 123 -j ACCEPT
-A OUTPUT -o ens33 -p udp -m udp --sport 123 -j ACCEPT

打印服务

除非你使用的是 USB 打印机或其它方式连接的外部打印机,不然还需要启用与 CUPS 的网络连接:

-A INPUT -p udp -m udp --dport 631 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 631 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 631 -j ACCEPT

电子邮件

对于电子邮件的发送和接收可能会比较棘手,在这里我们允许的是使用 SSL 协议的电子邮件端口:

# IMAP
-A INPUT -i ens33 -p tcp -m state --state ESTABLISHED,RELATED --sport 993 -j ACCEPT
-A OUTPUT -o ens33 -p tcp -m tcp --dport 993 -j ACCEPT

# POP3
-A INPUT -i ens33 -p tcp -m state --state ESTABLISHED,RELATED --sport 995 -j ACCEPT
-A OUTPUT -o ens33 -p tcp -m tcp --dport 995 -j ACCEPT

# SMTP
-A INPUT -i ens33 -p tcp -m state --state ESTABLISHED,RELATED --sport 465 -j ACCEPT
-A OUTPUT -o ens33 -p tcp -m tcp --dport 465 -j ACCEPT

如果你还需要使用不安全的电子邮件,请替换这些端口。

SSH服务

为了使用 SSH 连接还需要允许 SSH 数据包的流入和流出:

# Input
-A INPUT -i ens3 -p tcp -m state --state NEW,ESTABLISHED --dport 22 -j ACCEPT
-A OUTPUT -o ens3 -p tcp -m state --state ESTABLISHED --sport 22 -j ACCEPT
# Output
-A OUTPUT -o ens3 -p tcp -m state --state NEW,ESTABLISHED --dport 22 -j ACCEPT
-A INPUT -i ens3 -p tcp -m state --state ESTABLISHED --sport 22 -j ACCEPT

DHCP服务

大多数 Linux 桌面都通过 DHCP 服务自动从路由器(或 DHCP Server)获取 IP 地址。 DHCP 服务使用自己专有的端口,所以也需要允许其数据包通行。

-A INPUT -i ens33 -p udp -m state --state ESTABLISHED,RELATED --sport 67:68 -j ACCEPT
-A OUTPUT -o ens33 -p udp -m udp --dport 67:68 -j ACCEPT

如果你使用静态 IP,则不需要这些规则。

拒绝其它数据包

日常需要用到的端口和协议都开放了,最后就需要告诉 iptables 绝对拒绝上面规则中没有明确允许的数据包内容:

-A INPUT -j REJECT
-A FORWARD -j REJECT
-A OUTPUT -j REJECT

一切准备妥当之后,你的 iptables 规则文件看起来应该像这样:

服务器安全

导入iptables规则

现在,你已经有了适用于自己环境 Linux 桌面安全的 iptables 规则,只需将它交给 iptables 来使用即可。不过,如果你此前已经添加了一些规则,可以通过如下命令将其清除:

sudo iptables -F && sudo iptables -X

服务器安全

清理完成后,使用如下命令导入 iptables 规则文件:

sudo iptables-restore < /tmp/itpables-ip4

如果要查看当前计算机正使用的新 iptables 规则,可以通过如下命令查看:

sudo iptables -S

服务器安全

最后还需要提醒大家注意,通过手动或规则文件添加的 iptables 规则都不是永久的。如果你重启计算机,这些规则都将被清空,需要重新添加或从文件导入。

配置iptables永久规则

要让 iptables 规则永久化的方法很多,而且不同 Linux 发行版的配置方式也不尽相同。出于 Debian 和 Ubuntu 系统最受广大 Linux 桌面用户的欢迎,所以以其作为示例。

在 Debian 和 Ubuntu 中有一款被称为 iptables-persistant 的应用可以在重启系统的过程中保存和恢复 iptables 规则,所以需要先安装:

sudo apt install iptables-persistent

服务器安全

在安装过程中,软件包会询问您是否要永久保存 iptables 配置,选择「是」就行。

将来在变更了 iptables 规则时,可以运行以下命令再次永久保存:

sudo service netfilter-persistent save

CDNFly安装

支持的系统

  • centos-7
  • centos-6 (不推荐使用)
  • ubuntu 16.04
  • ubuntu 14.04

环境要求

需要干净的系统,可能会覆盖原有的mysql

主控端安装

curl -k "http://devops.webres.wang/httpguard/master.sh?$(date +%s)" -o master.sh
chmod +x master.sh
./master.sh

被控节点安装

curl -k "http://devops.webres.wang/httpguard/agent.sh?$(date +%s)" -o agent.sh
chmod +x agent.sh
./agent.sh 主控端IP

请把上面命令的主控端IP替换为真实的IP,如127.0.0.1

主控端访问

地址:http://ip:88/
用户和密码:admin guard

安装Letsencrypt创建免费SSL证书

Let’s Encrypt是由Internet安全研究组(ISRG)管理的SSL证书颁发机构。 它利用自动证书管理环境(ACME)自动部署几乎被所有主流浏览器信任的免费SSL证书。
本教程将涵盖以下内容:
安装Letsencrypt ACME客户端。
获取Letsencrypt证书。
需要注意和维护的事项。
关于Let’s Encrypt及其颁发的证书的技术细节。

下载和安装Let’s Encrypt

1.安装git
CentOS

  1. sudo yum install git

Debian / Ubuntu

  1. sudo apt-get install git

2.从官方的GitHub存储库下载Let’s Encrypt。 /opt是第三方软件包的公共安装目录,所以让我们将安装到/opt/letsencrypt:

  1. sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

3.切换到/opt/letsencrypt目录

  1. cd /opt/letsencrypt

创建SSL证书

Let’s Encrypt使用一系列验证来自动完成域名验证(DV)。 证书颁发机构(CA)通过一些方法来验证计算机域的真实性。 一旦您的服务器验证通过,CA将颁发SSL证书给您。
1.使用–standalone参数运行Let’s Encrypt。 对于需要证书的每个其他域名,请将-d example.com添加到命令的末尾。

  1. sudo -H ./letsencrypt-auto certonly –standalone -d example.com -d www.example.com

注意:
Let’s Encrypt不部署通配符证书。 每个子域都需要自己的证书。
2.指定管理电子邮件地址。 这为了让您能重新获得丢失证书的控制权,并在必要时接收紧急安全通知。 按TAB,然后按ENTER或RETURN保存。
3.同意服务条款。
4.如果一切正常,将出现类似下面的消息。 它的输出意味着Let’s Encrypt已经批准并颁发了您的证书。

IMPORTANT NOTES:
– If you lose your account credentials, you can recover them through
e-mails sent to [email protected].
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-31. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.
– Your account credentials have been saved in your Let’s Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let’s
Encrypt, so making regular backups of this folder is ideal.
– If you like Let’s Encrypt, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Let’s Encrypt证书目录结构

1.列出/etc/letsencrypt/live目录:

  1. sudo ls /etc/letsencrypt/live

2.在创建SSL证书单节的步骤1中指定的各个域名都有自己的目录。 列出以下任意域名目录:

  1. sudo ls /etc/letsencrypt/live/example.com

输出:
cert.pem
chain.pem
fullchain.pem
privkey.pem
3.每个key(.pem)文件有不同的用途:
cert.pem:唯一的服务器证书。
chain.pem:根和中间证书。
fullchain.pem:服务器,根和中间证书的组合(替代cert.pem和chain.pem)。
privkey.pem:私有密钥(不要与任何人分享这个!)。
Let’s Encrypt从中间证书颁发机构颁发证书。 中间证书已由Identrust交叉签名,确保最终证书与所有主要浏览器之间的兼容性。 有关详细信息,请参阅Let’s Encrypt的官网。
4.显示fullchain.pem的文件状态:

  1. sudo stat /etc/letsencrypt/live/example.com/fullchain.pem

输出:

  1. File: ‘live/example.com/cert.pem’ -> ‘../../archive/example.com/cert1.pem’

注意这个文件指向了一个不同的文件,就像步骤3中列出的四个文件一样。它们是软链接,链接到/etc/letsencrypt/archive目录中的证书文件。
5.如果您忘记续订域名证书,Let’s Encrypt将删除/etc/letsencrypt/live中对应的目录(和软链接)。 但是,目录(和软链接)将保留在/etc/letsencrypt/archive和/etc/letsencrypt/keys目录中,以供需要时查看。

维护

续订SSL证书

1.回到cd /opt/letsencrypt目录

  1. cd /opt/letsencrypt

2.执行您在创建SSL证书的步骤1中使用的命令,添加–renew-by-default参数:

  1. sudo -H ./letsencrypt-auto certonly –standalone –renew-by-default -d example.com -d www.example.com

3.片刻之后,将出现以下内容:
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-31. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.
– If you like Let’s Encrypt, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

自动续订SSL证书(可选)

我们建议您设置自动更新证书,因为很忘记到期日期,尤其是如果您拥有多个不同的域名。 为了避免此问题,并可以使用cron来自动续订证书。
1.在我们执行下面的命令之前,让我们将其分解,并进行一些修改:

  1. echo ‘@monthly root /opt/letsencrypt/letsencrypt-auto certonly –standalone –renew-by-default -d example.com -d www.example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log’ | sudo tee –append /etc/crontab

@monthly:为了简单起见,此命令将在每月的第一天的午夜执行
root:以root用户身份运行命令
/opt/letsencrypt/letsencrypt-auto certonly -standalone -renew-by-default -d example.com -d www.example.com:letsencrypt-auto更新命令。
»/var/log/letsencrypt/letsencrypt-auto-update.log:将标准输出和标准错误记录到名为letsencrypt-auto-update.log的日志文件
tee -append /etc/crontab:将新的cron作业保存到/etc/crontab文件
2.执行您修改的命令以将cron作业添加到您的服务器。

更新Let’s Encrypt

1.回到/opt/letsencrypt目录

  1. cd /opt/letsencrypt

2.从你上次下载Let’s Encrypt的仓库拉取对Let’s Encrypt所做的任何更改:

  1. sudo git pull

VPN配置第二部分 – 设置你的流量走OpenVPN通道

此文章是http://devops.webres.wang/2016/10/debian-8-setup-secure-openvpn/的第二部分

OpenVPN配置

OpenVPN服务端配置文件/etc/openvpn/server.conf,需要更改几处。
1.设置OpenVPN推送网关配置到客户端,以让客户端流量通过OpenVPN传送。
/etc/openvpn/server.conf:

  1. # If enabled, this directive will configure
  2. # all clients to redirect their default
  3. # network gateway through the VPN, causing
  4. # all IP traffic such as web browsing and
  5. # and DNS lookups to go through the VPN
  6. # (The OpenVPN server machine may need to NAT
  7. # or bridge the TUN/TAP interface to the internet
  8. # in order for this to work properly).
  9. push "redirect-gateway def1 bypass-dhcp"

2.推荐DNS服务器地址到客户端设备
/etc/openvpn/server.conf:

  1. # Certain Windows-specific network settings
  2. # can be pushed to clients, such as DNS
  3. # or WINS server addresses.  CAVEAT:
  4. # http://openvpn.net/faq.html#dhcpcaveats
  5. # The addresses below refer to the public
  6. # DNS servers provided by opendns.com.
  7. push "dhcp-option DNS 208.67.222.222"
  8. push "dhcp-option DNS 208.67.220.220"

3.重启OpenVPN

  1. sudo systemctl restart openvpn.service

网络规则

1.创建IPv4规则:
/etc/iptables/rules.v4

  1. *filter
  2.  
  3. # Allow all loopback (lo) traffic and reject traffic
  4. # to localhost that does not originate from lo.
  5. -A INPUT -i lo -j ACCEPT
  6. -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
  7. -A OUTPUT -o lo -j ACCEPT
  8.  
  9. # Allow ping and ICMP error returns.
  10. -A INPUT -p icmp -m state –state NEW –icmp-type 8 -j ACCEPT
  11. -A INPUT -p icmp -m state –state ESTABLISHED,RELATED -j ACCEPT
  12. -A OUTPUT -p icmp -j ACCEPT
  13.  
  14. # Allow SSH.
  15. -A INPUT -i eth0 -p tcp -m state –state NEW,ESTABLISHED –dport 22 -j ACCEPT
  16. -A OUTPUT -o eth0 -p tcp -m state –state ESTABLISHED –sport 22 -j ACCEPT
  17.  
  18. # Allow UDP traffic on port 1194.
  19. -A INPUT -i eth0 -p udp -m state –state NEW,ESTABLISHED –dport 1194 -j ACCEPT
  20. -A OUTPUT -o eth0 -p udp -m state –state ESTABLISHED –sport 1194 -j ACCEPT
  21.  
  22. # Allow DNS resolution and limited HTTP/S on eth0.
  23. # Necessary for updating the server and keeping time.
  24. -A INPUT -i eth0 -p udp -m state –state ESTABLISHED –sport 53 -j ACCEPT
  25. -A OUTPUT -o eth0 -p udp -m state –state NEW,ESTABLISHED –dport 53 -j ACCEPT
  26. -A INPUT -i eth0 -p tcp -m state –state ESTABLISHED –sport 53 -j ACCEPT
  27. -A OUTPUT -o eth0 -p tcp -m state –state NEW,ESTABLISHED –dport 53 -j ACCEPT
  28.  
  29. -A INPUT -i eth0 -p tcp -m state –state ESTABLISHED –sport 80 -j ACCEPT
  30. -A OUTPUT -o eth0 -p tcp -m state –state NEW,ESTABLISHED –dport 80 -j ACCEPT
  31. -A INPUT -i eth0 -p tcp -m state –state ESTABLISHED –sport 443 -j ACCEPT
  32. -A OUTPUT -o eth0 -p tcp -m state –state NEW,ESTABLISHED –dport 443 -j ACCEPT
  33.  
  34. # Allow traffic on the TUN interface.
  35. -A INPUT -i tun0 -j ACCEPT
  36. -A FORWARD -i tun0 -j ACCEPT
  37. -A OUTPUT -o tun0 -j ACCEPT
  38.  
  39. # Allow forwarding traffic only from the VPN.
  40. -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
  41. -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
  42.  
  43. # Log any packets which don’t fit the rules above…
  44. # (optional but useful)
  45. -A INPUT -m limit –limit 3/min -j LOG –log-prefix "iptables_INPUT_denied: " –log-level 4
  46. -A FORWARD -m limit –limit 3/min -j LOG –log-prefix "iptables_FORWARD_denied: " –log-level 4
  47. -A OUTPUT -m limit –limit 3/min -j LOG –log-prefix "iptables_OUTPUT_denied: " –log-level 4
  48.  
  49. # then reject them.
  50. -A INPUT -j REJECT
  51. -A FORWARD -j REJECT
  52. -A OUTPUT -j REJECT
  53.  
  54. COMMIT

2.导入新规则
sudo iptables-restore < /etc/iptables/rules.v4
3.应用路由规则,以便流量可以正常发送到VPN。

  1. sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

4.保存目前已加载的规则

  1. sudo dpkg-reconfigure iptables-persistent

5.允许IPv4流量转发

  1. echo ‘net.ipv4.ip_forward=1’ | sudo tee -a /etc/sysctl.d/99-sysctl.conf

6.应用生效

  1. sudo sysctl -p

7.重启OpenVPN

  1. sudo systemctl restart openvpn.service

VPN配置第一部分 – Debian 8安装配置安全的OpenVPN服务器

OpenVPN软件选择

目前openvpn有两个软件供选择:
一个是OpenVPN Community Edition,社区版本,它的服务端和客户端的配置文件需要手动编辑,客户端凭据需要使用SCP或者SFTP复制到各自的设备。
另一个是OpenVPN Access Server,服务端应用程序,允许你使用浏览器来配置OpenVPN。
对于小场景下应用,OpenVPN Access Server可能是较好的选择,因为它配置简单,用户体验好。
不过免费版本只允许两个并发用户。我们这里介绍OpenVPN Community Edition的使用。

网络规则

OpenVPN目前不支持单个实例同时使用IPv4和IPv6。只能选择其中一个。

IPv4防火墙

1.清除任何系统可能预先存在的规则和非标准的规则链

  1. sudo iptables -F && sudo iptables -X

2.使用如下规则:
/tmp/v4:

  1. *filter
  2.  
  3. # Allow all loopback (lo) traffic and reject anything
  4. # to localhost that does not originate from lo.
  5. -A INPUT -i lo -j ACCEPT
  6. -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
  7. -A OUTPUT -o lo -j ACCEPT
  8.  
  9. # Allow ping and ICMP error returns.
  10. -A INPUT -p icmp -m state –state NEW –icmp-type 8 -j ACCEPT
  11. -A INPUT -p icmp -m state –state ESTABLISHED,RELATED -j ACCEPT
  12. -A OUTPUT -p icmp -j ACCEPT
  13.  
  14. # Allow SSH.
  15. -A INPUT -i eth0 -p tcp -m state –state NEW,ESTABLISHED –dport 22 -j ACCEPT
  16. -A OUTPUT -o eth0 -p tcp -m state –state ESTABLISHED –sport 22 -j ACCEPT
  17.  
  18. # Allow UDP traffic on port 1194.
  19. -A INPUT -i eth0 -p udp -m state –state NEW,ESTABLISHED –dport 1194 -j ACCEPT
  20. -A OUTPUT -o eth0 -p udp -m state –state ESTABLISHED –sport 1194 -j ACCEPT
  21.  
  22. # Allow DNS resolution and limited HTTP/S on eth0.
  23. # Necessary for updating the server and keeping time.
  24. -A INPUT -i eth0 -p udp -m state –state ESTABLISHED –sport 53 -j ACCEPT
  25. -A OUTPUT -o eth0 -p udp -m state –state NEW,ESTABLISHED –dport 53 -j ACCEPT
  26. -A INPUT -i eth0 -p tcp -m state –state ESTABLISHED –sport 80 -j ACCEPT
  27. -A INPUT -i eth0 -p tcp -m state –state ESTABLISHED –sport 443 -j ACCEPT
  28. -A OUTPUT -o eth0 -p tcp -m state –state NEW,ESTABLISHED –dport 80 -j ACCEPT
  29. -A OUTPUT -o eth0 -p tcp -m state –state NEW,ESTABLISHED –dport 443 -j ACCEPT
  30.  
  31. # Allow traffic on the TUN interface.
  32. -A INPUT -i tun0 -j ACCEPT
  33. -A OUTPUT -o tun0 -j ACCEPT
  34.  
  35. # Log any packets which don’t fit the rules above…
  36. # (optional but useful)
  37. -A INPUT -m limit –limit 3/min -j LOG –log-prefix "iptables_INPUT_denied: " –log-level 4
  38. -A FORWARD -m limit –limit 3/min -j LOG –log-prefix "iptables_FORWARD_denied: " –log-level 4
  39. -A OUTPUT -m limit –limit 3/min -j LOG –log-prefix "iptables_OUTPUT_denied: " –log-level 4
  40.  
  41. # then reject them.
  42. -A INPUT -j REJECT
  43. -A FORWARD -j REJECT
  44. -A OUTPUT -j REJECT
  45.  
  46. COMMIT

注意:
TUN虚拟接口是OpenVPN用来与你的硬件网卡eth0通信的。

你可以使用sudo iptables -S来加载上面的规则。

禁用IPv6

如果你的VPN仅仅使用IPv4,IPv6应该禁用掉。
1.在文件/etc/sysctl.d/99-sysctl.conf增加如下行

  1. net.ipv6.conf.all.disable_ipv6 = 1
  2. net.ipv6.conf.default.disable_ipv6 = 1
  3. net.ipv6.conf.lo.disable_ipv6 = 1
  4. net.ipv6.conf.eth0.disable_ipv6 = 1

2.激活上面的配置:

  1. sudo sysctl -p

3.编辑/etc/hosts,注释localhost的IPv6解析
/etc/hosts:

  1. #::1     localhost ip6-localhost ip6-loopback

4.增加ip6tables规则集来拒绝所有v6流量。rules.v6文件如下:
/etc/iptables/rules.v6:

  1. *filter
  2.  
  3. -A INPUT -j REJECT
  4. -A FORWARD -j REJECT
  5. -A OUTPUT -j REJECT
  6.  
  7. COMMIT

6.强制规则立即生效

  1. sudo ip6tables-restore < /etc/iptables/rules.v6

安装配置OpenVPN

1.开始安装OpenVPN

  1. apt-get install openvpn

2.OpenVPN的服务端配置文件/etc/openvpn/server.conf从一个压缩文件解压出:

  1. gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

3.使用make-cadir脚本来从/usr/share/doc/openvpn/examples/复制必要的文件并创建工作目录。

  1. make-cadir /etc/openvpn/easy-rsa && cd /etc/openvpn/easy-rsa/

4.创建一个软链接

  1. ln -s openssl-1.0.0.cnf openssl.cnf

5./etc/openvpn/easy-rsa/keys的权限为0700,它不允许组和其它用户来访问。基于此原因,我们在server.conf的key设置绝对路径。
/etc/openvpn/server.conf:

  1. # Any X509 key management system can be used.
  2. # OpenVPN can also use a PKCS #12 formatted key file
  3. # (see "pkcs12" directive in man page).
  4. ca /etc/openvpn/easy-rsa/keys/ca.crt
  5. cert /etc/openvpn/easy-rsa/keys/server.crt
  6. key /etc/openvpn/easy-rsa/keys/server.key  # This file should be kept secret
  7.  
  8. # Diffie hellman parameters.
  9. # Generate your own with:
  10. #   openssl dhparam -out dh1024.pem 1024
  11. # Substitute 2048 for 1024 if you are using
  12. # 2048 bit keys.
  13. dh /etc/openvpn/dh4096.pem

6./etc/openvpn/easy-rsa/vars文件用来指定OpenVPN服务器的证书颁发机构的标识信息,然后将其传递到客户端证书。 更改这些字段是可选的,你可以保持不变以减小工作量。
/etc/openvpn/easy-rsa/vars:

  1. # These are the default values for fields
  2. # which will be placed in the certificate.
  3. # Don’t leave any of these fields blank.
  4. export KEY_COUNTRY="US"
  5. export KEY_PROVINCE="CA"
  6. export KEY_CITY="SanFrancisco"
  7. export KEY_ORG="Fort-Funston"
  8. export KEY_EMAIL="[email protected]"
  9. export KEY_OU="MyOrganizationalUnit"

7.在easy-rsa目录,导入vars脚本

  1. cd /etc/openvpn/easy-rsa && source ./vars

8.运行clean-all脚本确保在keys目录中没有使用样本文件或模板
./clean-all

生成Diffie-Hellman PEM

Diffie-Hellman参数是在创建客户端的会话密钥期间当建立加密连接时使用的随机生成的数据的块。 我们将在/etc/openvpn/dh*.pem创建文件,其中*表示Diffie-Hellman密钥的位长度。 2048位是默认值,但在这里我们将使用4096位的密钥。
使用如下命令创建pem文件

  1. openssl dhparam 4096 > /etc/openvpn/dh4096.pem

将输出:

Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time

加固OpenVPN

1.对服务器和连接客户端之间的TLS握手涉及的所有数据包都需要匹配HMAC签名,没有此签名的数据包将被丢弃。 取消注释(通过删除;)并编辑行:tls-auth ta.key 0#This file is secret。
/etc/openvpn/server.conf:

  1. # For extra security beyond that provided
  2. # by SSL/TLS, create an "HMAC firewall"
  3. # to help block DoS attacks and UDP port flooding.
  4. #
  5. # Generate with:
  6. #   openvpn –genkey –secret ta.key
  7. #
  8. # The server and each client must have
  9. # a copy of this key.
  10. # The second parameter should be ‘0’
  11. # on the server and ‘1’ on the clients.
  12. tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 # This file is secret

生成HMAC密钥文件,之后我们会传输到每一个客户端设备

  1. openvpn –genkey –secret /etc/openvpn/easy-rsa/keys/ta.key

2.设置使用一个有权限限制的用户来运行OpenVPN

  1. adduser –system –shell /usr/sbin/nologin –no-create-home openvpn_server

取消user和group行的注释,并编辑user行,使用以上建立的用户名。这告诉OpenVPN启动时不使用root权限而切换到openvpn_server用户。
/etc/openvpn/server.conf:

  1. # It’s a good idea to reduce the OpenVPN
  2. # daemon’s privileges after initialization.
  3. #
  4. # You can uncomment this out on
  5. # non-Windows systems.
  6. user openvpn_server
  7. group nogroup

3.在CBC模式下,更改VPN的数据通道以使用256位密钥的AES。 Blowfish-128是默认值,但是AES_CBC通常被认为是OpenVPN支持的最安全的密码和模式组合(见openvpn –show-ciphers),并且可以利用AES-NI提高性能。

  1. echo ‘cipher AES-256-CBC’ >> /etc/openvpn/server.conf

4.将数据通道的认证摘要更改为SHA-512,一个SHA-2散列函数。 SHA-1是默认值; 请参阅openvpn –show-digest,了解所有支持的摘要。

  1. echo ‘auth SHA512’ >> /etc/openvpn/server.conf

5.将VPN的控制通道限制为强密码套件。 建议在这里尽可能限制,但不是所有的密码套件都可以与所有版本的OpenVPN一起使用。 通过使用SHA 2的TLS 1.2在GCM模式下将池限制为AES,并且在CBC模式下使用SHA 1在TLS 1.0上的AES和Camellia。
echo ‘tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA’ >> /etc/openvpn/server.conf

证书和密钥对

开始之前,先进入easy-rsa目录

  1. cd /etc/openvpn/easy-rsa

服务器凭据

1.根证书(有时也称为证书颁发机构)是证书和密钥对,用于生成客户端密钥对。 在每个提示下,添加或编辑要在证书中使用的信息(或将其留空)。 使用服务器的主机名或其他标识符作为公用名,并将挑战密码留空。

  1. ./build-ca

2.然后创建服务器的私钥; 再次根据需要在信息提示处添加或编辑:

  1. /build-key-server server

客户端凭据

连接到VPN的每个客户端设备应该有自己的唯一密钥。 此外,每个密钥应该有自己的标识符(client1,client2等),但所有其他证书信息可以保持不变。 如果您稍后需要添加用户,只需重复此步骤即可。

  1. cd /etc/openvpn/easy-rsa && source ./vars && ./build-key client1

客户端配置文件

1.复制client.conf模板文件并将其打开以进行编辑。 大多数客户端需要.ovpn文件格式而不是.conf,并且文件扩展名可以在提取期间更改:

  1. cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

2.指定OpenVPN的服务器IP
/etc/openvpn/easy-rsa/keys/client.ovpn:

  1. # The hostname/IP and port of the server.
  2. # You can have multiple remote entries
  3. # to load balance between the servers.
  4.  
  5. remote 192.0.2.0 1194

3.使用普通用户启动openvpn客户端(非windows系统使用)
/etc/openvpn/easy-rsa/keys/client.ovpn:

  1. # Downgrade privileges after initialization (non-Windows only)
  2. user nobody
  3. group nogroup

4.指定crt,key文件路径
/etc/openvpn/easy-rsa/keys/client.ovpn:

  1. # SSL/TLS parms.
  2. # See the server config file for more
  3. # description.  It’s best to use
  4. # a separate .crt/.key file pair
  5. # for each client.  A single ca
  6. # file can be used for all clients.
  7. ca /path/to/ca.crt
  8. cert /path/to/client1.crt
  9. key /path/to/client1.key

5.告诉客户端使用先前生成的HMAC密钥。 如有必要,再次指定路径。
/etc/openvpn/easy-rsa/keys/client.ovpn:

  1. # If a tls-auth key is used on the server
  2. # then every client must also have the key.
  3. tls-auth /path/to/ta.key 1

6.由于VPN服务器被告知在其配置文件中强制某些加密设置,客户端必须具有相同的设置。 将这些行添加到client.ovpn的末尾:

  1. cipher AES-256-CBC
  2. auth SHA512

如果有为控制通道指定密码套件,将这些行添加到client.ovpn:

  1. tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA

7.将所有必要的客户端文件打包到一个tarball准备传输。 具体文件有:
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key
/etc/openvpn/easy-rsa/keys/client.ovpn
/etc/openvpn/easy-rsa/keys/ta.key

  1. tar -C /etc/openvpn/easy-rsa/keys -cvzf /etc/openvpn/client1.tar.gz {ca.crt,client1.crt,client1.key,client.ovpn,ta.key}

设置开机启动

  1. sudo systemctl enable openvpn.service && sudo systemctl start openvpn.service

如何使用UFW配置防火墙

安装UFW

UFW已经默认包含在Ubuntu中,不过Arch和Debian系统应该也是安装好了的。 Debian可以使用systemd启动UFW,并能够开机启动,Arch则没有设置。默认情况下,UFW的规则集为空,因此即使UFW守护程序在运行,也不会强制执行任何防火墙规则。

Arch Linux

1.安装UFW:

  1. sudo pacman -S ufw

2.启动和激活UFW systemd unit:

  1. sudo systemctl start ufw
  2. sudo systemctl enable ufw

Debian / Ubuntu

1.安装UFW:

  1. sudo apt-get install ufw

使用UFW管理防火墙规则

设置默认规则

大多数系统只需要打开少量的端口让连接进入,其余的端口则关闭。 从一个简单基础的规则开始,可以使用ufw default命令来设对入站和出站连接设置默认响应规则。 要拒绝所有入站连接并允许所有出站连接,运行:

  1. sudo ufw default allow outgoing
  2. sudo ufw default deny incoming

ufw default命令还允许使用reject参数。

添加规则

可以通过两种方式添加规则:通过端口号或使用服务名称。
例如,要允许ssh端口22上的入站和出站连接,可以运行:

  1. sudo ufw allow ssh

也可以运行:

  1. sudo ufw allow 22

同样,要拒绝某个端口(在本例中为111)上的流量,您只需运行:

  1. sudo ufw deny 111

要进一步微调规则,您还可以允许TCP或UDP的数据包。 以下将允许端口80上的TCP数据包:

  1. sudo ufw allow 80/tcp
  2. sudo ufw allow http/tcp

而这将允许1725的UDP数据包:

  1. sudo ufw allow 1725/udp

高级规则

除了基于端口的设置允许或拒绝规则,UFW还允许您通过IP地址,子网和IP地址/子网/端口组合设置允许/阻止规则。
允许一个IP地址的连接:

  1. sudo ufw allow from 123.45.67.89

允许一个特定子网的连接:

  1. sudo ufw allow from 123.45.67.89/24

允许一个特定IP地址/端口的组合连接:

  1. sudo ufw allow from 123.45.67.89 to any port 22 proto tcp

proto tcp可以删除或改为proto udp,并且allow可以根据需要更改为deny。

删除规则

要删除规则,在规则前添加delete。 如果您不再希望允许HTTP流量,您可以运行:

  1. sudo ufw delete allow 80

激活防火墙

你的规则设置完成后,ufw初始运行状态可能会输出Status:inactive。 启用UFW并强制执行防火墙规则:

  1. sudo ufw enable

同样的,禁用防火墙规则:

  1. sudo ufw disable

使用TCP Wrappers来保护你的系统

TCP wrappers是基于主机的访问控制系统。它用来阻止非授权的访问,只允许特定客户访问你服务器上的服务。

为什么使用TCP wrappers

TCP wrappers在你的服务器与任何潜在的攻击者之间创建了额外的安全层。除了访问控制功能之外,它还提供日志记录和主机名验证。TCP wrappers在大多数Linux或者类UNIX系统能开箱即用,这使得它能够容易的配置,是对目前已经存在的防火墙的完美补充。

如何判断一个程序是否支持TCP wrappers

不是所有的程序都支持TCP wrappers。程序必须与libwrap库编译。常见的服务像sshd,ftpd和telnet默认支持TCP wrappers。我们可以使用如下命令来检查是否支持TCP wrappers:

  1. ldd /path-to-daemon | grep libwrap.so

ldd命令会打印出可执行文件共享依赖列表。把ldd命令输出管道给grep,来查找是否包含libwrap.so。如果有输出,则表示支持TCP wrappers。

如何使用TCP wrappers

TCP wrappers依赖两个文件/etc/hosts.allow和/etc/hosts.deny,如果这些文件不存在,先创建:

  1. touch /etc/hosts.{allow,deny}

编辑hosts.allow和hosts.deny

没有编辑过的/etc/hosts.deny文件内容如下:

  1. #
  2. # hosts.deny    This file contains access rules which are used to
  3. #       deny connections to network services that either use
  4. #       the tcp_wrappers library or that have been
  5. #       started through a tcp_wrappers-enabled xinetd.
  6. #
  7. #       The rules in this file can also be set up in
  8. #       /etc/hosts.allow with a ‘deny’ option instead.
  9. #
  10. #       See ‘man 5 hosts_options’ and ‘man 5 hosts_access’
  11. #       for information on rule syntax.
  12. #       See ‘man tcpd’ for information on tcp_wrappers
  13. #

hosts.deny里的规则由上往下匹配,如果上面的规则匹配了,就不再往下搜索,往下的将会被忽略。一条规则的语法如下:

  1. daemons : hostnames/IPs

多个daemons或者多个hostnames/IP可以使用空格分隔。

例子

拒绝所有:
这个hosts.deny例子将会阻止所有客户访问所有进程。

  1. ALL : ALL

允许访问:
在hosts.allow文件里的规则比hosts.deny里的规则优先级更高。这就允许我们使用hosts.allow来对禁用规则设置例外。下面的规则表示允许123.45.67.89访问sshd服务:

  1. sshd : 123.45.67.89

通配符

TCP wrappers支持通配符,允许你对一批IP地址或者主机名设置规则。可用通配符来ALL, LOCAL, UNKNOWN, KNOWN和PARANOID。
ALL – 匹配所有
LOCAL – 匹配不包含.的主机名
UNKNOWN – 匹配无法解析出IP的主机名
KNOWN – 匹配可以解析出IP的主机名