如何隔离服务器内的专用网络使用iptables

介绍

在本教程中,我们将教你如何使用iptables的 共享专用网络,模拟网络流量隔离,一个真正的专用网络可以提供。我们还将介绍为什么要这样做,并提供一个示例,说明如何在您自己的环境中实施此操作。示例应该很好地解释这个概念,您应该能够根据自己的需要调整配置。 DigitalOcean的私有网络选项为VPS提供了第二个网络接口,只有同一数据中心中的其他VPS才能访问该VPS,其中包括同一数据中心中其他客户的VPS。这被称为 共享专用网络。这意味着通过VPS的专用接口发送的数据根本不离开数据中心,并且不会产生可计费的带宽使用。 注:本教程介绍IPv4的安全性。 在Linux中,IPv6安全性与IPv4分开维护。 例如, iptables只维护防火墙规则为IPv4地址,但它有一个IPv6对应称为 ip6tables ,它可以用来保持对IPv6网络地址的防火墙规则。 如果您的VPS配置为IPv6,请记住使用适当的工具保护IPv4和IPv6网络接口。有关IPv6工具的更多信息,请参阅本指南: 如何配置工具使用IPv6在Linux VPS

示例场景

在我们的例子中,我们将使用由下面的教程创建的环境: 如何优化WordPress的性能有了MySQL复制在Ubuntu 14.04。 这里是一个环境看起来像什么的图: 共享专用网络 示例环境使用五个VPS(并且未配置iptables):
  • HAProxy的-WWW:反向代理负载均衡
  • WordPress的-1:第一个应用服务器
  • WordPress的-2:第二个应用服务器
  • 的mysql-1:主MySQL数据库服务器
  • 的mysql-2:从MySQL数据库服务器
如果你的设置不像这样,你应该仍然能够跟随。此外,如果你想阅读关于设置一个私有网络或iptables基础的VPS,这里有一些链接,你可能会发现是有用的(本教程假设你知道iptables的基础知识): 如果你已经熟悉的概念,并希望看到iptables的设置,随意跳到 iptables配置的概述部分。

我们的目标

当我们完成本教程时,我们应该有一个看起来像下图的环境: 专用网络 专用网络区域中的所有服务器只能与此专用网络中的其他服务器(橙色框)通信。负载均衡器可以通过Internet访问,也可以链接到专用网络。此策略的实施将通过每个服务器上的iptables实现。 注意 :要阻止流量到您的公共接口,您可以禁用公共接口,或者设置防火墙规则来实现使用iptables类似的效果。 我们将使用防火墙选项,因为我们可以配置它阻止不必要的网络流量,同时允许我们的服务器在启动连接时访问互联网(这对于在服务器上下载更新是有用的)。

访问您的VPS的方式

在我们进入如何锁定您自己的私有网络之前,我们将讨论访问您的服务器(特别是命令行)的不同方法。知道连接到服务器的所有方法尤其重要,因为如果你不小心,你可以锁定自己的服务器。 如果您的DigitalOcean VPS上有专用网络设置,您有三种方法访问它:
  • 公共接口
  • 私人接口
  • 控制面板控制台访问
公共接口 公共接口可通过全球互联网访问。这意味着您或互联网上的任何人都可以访问此界面,除非它被锁定。 在需要通过Internet访问的服务器上需要公共接口,因此您的客户或用户可以连接到您提供的任何服务(例如网页或应用程序)。如果需要用户可访问,则公共接口的IP地址通常通过DNS映射到域名(例如,example.com)。 每个VPS有一个公共接口默认启用。在本教程中,我们将使用iptables来限制公共接口仅接受我们的应用程序正常工作(即HTTP)所必需的网络流量。 私人接口 专用接口只能由同一专用网络上的其他VPS访问。在DigitalOcean的情况下,这意味着只有同一数据中心中的其他VPS可以访问私有接口。与互联网相比,这使得它是一个相对安全的地方为您的VPS提供流量,但它会更安全,如果它只能访问您自己的VPS。 如果连接到同一数据中心中的一个VPS,则可以连接到另一个VPS的私有接口的SSH。例如,你可以SSH到haproxy-www的公共接口,然后从那里SSH到mysql-1的私有接口。如果您使用iptables从某些服务器的公共接口删除SSH连接,这将非常有用。 在本教程中,我们将私有接口上的网络流量限制为仅限于我们定义的“专用网络”(上图中的橙色框)中的VPS和一些其他必要的网络流量(在负载均衡器和应用程序服务器之间) 。 控制面板控制台访问 如果您无法访问公共和专用接口,您可以通过控制台访问连接到您的VPS。在现实世界中,这类似于将键盘,鼠标和显示器直接连接到服务器。记住,如果您不小心禁用了两个接口或SSH服务,您可以随时访问您的VPS。 注意 :如果您的VPS登录都使用SSH密钥认证,则需要通过控制面板重新设置root的密码通过控制台登录。

