介绍
在本教程中,我们将教你如何使用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数据库服务器
- 如何设置和使用DigitalOcean专用网络
- 如何在现有的Droplets上启用DigitalOcean私有网络
- Iptables防火墙如何工作
- 如何在Ubuntu 14.04上使用Iptables设置防火墙
我们的目标
当我们完成本教程时,我们应该有一个看起来像下图的环境: 专用网络区域中的所有服务器只能与此专用网络中的其他服务器(橙色框)通信。负载均衡器可以通过Internet访问,也可以链接到专用网络。此策略的实施将通过每个服务器上的iptables实现。 注意 :要阻止流量到您的公共接口,您可以禁用公共接口,或者设置防火墙规则来实现使用iptables类似的效果。 我们将使用防火墙选项,因为我们可以配置它阻止不必要的网络流量,同时允许我们的服务器在启动连接时访问互联网(这对于在服务器上下载更新是有用的)。访问您的VPS的方式
在我们进入如何锁定您自己的私有网络之前,我们将讨论访问您的服务器(特别是命令行)的不同方法。知道连接到服务器的所有方法尤其重要,因为如果你不小心,你可以锁定自己的服务器。 如果您的DigitalOcean VPS上有专用网络设置,您有三种方法访问它:- 公共接口
- 私人接口
- 控制面板控制台访问
识别接口/端口访问要求
在继续之前,确定您的接口和端口访问要求很重要。许多应用程序使用默认端口,或者可以配置为绑定到特定的接口和端口。在确定您的策略需求之前,不要更改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
Iptables配置概述
这里是如何配置iptables以满足我们的需求的概述:- 默认情况下删除
- 允许从专用网络接口, 隧道1 VPS SSH
- 允许从您的服务器发起的Internet流量
- 显式允许特定的专用网络流量(通过IP地址和/或端口)
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