如何在 Ubuntu 12.04 上使用 Iptables 设置防火墙

2023-11-18

Status:已弃用

本文介绍不再受支持的 Ubuntu 版本。如果您当前运行的服务器运行 Ubuntu 12.04,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:

  • 升级到Ubuntu 14.04.
  • 从 Ubuntu 14.04 升级到 Ubuntu 16.04
  • 将服务器数据迁移到支持的版本

Reason: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL)并且不再接收安全补丁或更新。本指南不再维护。

请参阅:
本指南可能仍然可以作为参考,但可能不适用于其他 Ubuntu 版本。如果有的话,我们强烈建议您使用针对您所使用的 Ubuntu 版本编写的指南。您可以使用页面顶部的搜索功能来查找更新的版本。

关于iptables

为了使服务器在初始设置后更加安全,Ubuntu 附带了 iptables,它是发行版的默认防火墙。一开始,虽然配置了 Ubuntu 防火墙,但它被设置为允许虚拟专用服务器上的所有传入和传出流量。为了对服务器提供更强的保护,我们可以添加一些基本的 iptables 规则。

iptables 规则来自一系列选项,这些选项可以组合起来创建每个特定的进程。每个穿过防火墙的数据包都会按顺序由每条规则进行检查。一旦与规则匹配,数据包就会遵循关联的操作,否则它将继续沿线进行。

Note:本教程涵盖 IPv4 安全性。在 Linux 中,IPv6 安全性与 IPv4 分开维护。例如,“iptables”仅维护 IPv4 地址的防火墙规则,但它有一个名为“ip6tables”的 IPv6 对应项,可用于维护 IPv6 网络地址的防火墙规则。

如果您的 VPS 配置为 IPv6,请记住使用适当的工具保护您的 IPv4 和 IPv6 网络接口。有关 IPv6 工具的更多信息,请参阅此指南:如何配置工具以在 Linux VPS 上使用 IPv6

iptables命令

尽管本教程将介绍有限数量的命令,这些命令将为服务器提供一些基本的安全性,但可以为 iptables 开发各种细微差别和特定的情况。以下是为您的 VPS 开发防火墙的一些最有用的命令,但请记住,这只是一个简短的列表,还有各种其他选项。