识别接口/端口访问要求

在继续之前,确定您的接口和端口访问要求很重要。许多应用程序使用默认端口,或者可以配置为绑定到特定的接口和端口。在确定您的策略需求之前,不要更改iptables配置,因为配置错误的防火墙可能会破坏您的应用程序。 下面是我们的示例场景的网络访问需求的细分:
  • HAProxy的-WWW:
    • 互联网(公共)/端口80
    • WordPress服务器(私人)/端口80
  • WordPress的-1(所有私营)
    • haproxy_www / port 80
    • wordpress-2 /各种glusterFS端口
    • MySQL服务器/端口3306
  • WordPress的-2:(所有私营)
    • haproxy_www / port 80
    • wordpress-1 /各种glusterFS端口
    • MySQL服务器/端口3306
  • 的mysql-1(所有私营)
    • WordPress服务器/端口3306
    • mysql-2 / port 3306
  • 的mysql-2:从MySQL数据库服务器
    • WordPress服务器/端口3306
    • mysql-1 / port 3306
您还将要允许SSH至少一个公共接口,以及专用网络区域上所有服务器之间的SSH。在这个例子中,我们将允许公共SSH到另一个VPS称为 隧道1,只有私人SSH的其他服务器上-这意味着我们将需要SSH隧道穿越隧道-1 SSH任何其他服务器。技术上,您可以使用任何(或所有)您的VPS为此目的。 现在我们知道我们需要防火墙接受哪些内容,并且可能会丢弃,让我们进行配置。

Iptables配置概述

这里是如何配置iptables以满足我们的需求的概述:
  • 默认情况下删除
  • 允许从专用网络接口, 隧道1 VPS SSH
  • 允许从您的服务器发起的Internet流量
  • 显式允许特定的专用网络流量(通过IP地址和/或端口)
让我们先从 HAProxy的www的 ,我们唯一的面向公众的服务器。 请注意,在 iptables命令, 为eth0指VPS的公共接口,和 eth1是指一个VPS的专用接口-如果你的接口名称不同,请在适当的时候替换。

配置公共服务器(haproxy-www)

SSH 隧道-1:
ssh user@tunnel_1_public_IP
从这里,SSH到 HAProxy的-WWW专用接口:
ssh user@haproxy_www_private_IP
HAProxy的www的 ,集所有连锁默认为接受并删除任何现有的规则:
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
允许 隧道1到SSH通过其专用接口HAProxy的-WWW:
sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d tunnel_1_private_IP --sport 22 -o eth1 -m state --state ESTABLISHED -j ACCEPT
允许您的服务器上的环回流量。这允许您的服务器使用127.0.0.1或localhost:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
允许从您的服务器启动的公共和专用流量。这将允许您的服务器访问Internet以执行下载更新或软件等操作:
sudo iptables -I OUTPUT -o eth0 -d 0.0.0.0/0 -j ACCEPT
sudo iptables -I INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
允许公共接口上的所有HTTP流量(端口80)。这是必要的,这样用户可以通过访问我们的网站 http://www.example.com/
sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
允许两个WordPress服务器通过其专用IP地址访问端口80:
sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d wordpress_1_private_IP --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d wordpress_2_private_IP --dport 80 -j ACCEPT
现在,我们已经允许所有必要的网络流量,我们可以通过设置丢弃所有其他流量 DROP为每个iptables的链中的默认行为:
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
现在您已经完成了配置haproxy-www的防火墙,您将需要确保一切正常工作。如果你很高兴与您的配置,您可以通过安装 iptables持久包下面的命令容易保存:
sudo apt-get update
sudo apt-get install iptables-persistent
在安装iptables-persistent期间,它会询问您是否要保存当前的防火墙设置。回答是。 现在 HAProxy的www的防火墙允许以下:
  • SSH从隧道1通过专用网络
  • 环回流量
  • haproxy-www发起的互联网活动
  • HTTP在公共互联网上
  • 它本身和WordPress应用程序服务器之间的HTTP
  • 没有来自其他来源的传入流量
