我们来研究下 Linux 上的 ufw（简单防火墙），为你更改防火墙提供一些见解和命令。ufw（ 简单防火墙 Uncomplicated FireWall ）真正地简化了 iptables，它从出现的这几年，已经成为 Ubuntu 和 Debian 等系统上的默认防火墙。而且 ufw 出乎意料的简单，这对新管理员来说是一个福音，否则他们可能需要投入大量时间来学习防火墙管理。ufw 也有 GUI 客户端（例如 gufw），但是 ufw 命令通常在命令行上执行的。本文介绍了一些使用 ufw 的命令，并研究了它的工作方式。首先，快速查看 ufw 配置的方法是查看其配置文件 —— /etc/default/ufw。使用下面的命令可以查看其配置，使用 grep 来抑制了空行和注释（以 # 开头的行）的显示。$ grep -v '^#\|^$' /etc/default/ufw IPV6=yes DEFAULT_INPUT_POLICY="DROP" DEFAULT_OUTPUT_POLICY="ACCEPT" DEFAULT_FORWARD_POLICY="DROP" DEFAULT_APPLICATION_POLICY="SKIP" MANAGE_BUILTINS=no IPT_SYSCTL=/etc/ufw/sysctl.conf IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns"正如你所看到的，默认策略是丢弃输入但允许输出。允许你接受特定的连接的其它规则是需要单独配置的。ufw 命令的基本语法如下所示，但是这个概要并不意味着你只需要输入 ufw 就行，而是一个告诉你需要哪些参数的快速提示。ufw [--dry-run] [options] [rule syntax]--dry-run 选项意味着 ufw 不会运行你指定的命令，但会显示给你如果执行后的结果。但是它会显示假如更改后的整个规则集，因此你要做有好多行输出的准备。要检查 ufw 的状态，请运行以下命令。注意，即使是这个命令也需要使用 sudo 或 root 账户。$ sudo ufw status Status: active To Action From -- ------ ---- 22 ALLOW 192.168.0.0/24 9090 ALLOW Anywhere 9090 (v6) ALLOW Anywhere (v6)否则，你会看到以下内容：$ ufw status ERROR: You need to be root to run this script加上 verbose 选项会提供一些其它细节：$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22 ALLOW IN 192.168.0.0/24 9090 ALLOW IN Anywhere 9090 (v6) ALLOW IN Anywhere (v6)你可以使用以下命令轻松地通过端口号允许和拒绝连接：$ sudo ufw allow 80 <== 允许 http 访问 $ sudo ufw deny 25 <== 拒绝 smtp 访问你可以查看 /etc/services 文件来找到端口号和服务名称之间的联系。$ grep 80/ /etc/services http 80/tcp www # WorldWideWeb HTTP socks 1080/tcp # socks proxy server socks 1080/udp http-alt 8080/tcp webcache # WWW caching service http-alt 8080/udp amanda 10080/tcp # amanda backup services amanda 10080/udp canna 5680/tcp # cannaserver或者，你可以命令中直接使用服务的名称。$ sudo ufw allow http Rule added Rule added (v6) $ sudo ufw allow https Rule added Rule added (v6)进行更改后，你应该再次检查状态来查看是否生效：$ sudo ufw status Status: active To Action From -- ------ ---- 22 ALLOW 192.168.0.0/24 9090 ALLOW Anywhere 80/tcp ALLOW Anywhere <== 443/tcp ALLOW Anywhere <== 9090 (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) <== 443/tcp (v6) ALLOW Anywhere (v6) <==ufw 遵循的规则存储在 /etc/ufw 目录中。注意，你需要 root 用户访问权限才能查看这些文件，每个文件都包含大量规则。$ ls -ltr /etc/ufw total 48 -rw-r--r-- 1 root root 1391 Aug 15 2017 sysctl.conf -rw-r----- 1 root root 1004 Aug 17 2017 after.rules -rw-r----- 1 root root 915 Aug 17 2017 after6.rules -rw-r----- 1 root root 1130 Jan 5 2018 before.init -rw-r----- 1 root root 1126 Jan 5 2018 after.init -rw-r----- 1 root root 2537 Mar 25 2019 before.rules -rw-r----- 1 root root 6700 Mar 25 2019 before6.rules drwxr-xr-x 3 root root 4096 Nov 12 08:21 applications.d -rw-r--r-- 1 root root 313 Mar 18 17:30 ufw.conf -rw-r----- 1 root root 1711 Mar 19 10:42 user.rules -rw-r----- 1 root root 1530 Mar 19 10:42 user6.rules本文前面所作的更改，为 http 访问添加了端口 80 和为 https 访问添加了端口 443，在 user.rules 和 user6.rules 文件中看起来像这样：# grep " 80 " user*.rules user6.rules:### tuple ### allow tcp 80 ::/0 any ::/0 in user6.rules:-A ufw6-user-input -p tcp --dport 80 -j ACCEPT user.rules:### tuple ### allow tcp 80 0.0.0.0/0 any 0.0.0.0/0 in user.rules:-A ufw-user-input -p tcp --dport 80 -j ACCEPT You have new mail in /var/mail/root # grep 443 user*.rules user6.rules:### tuple ### allow tcp 443 ::/0 any ::/0 in user6.rules:-A ufw6-user-input -p tcp --dport 443 -j ACCEPT user.rules:### tuple ### allow tcp 443 0.0.0.0/0 any 0.0.0.0/0 in user.rules:-A ufw-user-input -p tcp --dport 443 -j ACCEPT使用 ufw，你还可以使用以下命令轻松地阻止来自一个 IP 地址的连接：$ sudo ufw deny from 208.176.0.50 Rule addedstatus 命令将显示更改：$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22 ALLOW IN 192.168.0.0/24 9090 ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere Anywhere DENY IN 208.176.0.50 <== new 9090 (v6) ALLOW IN Anywhere (v6) 80/tcp (v6) ALLOW IN Anywhere (v6) 443/tcp (v6) ALLOW IN Anywhere (v6)总而言之，ufw 不仅容易配置，而且且容易理解。via: https://www.networkworld.com/article/3533551/linux-firewall-basics-with-ufw.html作者：Sandra Henry-Stocker 选题：lujun9972 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
FirewallD 是 iptables 的前端控制器，用于实现持久的网络流量规则。它提供命令行和图形界面，在大多数 Linux 发行版的仓库中都有。与直接控制 iptables 相比，使用 FirewallD 有两个主要区别：FirewallD 使用区域和服务而不是链式规则。它动态管理规则集，允许更新规则而不破坏现有会话和连接。FirewallD 是 iptables 的一个封装，可以让你更容易地管理 iptables 规则 - 它并不是 iptables 的替代品。虽然 iptables 命令仍可用于 FirewallD，但建议使用 FirewallD 时仅使用 FirewallD 命令。本指南将向您介绍 FirewallD 的区域和服务的概念，以及一些基本的配置步骤。安装与管理 FirewallDCentOS 7 和 Fedora 20+ 已经包含了 FirewallD，但是默认没有激活。可以像其它的 systemd 单元那样控制它。1、 启动服务，并在系统引导时启动该服务：sudo systemctl start firewalld sudo systemctl enable firewalld 要停止并禁用：sudo systemctl stop firewalld sudo systemctl disable firewalld 2、 检查防火墙状态。输出应该是 running 或者 not running。sudo firewall-cmd --state 3、 要查看 FirewallD 守护进程的状态：sudo systemctl status firewalld 示例输出firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled) Active: active (running) since Wed 2015-09-02 18:03:22 UTC; 1min 12s ago Main PID: 11954 (firewalld) CGroup: /system.slice/firewalld.service └─11954 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid 4、 重新加载 FirewallD 配置：sudo firewall-cmd --reload 配置 FirewallDFirewallD 使用 XML 进行配置。除非是非常特殊的配置，你不必处理它们，而应该使用 firewall-cmd。配置文件位于两个目录中：/usr/lib/FirewallD 下保存默认配置，如默认区域和公用服务。 避免修改它们，因为每次 firewall 软件包更新时都会覆盖这些文件。/etc/firewalld 下保存系统配置文件。 这些文件将覆盖默认配置。配置集FirewallD 使用两个配置集：“运行时”和“持久”。 在系统重新启动或重新启动 FirewallD 时，不会保留运行时的配置更改，而对持久配置集的更改不会应用于正在运行的系统。默认情况下，firewall-cmd 命令适用于运行时配置，但使用 --permanent 标志将保存到持久配置中。要添加和激活持久性规则，你可以使用两种方法之一。1、 将规则同时添加到持久规则集和运行时规则集中。 sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=http 2、 将规则添加到持久规则集中并重新加载 FirewallD。 sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --reload reload 命令会删除所有运行时配置并应用永久配置。因为 firewalld 动态管理规则集，所以它不会破坏现有的连接和会话。防火墙的区域“区域”是针对给定位置或场景（例如家庭、公共、受信任等）可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型，而拒绝其他任何流量。 首次启用 FirewallD 后，public 将是默认区域。区域也可以用于不同的网络接口。例如，要分离内部网络和互联网的接口，你可以在 internal 区域上允许 DHCP，但在external 区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。要找到默认区域： sudo firewall-cmd --get-default-zone 要修改默认区域：sudo firewall-cmd --set-default-zone=internal 要查看你网络接口使用的区域：sudo firewall-cmd --get-active-zones 示例输出：public interfaces: eth0 要得到特定区域的所有配置：sudo firewall-cmd --zone=public --list-all 示例输出：public (default, active) interfaces: ens160 sources: services: dhcpv6-client http ssh ports: 12345/tcp masquerade: no forward-ports: icmp-blocks: rich rules: 要得到所有区域的配置： sudo firewall-cmd --list-all-zones 示例输出：block interfaces: sources: services: ports: masquerade: no forward-ports: icmp-blocks: rich rules: ... work interfaces: sources: services: dhcpv6-client ipp-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: 与服务一起使用FirewallD 可以根据特定网络服务的预定义规则来允许相关流量。你可以创建自己的自定义系统规则，并将它们添加到任何区域。 默认支持的服务的配置文件位于 /usr/lib /firewalld/services，用户创建的服务文件在 /etc/firewalld/services 中。要查看默认的可用服务：sudo firewall-cmd --get-services 比如，要启用或禁用 HTTP 服务： sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --remove-service=http --permanent 允许或者拒绝任意端口/协议比如：允许或者禁用 12345 端口的 TCP 流量。sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent 端口转发下面是在同一台服务器上将 80 端口的流量转发到 12345 端口。sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345 要将端口转发到另外一台服务器上：1、 在需要的区域中激活 masquerade。sudo firewall-cmd --zone=public --add-masquerade 2、 添加转发规则。例子中是将本地的 80 端口的流量转发到 IP 地址为 ：123.456.78.9 的远程服务器上的 8080 端口。sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9 要删除规则，用 --remove 替换 --add。比如：sudo firewall-cmd --zone=public --remove-masquerade 用 FirewallD 构建规则集例如，以下是如何使用 FirewallD 为你的服务器配置基本规则（如果您正在运行 web 服务器）。将 eth0 的默认区域设置为 dmz。 在所提供的默认区域中，dmz（非军事区）是最适合于这个程序的，因为它只允许 SSH 和 ICMP。sudo firewall-cmd --set-default-zone=dmz sudo firewall-cmd --zone=dmz --add-interface=eth0 2、 把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中：sudo firewall-cmd --zone=dmz --add-service=http --permanent sudo firewall-cmd --zone=dmz --add-service=https --permanent 3、 重新加载 FirewallD 让规则立即生效：sudo firewall-cmd --reload 如果你运行 firewall-cmd --zone=dmz --list-all， 会有下面的输出：dmz (default) interfaces: eth0 sources: services: http https ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: 这告诉我们，dmz 区域是我们的默认区域，它被用于 eth0 接口中所有网络的源地址和端口。 允许传入 HTTP（端口 80）、HTTPS（端口 443）和 SSH（端口 22）的流量，并且由于没有 IP 版本控制的限制，这些适用于 IPv4 和 IPv6。 不允许IP 伪装以及端口转发。 我们没有 ICMP 块，所以 ICMP 流量是完全允许的。没有 丰富 （ Rich ） 规则，允许所有出站流量。高级配置服务和端口适用于基本配置，但对于高级情景可能会限制较多。 丰富 （ Rich ） 规则和 直接 （ Direct ） 接口允许你为任何端口、协议、地址和操作向任何区域 添加完全自定义的防火墙规则。丰富规则丰富规则的语法有很多，但都完整地记录在 firewalld.richlanguage(5) 的手册页中（或在终端中 man firewalld.richlanguage）。 使用 --add-rich-rule、--list-rich-rules 、 --remove-rich-rule 和 firewall-cmd 命令来管理它们。这里有一些常见的例子：允许来自主机 192.168.0.14 的所有 IPv4 流量。sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept' 拒绝来自主机 192.168.1.10 到 22 端口的 IPv4 的 TCP 流量。sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' 允许来自主机 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量，并将流量转发到 6532 端口上。 sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532' 将主机 172.31.4.2 上 80 端口的 IPv4 流量转发到 8080 端口（需要在区域上激活 masquerade）。sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2' 列出你目前的丰富规则：sudo firewall-cmd --list-rich-rules iptables 的直接接口对于最高级的使用，或对于 iptables 专家，FirewallD 提供了一个 直接 （ Direct ） 接口，允许你给它传递原始 iptables 命令。 直接接口规则不是持久的，除非使用 --permanent。要查看添加到 FirewallD 的所有自定义链或规则：firewall-cmd --direct --get-all-chains firewall-cmd --direct --get-all-rules 讨论 iptables 的具体语法已经超出了这篇文章的范围。如果你想学习更多，你可以查看我们的 iptables 指南。更多信息你可以查阅以下资源以获取有关此主题的更多信息。虽然我们希望我们提供的是有效的，但是请注意，我们不能保证外部材料的准确性或及时性。FirewallD 官方网站RHEL 7 安全指南：FirewallD 简介Fedora Wiki：FirewallDvia: https://www.linode.com/docs/security/firewalls/introduction-to-firewalld-on-centos作者：Linode 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
UFW，即 简单防火墙 （ uncomplicated firewall ） ，是一个 Arch Linux、Debian 或 Ubuntu 中管理防火墙规则的前端。 UFW 通过命令行使用（尽管它有可用的 GUI），它的目的是使防火墙配置简单（即 不复杂 （ uncomplicated ） ）。开始之前1、 熟悉我们的入门指南，并完成设置服务器主机名和时区的步骤。2、 本指南将尽可能使用 sudo。 在完成保护你的服务器指南的章节，创建一个标准用户帐户，强化 SSH 访问和移除不必要的网络服务。 但不要跟着创建防火墙部分 - 本指南是介绍使用 UFW 的，它对于 iptables 而言是另外一种控制防火墙的方法。3、 更新系统Arch Linuxsudo pacman -Syu Debian / Ubuntusudo apt-get update && sudo apt-get upgrade 安装 UFWUFW 默认包含在 Ubuntu 中，但在 Arch 和 Debian 中需要安装。 Debian 将自动启用 UFW 的 systemd 单元，并使其在重新启动时启动，但 Arch 不会。 这与告诉 UFW 启用防火墙规则不同，因为使用 systemd 或者 upstart 启用 UFW 仅仅是告知 init 系统打开 UFW 守护程序。默认情况下，UFW 的规则集为空，因此即使守护程序正在运行，也不会强制执行任何防火墙规则。 强制执行防火墙规则集的部分在下面。Arch Linux1、 安装 UFW：sudo pacman -S ufw 2、 启动并启用 UFW 的 systemd 单元：sudo systemctl start ufw sudo systemctl enable ufw Debian / Ubuntu1、 安装 UFWsudo apt-get install ufw 使用 UFW 管理防火墙规则设置默认规则大多数系统只需要打开少量的端口接受传入连接，并且关闭所有剩余的端口。 从一个简单的规则基础开始，ufw default命令可以用于设置对传入和传出连接的默认响应动作。 要拒绝所有传入并允许所有传出连接，那么运行：sudo ufw default allow outgoing sudo ufw default deny incoming ufw default 也允许使用 reject 参数。警告：除非明确设置允许规则，否则配置默认 deny 或 reject 规则会锁定你的服务器。确保在应用默认 deny 或 reject 规则之前，已按照下面的部分配置了 SSH 和其他关键服务的允许规则。添加规则可以有两种方式添加规则：用端口号或者服务名表示。要允许 SSH 的 22 端口的传入和传出连接，你可以运行：sudo ufw allow ssh 你也可以运行：sudo ufw allow 22 相似的，要在特定端口（比如 111）上 deny 流量，你需要运行：sudo ufw deny 111 为了更好地调整你的规则，你也可以允许基于 TCP 或者 UDP 的包。下面例子会允许 80 端口的 TCP 包：sudo ufw allow 80/tcp sudo ufw allow http/tcp 这个会允许 1725 端口上的 UDP 包：sudo ufw allow 1725/udp 高级规则除了基于端口的允许或阻止，UFW 还允许您按照 IP 地址、子网和 IP 地址/子网/端口的组合来允许/阻止。允许从一个 IP 地址连接：sudo ufw allow from 123.45.67.89 允许特定子网的连接：sudo ufw allow from 123.45.67.89/24 允许特定 IP/ 端口的组合：sudo ufw allow from 123.45.67.89 to any port 22 proto tcp proto tcp 可以删除或者根据你的需求改成 proto udp，所有例子的 allow 都可以根据需要变成 deny。删除规则要删除一条规则，在规则的前面加上 delete。如果你希望不再允许 HTTP 流量，你可以运行：sudo ufw delete allow 80 删除规则同样可以使用服务名。编辑 UFW 的配置文件虽然可以通过命令行添加简单的规则，但仍有可能需要添加或删除更高级或特定的规则。 在运行通过终端输入的规则之前，UFW 将运行一个文件 before.rules，它允许回环接口、ping 和 DHCP 等服务。要添加或改变这些规则，编辑 /etc/ufw/before.rules 这个文件。 同一目录中的 before6.rules 文件用于 IPv6 。还存在一个 after.rule 和 after6.rule 文件，用于添加在 UFW 运行你通过命令行输入的规则之后需要添加的任何规则。还有一个配置文件位于 /etc/default/ufw。 从此处可以禁用或启用 IPv6，可以设置默认规则，并可以设置 UFW 以管理内置防火墙链。UFW 状态你可以在任何时候使用命令：sudo ufw status 查看 UFW 的状态。这会显示所有规则列表，以及 UFW 是否处于激活状态：Status: active To Action From -- ------ ---- 22 ALLOW Anywhere 80/tcp ALLOW Anywhere 443 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) 启用防火墙随着你选择规则完成，你初始运行 ufw status 可能会输出 Status: inactive。 启用 UFW 并强制执行防火墙规则：sudo ufw enable 相似地，禁用 UFW 规则：sudo ufw disable UFW 会继续运行，并且在下次启动时会再次启动。日志记录你可以用下面的命令启动日志记录：sudo ufw logging on 可以通过运行 sudo ufw logging low|medium|high 设计日志级别，可以选择 low、 medium 或者 high。默认级别是 low。常规日志类似于下面这样，位于 /var/logs/ufw：Sep 16 15:08:14 <hostname> kernel: [UFW BLOCK] IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=123.45.67.89 DST=987.65.43.21 LEN=40 TOS=0x00 PREC=0x00 TTL=249 ID=8475 PROTO=TCP SPT=48247 DPT=22 WINDOW=1024 RES=0x00 SYN URGP=0 前面的值列出了你的服务器的日期、时间、主机名。剩下的重要信息包括：[UFW BLOCK]：这是记录事件的描述开始的位置。在此例中，它表示阻止了连接。IN：如果它包含一个值，那么代表该事件是传入事件OUT：如果它包含一个值，那么代表事件是传出事件MAC：目的地和源 MAC 地址的组合SRC：包源的 IPDST：包目的地的 IPLEN：数据包长度TTL：数据包 TTL，或称为 time to live。 在找到目的地之前，它将在路由器之间跳跃，直到它过期。PROTO：数据包的协议SPT：包的源端口DPT：包的目标端口WINDOW：发送方可以接收的数据包的大小SYN URGP：指示是否需要三次握手。 0 表示不需要。via: https://www.linode.com/docs/security/firewalls/configure-firewall-with-ufw作者：Linode 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
无论你使用的哪种 Linux 发行版，你都需要使用基于 iptables 的防火墙来保护它。啊哈！你已经设置好了你的第一台 Linux 服务器并且已经准备发车了！是么？嗯，慢着。默认情况下，你的 Linux 系统对攻击者来说并非是足够安全的。当然，它比 Windows XP 要安全多了，但这说明不了什么。想要使你的 Linux 系统真正稳固，你需要按照 Linode 的 服务器安全指南 来操作。总的来说，首先你必须关闭那些你不需要的服务。当然要这样做的话，你先要知道你正在使用哪些网络服务。你可以使用 shell 命令来找到是哪些服务：netstat -tulpn netstat 将会告诉你正在运行哪些服务和这些服务正在使用的端口是什么。如果你不需要其中的某项服务或端口，你就应该关闭它。例如，除非你正在运行一个网站，否则你是不需要运行中的 Apache 或 Nginx 服务器，也不需要开启 80 或 8080 端口。总之一句话，不确定的话，就关了它先。在一个最简单的，没有做过任何额外更改的 Linux 服务器上，你会看到 SSH、 RPC 和 NTPdate 运行在它们的公开端口上。不要添加像 telnet 这样陈旧而不安全的 shell 程序，否则老司机就会在你不经意间将你的 Linux 小跑车开走了。也许，在上世纪 80 年代的时候你喜欢把 telnet 当作你 SunOS 机器上的备份登录方式，但是那早已成为了过去。就 SSH 来说，你应该使用 RSA 密钥 和 Fail2Ban 来加固。除非你需要 RPC，否则就卸载它——如果你不知道需要不需要它的话，那就是不需要。关于如何关门已经说的够多了；让我们来聊聊利用 iptables 来锁定进来的流量吧。当你启动 Linux 服务器的时候它是没有任何规则的。这就意味着所有的流量都是被允许的。这当然是不好的。因此，你需要及时的设置你的防火墙。Iptables 是一种用来给 netfilter 设置网络策略规则的 shell 工具，netfilter 是Linux 系统下的默认防火墙，它利用一组规则来允许或禁止流量。当有人尝试连接上你的系统——有些人无时不刻地尝试这么干，而且从不气馁——iptables 就会检查这些请求是否与规则列表相匹配。如果没有匹配到任何的规则，它就会采取默认操作。这个默认操作应该是将连接“Drop”掉，即禁掉这些意图闯入者。而且这不会让他们知道这些网络探测行为发生了什么。（你也可以将链接“Reject”掉，但是这会同时让他们知道你有一个正在运行的 Linux 防火墙。就目前而言，让陌生人能获取到我们系统的信息越少越好。至少，我是这么认为的。）现在，你可以用 iptables 来设置你的防火墙了。我已经这么做了。就像以前，我骑着自行车去六英里外上班，并且两边都是上坡。而现在，我开车去。这其实比喻的是我使用 Fedora 发行版的 FirewallD 和 Debian 系发行版的 UFW（Uncomplicated Firewall）。这些都是易用的 iptables 的 shell 前端。你可以在以下的 Linode 指南中找到适合的使用方式：FirewallD 和 UFW。从本质上来说设置这些规则就是在你的服务器上放置“非请勿入”的告示牌。用起来吧。但是也别太兴奋地把所有的链接都关闭了。例如：sudo ufw default deny incoming 看起来是个好主意哦。别忘了，它禁止了所有链接，包括你自己哦！很好，它就是这么干的。这意味着它也同样禁止了 SSH 的登录。也就是说你再也不能登录你那新服务器了。哇哦！不过，如果你犯了错，错误的将更多的链接都禁止了。你看，老司机也同样被你挡在门外了。或者，更准确得说，这不是你或你的服务器所遇到的个别现象。当然，你也不是每天受到 3 亿多次攻击尝试的美国国家安全局（NSA）。但是攻击脚本根本不在乎你是谁。它只是不断的检查寻找网络中存在已知漏洞的服务器。在平常的一天中我自己的小服务器就会受到数以百计的攻击。都这样了，你还在等什么呢？去吧，加固你的网络服务吧。安装 FirewallD 或者 UFW 来加固你的服务器吧。你会愿意去做的。关于作者：Steven J. Vaughan-Nichols 是一位资深的 IT 专栏作家，他的作品出现在许多行业领袖媒体上，包括 ZDNet.com、PC Magazine、InfoWorld、ComputerWorld、Linux Today 和 eWEEK 等。Steven 在 IT 专业方面的见解犀利，虽然他的观点和云计算方面的认识，并不代表 Linode 观点，但是我们仍然非常感谢他的贡献。你可以在 Twitter 上关注他 （@sjvn）。via: https://medium.com/linode-cube/locking-down-your-linux-server-24d8516ae374#.qy8qq4bx2作者：Steven J. Vaughan-Nichols 译者：wcnnbdk1 校对：wxy本文由 LCTT 组织编译，Linux中国 荣誉推出
自从计算机互连后，各种服务迅速发展。用户使用的电子邮件、社交媒体、在线商城、即时聊天甚至网络会议等服务如雨后春笋般涌现。但从另一方面来说，这些连接服务也具有双刃剑，比如它们当中的病毒、恶意软件、特洛伊木马等会向计算机发送恶意消息。安装 UFW 防火墙作为最大的计算机网络，互联网上可并不都是善意的用户。因此，为了确保我们的计算机或服务器安全，我们需要进行保护。在你的计算机或服务器上一个必须有的组件就是防火墙。在维基百科中，其定义是：防火墙是计算机中一款应用软件或基于硬件的网络安全系统。它根据应用配置的规则，分析数据包，然后决定是否允许此数据包通过，来控制整个系统的网络数据进出访问权限。iptables 是一款广泛使用于服务器的防火墙。它是一款应用程序，它会根据一系列规则来管理服务器上的进出数据流。一般来说，只有可信任的连接才允许进入服务器。但 iptables 是在控制台模式下运行，它非常的复杂。不熟悉 iptables 配置规则和命令的用户可以读读下面的文章，它描述了如何使用iptables防火墙。iptables 基础 (Linux 防火墙) 指南Debian/Ubuntu 系统中安装 UFW 防火墙为了降低 iptables 设置的复杂度，有许多对应的前端应用。如果你运行的是 Ubuntu linux 系统的话， UFW 就是一款默认的防火墙工具。我们开始来探讨 UFW 防火墙吧。什么是 UFWUFW (简单的防火墙) 是广泛使用的 iptables 防火墙 的前端应用，这是非常适合于基于主机的防火墙。UFW 即提供了一套管理网络过滤器的框架，又提供了控制防火墙的命令行界面接口。它给那些不熟悉防火墙概念的 Linux 新用户提供了友好、易使用的用户界面。同时，另一方面，它也提供了命令行界面，为系统管理员准备了一套复杂的命令，用来设置复杂的防火墙规则。UFW 对像 Debian、Ubuntu 和 Linux Mint 这些发布版本来说也是上上之选。UFW 基本用法首先，用如下命令来检查下系统上是否已经安装了 UFW 。$ sudo dpkg --get-selections | grep ufw 如还没有安装，可以使用 apt 命令来安装，如下所示：$ sudo apt-get install ufw 在使用前，你应该检查下 UFW 是否已经在运行。用下面的命令来检查。$ sudo ufw status 如果你发现状态是： inactive , 意思是没有被激活或不起作用。启用/禁用 UFW要启用它，你只需在终端下键入如下命令：$ sudo ufw enable 在系统启动时启用和激活防火墙要禁用，只需输入：$ sudo ufw disable 列出当前UFW规则在防火墙被激活后，你可以向里面添加你自己的规则。如果你想看看默认的规则，可以输入。$ sudo ufw status verbose 输出样例：Status: active Logging: on (low) Default: deny (incoming), allow (outgoing) New profiles: skip $ 添加UFW规则如你所见，默认是不允许所有外部访问连接的。如果你想远程连接你的机器，就得开放相应的端口。例如，你想用 ssh 来连接，下面是添加的命令。允许访问$ sudo ufw allow ssh [sudo] password for pungki : Rule added Rule added (v6) $ 再一次检查状态，会看到如下的一些输出。$ sudo ufw status To Action From -- ----------- ------ 22 ALLOW Anywhere 22 ALLOW Anywhere (v6) 如果你有很多条规则，想快速的在每条规则上加个序号数字的话，请使用 numbered 参数。$ sudo ufw status numbered To Action From ------ ----------- ------ [1] 22 ALLOW Anywhere [2] 22 ALLOW Anywhere (v6) 第一条规则的意思是所有通过22端口访问机器的 tcp 或 udp 数据包都是允许的。如果你希望仅允许 tcp 数据包访问应该怎么办？可以在服务端口后加个 tcp 参数。下面的示例及相应的输出。$ sudo ufw allow ssh/tcp To Action From ------ ----------- ------ 22/tcp ALLOW Anywhere 22/tcp ALLOW Anywhere (v6) 拒绝访问添加拒绝规则也是同样的招数。我们假设你想拒绝 ftp 访问, 你只需输入$ sudo ufw deny ftp To Action From ------ ----------- ------ 21/tcp DENY Anywhere 21/tcp DENY Anywhere (v6) 添加特定端口有时候，我们会自定义一个端口而不是使用标准提供的。让我们试着把机器上 ssh 的 22 端口换成 2290 端口，然后允许从 2290 端口访问，我们像这样添加：$ sudo ufw allow 2290/ssh (译者注：些处演示例子有问题) To Action From -- ----------- ------ 2290 ALLOW Anywhere 2290 ALLOW Anywhere (v6) 你也可以把端口范围添加进规则。如果我们想打开从 2290到2300 的端口以供 tcp 协议使用，命令如下示：$ sudo ufw allow 2290:2300/tcp To Action From ------ ----------- ------ 2290:2300/tcp ALLOW Anywhere 2290:2300/tcp ALLOW Anywhere (v6) 同样你想使用 udp 的话，如下操作。$ sudo ufw allow 2290:2300/udp To Action From ------ ----------- ------ 2290:2300/udp ALLOW Anywhere 2290:2300/udp ALLOW Anywhere (v6) 请注意你得明确的指定是 ‘tcp’ 或 ‘udp’，否则会出现跟下面类似的错误信息。ERROR: Must specify ‘tcp’ or ‘udp’ with multiple ports 添加特定 IP前面我们添加的规则都是基于 服务程序 或 端口 的，UFW 也可以添加基于 IP 地址的规则。下面是命令样例。$ sudo ufw allow from 192.168.0.104 你也可以使用子网掩码来扩宽范围。$ sudo ufw allow form 192.168.0.0/24 To Action From -- ----------- ------ Anywhere ALLOW 192.168.0.104 Anywhere ALLOW 192.168.0.0/24 如你所见， from 参数仅仅限制连接的来源，而目的（用 To 列表示）是所有地方。让我们看看允许访问 22端口(ssh)的例子。$ sudo ufw allow to any port 22 上面的命令会允许从任何地方以及任何协议都可以访问22端口。组合参数对于更具体的规则，你也可以把 IP 地址、协议和端口这些组合在一起用。我们想创建一条规则，限制仅仅来自于 192.168.0.104 的 IP ，而且只能使用 tcp 协议和通过 22端口 来访问本地资源。我们可以用如下所示的命令。$ sudo ufw allow from 192.168.0.104 proto tcp to any port 22 创建拒绝规则的命令和允许的规则类似，仅需要把 allow 参数换成 deny 参数就可以。删除规则某些时候需要删除现有的规则。再一次使用 UFW 删除规则是很简单的。在上面的示例中，已经创建了如下的规则，现在你想删除它们。To Action From -- ----------- ------ 22/tcp ALLOW 192.168.0.104 21/tcp ALLOW Anywhere 21/tcp ALLOW Anywhere (v6) 删除规则有两个方法。方法1下面的命令将会 删除 与 ftp 相关的规则。所以像 21/tcp 这条 ftp 默认访问端口的规则将会被删除掉。$ sudo ufw delete allow ftp 方法2但当你使用如下命令来删除上面例子中的规则时，$ sudo ufw delete allow ssh 或者 $ sudo ufw delete allow 22/tcp 会出现如下所示的一些错误Could not delete non-existent rule Could not delete non-existent rule (v6) 我们还有一招。上面已经提到过，可以序列数字来代替你想删除的规则。让我们试试。$ sudo ufw status numbered To Action From -- ----------- ------ [1] 22/tcp ALLOW 192.168.0.104 [2] 21/tcp ALLOW Anywhere [3] 21/tcp ALLOW Anywhere (v6) 然后我们删除正在使用的第一条规则。按 “ y ” 就会永久的删除这条规则。$ sudo ufw delete 1 Deleting : Allow from 192.168.0.104 to any port 22 proto tcp Proceed with operation (y|n)? y 从这些用法中你就可以发现它们的不同。 方法2 在删除前需要 用户确认 ，而 方法1 不需要。重置所有规则某些情况下，你也许需要 删除/重置 所有的规则。可以输入。$ sudo ufw reset Resetting all rules to installed defaults. Proceed with operation (y|n)? y 如果你输入“ y ”， UFW 在重置你的 ufw 前会备份所有已经存在规则，然后重置。重置操作也会使你的防火墙处于不可用状态，如果你想使用得再一次启用它。高级功能正如我上面所说，UFW防火墙能够做到iptables可以做到的一切。这是通过一些规则文件来完成的，他们只不过是 iptables-restore 所对应的文本文件而已。是否可以通过 ufw 命令微调 UFW 的与/或逻辑来增加 iptables 命令其实就是编辑几个文本文件的事。/etc/default/ufw: 默认策略的主配置文件，支持 IPv6 和 内核模块。/etc/ufw/before[6].rules: 通过 ufw 命令添加进规则之前里面存在的规则会首先计算。/etc/ufw/after[6].rules: 通过 ufw 命令添加进规则之后里面存在的规则会进行计算。/etc/ufw/sysctl.conf: 内核网络可调参数。/etc/ufw/ufw.conf: 设置系统启动时 UFW 是否可用，和设置日志级别。结论UFW 作为 iptables 的前端应用，给用户提供了简单的接口界面。使用着不需要去记非常复杂的 iptables 语法。UFW 也使用了‘ 简单英语 ’作为它的参数。像 Allow、deny、reset 就是他们当中的一部分。我相信有很多很多 iptables 前端应用，但 UFW 绝对是那些想要快速、简单的就建立自己的防火墙，而且还很安全的用户的最佳替代品之一。请输入 man ufw 查看 ufw 用户手册，来了解更多详情。via: http://www.tecmint.com/how-to-install-and-configure-ufw-firewall/译者：runningwater 校对：Caroline本文由 LCTT 原创翻译，Linux中国 荣誉推出