-A: (Append), adds a rule to iptables
-L:  (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a  rule perfectly. It translates to one of four possibilities:
	-ACCEPT: the packet is accepted, and no further rules are processed
	-REJECT: the packet is rejected, and the 	sender is notified, and no further rules are processed
	-DROP: the packet is rejected, but the 	sender is not notified, and no further rules are processed
	-LOG: the packet is accepted but logged, and the following rules are processed 
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a rule  

创建 iptables 规则:

如果输入以下内容,您可以看到当前的 iptables 规则:


sudo iptables -L  

它们应该看起来像这样:


Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

如果您有另一组规则或想要重新开始,您可以随时通过刷新和删除所有规则来将规则设置回默认值:


sudo iptables -F  

此外,如果您想加快 iptables 的工作速度,可以在命令中包含 -n。此选项禁用 DNS 查找并防止命令尝试查找规则集中每个 IP 的反向。您可以使用它来列出规则,例如:


iptables -L -n  

基本的防火墙

目前的规则允许所有连接,包括传入和传出。没有任何安全措施。当我们构建表时,请记住,一旦数据包被接受、拒绝或删除,就不再处理进一步的规则。因此,先出现的规则优先于后出现的规则。

在创建规则时,我们必须确保防止自己意外阻止 SSH(我们连接到服务器的方法)。

首先,我们确保允许所有当前连接,制定规则时的所有连接都将保持在线:


sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT  

我们可以继续分解:

  1. -A告诉 iptables 将规则附加到表中。
  2. INPUT将此规则指定为输入链的一部分。
  3. 米康跟踪接下来是--cstate 已建立,相关保证此规则的结果仅适用于当前连接,并且允许与它们相关的连接
  4. -j 接受告诉 JUMP 接受数据包,并且连接仍然存在。

在确保与虚拟专用服务器的所有当前连接可以不间断地保持之后,我们可以继续开始阻止其他不安全的连接。

假设我们想要阻止所有传入流量,但来自 2 个公共端口的流量除外:22 用于 SSH,80 用于 Web 流量。我们继续使用以下命令允许指定端口上的所有流量:


sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT  

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT  

在这两个命令中,-p选项代表正在建立连接的协议,在本例中tcp,而--dport指定传输数据包的端口。

在我们保证所需流量将通过防火墙后,我们可以通过阻止所有剩余流量访问我们的虚拟服务器来完成。因为这是列表中的最后一条规则,所以与 iptables 中任何先前规则匹配的所有流量都不会受到影响,并且将按照我们之前设置的方式进行处理。

让我们制定一条规则来阻止所有剩余的流量:


sudo iptables -P INPUT DROP  

这样,我们就可以看到更新后的规则是什么样子的:


sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 
  

我们快完成了。然而,我们还缺少一项规则。我们需要为我们的 VPS 提供环回访问。如果我们现在添加规则而没有进一步的限定符,它将到达列表的末尾,并且由于它将遵循阻止所有流量的规则,因此永远不会生效。

为了解决这个问题,我们需要使用 INPUT 选项在列表中首先制定此规则:


sudo iptables -I INPUT 1 -i lo -j ACCEPT  
  1. -I 输入 1将此规则放在表格的开头
  2. lo指环回接口
  3. -j 接受然后保证环回流量将被接受

现在我们已经完成了基本防火墙的创建。您的规则应如下所示(我们可以通过输入 -v 查看 iptable 的详细信息):


sudo iptables -L -v  

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
 1289 93442 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    2   212 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http     

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
 pkts bytes target     prot opt in     out     source               destination         

但是,一旦虚拟服务器重新启动,iptables 规则就会被擦除。下一步将讨论保存和恢复 iptables 规则。

保存 iptables 规则

尽管iptables规则有效,但如果服务器重新启动,它们将自动删除。为了确保它们保持有效,我们可以使用一个名为 IP-Tables permanent 的包。

我们可以使用 apt-get 安装它:


sudo apt-get install iptables-persistent  

在安装过程中,系统会询问您是否要将 iptables 规则同时保存到 IPv4 规则和 IPv6 规则。对两者都说“是”。

然后,您的规则将保存在 /etc/iptables/rules.v4 和 /etc/iptables/rules.v6 中。

安装完成后,启动 iptables-persistent 运行:


sudo service iptables-persistent start  

任何服务器重新启动后,您都会看到规则仍然存在。

埃特尔·斯维尔德洛夫
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ubuntu 12.04 上使用 Iptables 设置防火墙 的相关文章

  • Cloud Firestore 安全规则使用的语言名称是什么?

    我想知道用于 Cloud Firestore 安全规则的语法名称 如下所述https firebase google com docs firestore security get started authuser 0 https fire
  • 用于保护网站安全(使用 SSL)时,数字证书如何工作?

    请帮助我了解整个过程是如何进行的 据我了解 Web 浏览器包含 verisign Entrust Comodo 等证书颁发机构 CA 的根证书 但是当用户访问安全页面时到底会发生什么 Web 浏览器是否向 CA 服务器发送请求来验证证书 还
  • 无法使用前导 ../ 在顶级目录之上退出

    我有一个 asp net 网站 我们有管理区域 其中的登录页面仅供管理员使用 并且所有网站都允许所有人使用 当我收到此错误时 我需要询问如何为其定义正确的安全配置 Cannot use a leading to exit above the
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • 各个平台对 SHA-2 的支持情况如何?

    我读到 SHA 1 即将从 FIPS 180 2 标准中退役 http gcn com articles 2010 03 03 rsa sha competition aspxhttp gcn com articles 2010 03 03
  • ActiveMQ发送ObjectMessage

    我正在使用 ActiveMQ 在我当前的项目中实现消息系统 我需要发送和接收 Java 对象 而不是简单的文本或二进制消息 Java 对象 我的消息对象 根据需要实现了 Serialized 接口 ActiveMQ 的最新版本添加了一些安全
  • JavaScript 中的安全数据

    我必须为 Web 测试创建生成器 使用 HTML 和 JavaScript 测试必须离线和在线进行 正确答案和分数评估必须是生成的测试的一部分 最终用户的分数仅发送到服务器 无法在服务器上进行评估 并且服务器对问题一无所知 它只保存最终分数
  • 伪分布式模式下的 Hadoop。连接被拒绝

    P S 请不要将此标记为重复 Hi 我一直在尝试以伪分布式模式设置和运行 Hadoop 当我运行 start all sh 脚本时 我得到以下输出 starting namenode logging to home raveesh Hado
  • 为什么将 MySQL 凭据放在 www 目录之外? [复制]

    这个问题在这里已经有答案了 可能的重复 将核心类放在 Web 根目录之上 好还是坏主意 https stackoverflow com questions 3648739 putting core classes above the web
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 如何通过 PDO 使用密码哈希来使我的代码更安全? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的代码实际上可以工作 但它一点也不安全 我不想使用 MD5 因为它不是那么安全 我一直在查找密码哈希 但我不确定如何将其合并到我的代
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • 受信任的 1.5 小程序可以执行系统命令吗?

    如果是的话 这个能力有什么限制吗 具体来说 我需要以 Mac OSX 为目标 我以前用过这个在 Windows 系统上启动东西 但从未在 Mac 上尝试过 public void launchScript String args Strin
  • python:API 令牌生成及其危险

    我正在按照 Flask Web Development 一书来实现基于令牌的身份验证 基本上 用户使用 HTTP 基本身份验证对其进行身份验证 并为其生成令牌 s Serializer app config SECRET KEY expir
  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 访问被拒绝(“java.io.FilePermission”“执行”)

    我是初学者 这是我写的第一个小程序 我想用小程序运行 exe 应用程序 java代码 package appletexample import java io import java awt import java applet Apple
  • 如何在ubuntu的conda环境中更改Rstudio中的R版本

    我在基本系统中安装了 R 4 3 和 Rstudio 在 conda 环境中安装了旧版本的 R 4 2 3 命令which R返回环境中安装的 R 的目录 home 用户 miniconda3 envs anndata2ri pip bin
  • Rails 安全:完全避免大规模分配

    我倾向于不需要批量分配 http guides rubyonrails org security html mass assignment我的生产代码中的功能 在我的测试代码中 我经常使用它 但在这些情况下我do想要设置任意列 因此 如果在

随机推荐

  • 如何在 Ubuntu 18.04 上安装 VirtualBox 来宾添加

    虚拟盒子是一款开源 跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 VirtualBox 提供了一组可以安装在来宾操作系统中的驱动程序和应用程序 VirtualBox Guest Additions 来宾添加为来宾计算机提供了多种
  • Linux 类型命令

    The type命令用于显示有关命令类型的信息 它将向您展示在命令行上键入给定命令时将如何解释 在这篇文章中 我们将解释如何使用Linuxtype命令 如何使用 type 命令 type是 Bash 和其他 shell 如 Zsh 和 Ks
  • 如何在 CentOS 7 上使用 Apache 安装和保护 phpMyAdmin

    phpMyAdmin 是一个基于 PHP 的开源工具 用于通过基于 Web 的界面管理 MySQL 和 MariaDB 服务器 phpMyAdmin 允许您与 MySQL 数据库交互 管理用户帐户和权限 执行 SQL 语句 以各种数据格式导
  • 如何在 Ubuntu 20.04 上设置 Nginx 服务器块

    服务器块是一种 Nginx 指令 它定义特定域的设置 允许您在一台服务器上运行多个网站 对于每个网站 您可以设置网站文档根目录 包含网站文件的目录 创建单独的安全策略 使用不同的 SSL 证书等等 本文介绍如何在 Ubuntu 20 04
  • 如何在 CentOS 7 上添加和删除用户

    CentOS 以及所有其他 Linux 发行版都是一个多用户操作系统 每个用户可以对各种命令行和 GUI 应用程序拥有不同的权限级别和特定设置 了解如何添加和删除用户是每个 Linux 用户应该了解的基本技能之一 在本教程中 我们将解释如何
  • 如何在树莓派上安装和使用 Docker

    Docker 是一个容器化平台 允许您快速构建 测试和部署应用程序作为可移植 自给自足的容器 几乎可以在任何地方运行 在本教程中 我们将解释如何在 Raspberry Pi 上安装 Docker 并探索基本的 Docker 概念和命令 先决
  • 如何在 Ubuntu 18.04 上使用 Apache 安装和配置 Nextcloud

    下一云是一个开源 自托管的文件共享和协作平台 类似于 Dropbox 它捆绑了媒体播放器 日历和联系人管理 Nextcloud 可通过应用程序进行扩展 并拥有适用于所有主要平台的桌面和移动客户端 在本教程中 我们将向您展示如何在 Ubunt
  • 了解 /etc/passwd 文件

    Linux 系统上可以使用多种不同的身份验证方案 最常用和标准的方案是针对 etc passwd and etc 影子 files etc passwd是一个基于纯文本的数据库 包含系统上所有用户帐户的信息 这是owned第 644 章权限
  • 如何在 Debian 9 上使用 UFW 设置防火墙

    Debian 包含多个软件包 这些软件包提供了用于管理防火墙的工具 其中 iptables 作为基本系统的一部分安装 对于初学者来说 学习如何使用 iptables 工具正确配置和管理防火墙可能很复杂 但 UFW 简化了它 UFW Unco
  • 如何在 Ubuntu 14.04 服务器上安装 ISPConfig3

    介绍 尽管命令行是一个功能强大的工具 可以让您在许多情况下快速轻松地工作 但在某些情况下 可视化界面会很有帮助 如果您要在一台计算机上配置许多不同的服务 或者为客户端管理系统的某些部分 则可以使用诸如ISP配置可以使这个任务变得更加简单 I
  • 如何在 CentOS 7 上安装 Git

    介绍 版本控制已成为现代软件开发中不可或缺的工具 版本控制系统允许您在源代码级别跟踪您的软件 您可以跟踪更改 恢复到之前的阶段以及从基本代码分支以创建文件和目录的替代版本 最流行的版本控制系统之一是git 许多项目在 Git 存储库中维护其
  • 什么是 Kubernetes?

    介绍 Kubernetes 是一个功能强大的开源系统 最初由 Google 开发 并得到云原生计算基金会 CNCF 的支持 用于在集群环境中管理容器化应用程序 它旨在提供更好的方法来管理跨不同基础设施的相关分布式组件和服务 要了解有关 Ku
  • 使用 Debian 9 进行初始服务器设置

    介绍 当您首次创建新的 Debian 9 服务器时 您应该尽早执行一些配置步骤作为基本设置的一部分 这将提高服务器的安全性和可用性 并为您后续的操作奠定坚实的基础 第一步 以 root 身份登录 要登录您的服务器 您需要知道您的服务器的公共
  • 如何使用 DigitalOcean 云服务器创建虚荣或品牌名称服务器

    介绍 托管提供商或经销商特别感兴趣 拥有品牌或 虚荣域名服务器为客户提供了更专业的外观 它 无需要求您的客户将其域名指向另一个域名 公司的域名服务器 本教程将概述两种创建方法 自定义域名服务器 i 虚荣和 ii 品牌 Types 虚荣名称服
  • 如何在 Ubuntu 18.04 上安装 MySQL

    本教程的先前版本由以下人员编写榛子维尔多 介绍 MySQL是一个开源数据库管理系统 通常作为流行的一部分安装LAMP Linux Apache MySQL PHP Python Perl 堆栈 它使用关系数据库和 SQL 结构化查询语言 来
  • 如何使用 passwd 和 adduser 在 Linux VPS 上管理密码

    介绍 密码和身份验证是每个用户在 Linux 环境中工作时必须处理的概念 这些主题涵盖许多不同的配置文件和工具 在本指南中 我们将探索一些基本文件 例如 etc passwd 和 etc shadow 以及用于配置身份验证的工具 例如名称恰
  • 如何在 VPS 上安装和使用 Logwatch 日志分析器和报告器

    介绍 应用程序创建所谓的 日志文件 来跟踪在任何给定时间发生的活动 这些文件远非简单的文本输出 浏览起来可能非常复杂 特别是当所管理的服务器很繁忙时 当需要参考日志文件时 例如 在发生故障 数据丢失等情况下 利用所有可用的帮助变得至关重要
  • 如何修改 DOM 中的属性、类和样式

    介绍 在本教程之前的教程中series 如何更改 DOM 我们介绍了如何使用内置方法从文档对象模型 DOM 中创建 插入 替换和删除元素 通过提高操作 DOM 的熟练程度 您可以更好地利用 JavaScript 的交互功能并修改 Web 元
  • 如何在 Ubuntu 22.04 上的 PostgreSQL 中静态加密数据库

    介绍 PostgreSQL是一个数据库管理系统 自 1996 年以来一直存在 就像其他数据库系统一样 SQL MySQL Oracle等 PostgreSQL的主要目的是为用户提供一种创建数据库用于存储和数据检索的方式 其突出的功能之一包括
  • 如何在 Ubuntu 12.04 上使用 Iptables 设置防火墙

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级