让我们继续保护我们的剩余服务器。

配置专用网络服务器

注意 :做所有这些步骤对所有剩余的服务器 :WordPress的-1,WordPress 的-2 的mysql-1,mysql-2。 我们将把这些服务器,通常,如在本节 私人-VPS。 由于大量网络接口和端口需要在专用网络内进行通信,我们将通过将必要的IP地址列入白名单来简化操作,而不是仅允许特定的IP地址和端口组合。此外,我们将默认允许传出流量,并只限制传入流量。 SSH 隧道-1:
ssh user@tunnel_1_public_IP
从这里,SSH 私人-VPS专用接口:
ssh user@private_VPS_private_IP
私人-VPS,集所有连锁默认为接受并删除任何现有的规则:
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
通过其专用接口,以私人VPS允许 隧道1到SSH:
sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPT
允许您的服务器上的环回流量。这允许您的服务器使用127.0.0.1或localhost:
sudo iptables -A INPUT -i lo -j ACCEPT
允许从您的服务器启动的公共和专用流量。这将允许您的服务器访问Internet以执行下载更新或软件等操作:
sudo iptables -I INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
将所有只需要访问专用网络区域的服务器列入白名单(您可以忽略正在处理的服务器的条目):
sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP -j ACCEPT
sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP -j ACCEPT
sudo iptables -A INPUT -p tcp -s mysql_1_private_IP -j ACCEPT
sudo iptables -A INPUT -p tcp -s mysql_2_private_IP -j ACCEPT
只有 这两个WordPress的服务器上,让 HAProxy的-WWW HTTP访问(端口80),因此它可以检索页面:
sudo iptables -A INPUT -p tcp -s haproxy_www_private_IP --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d haproxy_www_private_IP --dport 80 -j ACCEPT
默认情况下删除INPUT和FORWARD链。注意,我们离开OUTPUT的默认值为ACCEPT,因为我们信任我们的私有网络上的服务器:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
现在您已完成配置私有VPS的防火墙,您将需要确保一切正常工作。如果你很高兴与您的配置,您可以通过安装 iptables持久包下面的命令容易保存:
sudo apt-get update
sudo apt-get install iptables-persistent
在安装iptables-persistent期间,它会询问您是否要保存当前的防火墙设置。回答是。 现在 私营VPS防火墙允许以下:
  • SSH从隧道1通过专用网络
  • 环回流量
  • 私有VPS启动的Internet活动
  • 所有传出网络流量
  • 在列入白名单的服务器(即专用网络区域中的所有服务器)之间的所有传入网络流量
  • 没有来自其他来源的传入流量

疑难解答:Iptables列表和日志

如果配置防火墙并发现应用程序停止工作,则解决问题的最佳方法是查看策略列表和日志。

显示Iptables配置

要查看iptables配置或策略列表,请运行以下命令:
sudo iptables -vL --line-numbers
这将显示您设置的所有链和规则,带有行号。此外,它显示丢弃的数据包的数量。如果您期望没有丢弃数据包,请检查日志。

读取Iptables日志

创建一个名为LOG的新链:
iptables -N LOG
路径输入/输出/转发到日志链(代替 CHAIN你想要监控的链条,比如“INPUT”):
iptables -A INPUT -j LOG
现在使用此命令记录数据包:
iptables -A LOG -m limit --limit 60/min -j LOG --log-prefix "Iptables DROP: " --log-level 7
现在,您可以监视系统消息,以查看哪些数据包被丢弃。 在Ubuntu中,可以使用以下命令实时读取消息:
sudo tail -f /var/log/syslog
在CentOS中,可以使用以下命令实时读取消息:
sudo tail -f /var/log/messages
日志将列出接口,源端口,目标端口和关于每个丢弃的数据包的一些其他信息。这应该可以帮助你找出你可能有的任何问题。

结论

遵循本教程后,您应该有一个良好的基础,使用iptables来保护您的VPS免受公共互联网和同一共享私有网络(即同一个数据中心)内的其他VPS。请记住,在添加新服务器或更改服务器设置时,您需要更新防火墙。
作者:Mitchell Anicas
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