在将具有专用 IP 的网站从一台服务器移动到另一台服务器时,为了最大限度地减少由于 DNS 传播延迟而导致的停机时间,可以使用 IP 转发的方法,以便将原始 IP 的所有流量转发到新 IP。
执行此操作时有什么重要事项需要了解吗?以下是我计划使用的步骤。从安全角度或其他角度看,我是否遗漏了什么?
echo "1" > /proc/sys/net/ipv4/ip_forward
(或永久设置)iptables -t nat -A PREROUTING -d original.ip.goes.here -p tcp --dport 80 -j DNAT --to-destination new.ip.goes.here
iptables -t nat -A POSTROUTING -p tcp -d new.ip.goes.here --dport 80 -j MASQUERADE
- 重复 #2 和 #3,但针对端口,
443
而不是80
站点是否具有 SSL
我理解,无需诉诸这种方法,通过在更改之前充分降低 DNS 记录的 TTL 即可减少停机时间,但这对于最大限度地减少停机时间仍然不太好,因为据称某些 DNS 服务器(也许还有客户端)会将记录缓存比 TTL 所规定的时间更长(如果 TTL 很短)。
编辑:
让我怀疑我是否遗漏了某些东西的部分原因是为什么ip_forward
不总是设置为1
而是默认为- 比如如果在某些情况下0
将其设置为是否存在一些安全风险或不良行为。1
答案1
如果它们是同一台机器,那么 IP 转发本身并不存在任何固有的不安全性,除非您的防火墙配置如何。相反,它可以通过隐藏真实服务器 IP 来提供某种安全性。
通过启用,ip_forwarding
可以将 Linux 机器变成路由器(可以在网络之间转发数据包)这并不总是需要或期望的,这就是为什么它默认被禁用。
RedHat 的以下文章很好地解释了这一切。
不太清楚您要在哪里添加规则,因为您需要在可以拦截数据包并将其路由到所需目的地的边缘防火墙/路由器/网关处添加规则。否则它将无法工作。只要在边缘应用这些规则,就不会涉及额外的安全问题,因为您的内部网络仍然像以前一样安全。但这取决于您的网络结构。
我还猜测,这只是一个临时措施,以后这些规则就会被取消。也许你应该事先做所有可能的测试,确保它能按照你想要的方式运行。
答案2
让我怀疑我是否遗漏了某些问题的原因是为什么 ip_forward 不总是设置为 1 而是默认为 0 - 比如如果在某些情况下将其设置为 1 是否存在一些安全风险或不良行为。
如果您的系统(与许多其他系统一样)不需要成为路由器,则没有理由启用路由。
关于端口 80。由于您已经有一个在 example.com 上监听的 Web 服务器,因此配置新 Web 服务器的反向代理相当容易。Server Fault 上有很多关于如何执行此操作的示例,但简要介绍一下
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://example.com/
ProxyPassReverse / http://example.com/
ServerName example.com
</VirtualHost>
您可以对端口 443 上的 https 执行完全相同的操作
<VirtualHost *:443>
ProxyPreserveHost On
ProxyPass / https://example.com/
ProxyPassReverse / https://example.com/
ServerName example.com
</VirtualHost>
您唯一需要做的就是配置一个本地 DNS 解析器,其中包含 example.com 条目,以便优先于全局 DNS 选取它。dnsmasq 之类的工具应该可以轻松完成此操作。
在您的特定情况下,您可以提前为 example.com 准备新的 vhost,安装 dnsmasq 并将 example.com 添加到本地 hosts 文件中。然后,当您准备就绪时,启用 dnsmasq 服务并重新启动 apache,然后就可以开始了。
答案3
ip_转发: 在使用公共 IP 地址的情况下,ip_forwarding 可能会很危险。新安装的 Linux 机器可能会被用作不应该以这种方式路由的网络的路由器。
iptables: iptables 设置的主要问题可能是新机器上的路由。该机器必须使用旧机器作为路由器来发送损坏的数据包,这样您最终会面临路由挑战。使用 varnish 等代理转发 http 流量可能更安全/更容易。如果您使用 apache 或 nginx 进行托管,您甚至可以将它们设置为新 Web 服务器的代理服务器。
答案4
我曾多次搬迁数据中心,整个 C 类块也随之改变。在 iptables 和 snat 中使用 conntrack 是明智之举。
这是我使用过几次的方便的小脚本。简单而且效果很好。根据需要添加其他端口。一旦 DNS 刷新并且没有更多连接,请删除 iptables 规则。
#!/bin/sh
IPTABLES="/sbin/iptables"
# modify to suit
EXTERNAL="eth0"
OLDSERVER="10.10.10.1"
NEWSERVER="10.10.20.2"
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTERNAL -o $EXTERNAL -p tcp --dport 80 -d $OLDSERVER -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t nat -A PREROUTING -i $EXTERNAL -p tcp --dport 80 -d $OLDSERVER -j DNAT --to-destination $NEWSERVER
$IPTABLES -t nat -A POSTROUTING -p tcp --dport 80 -d $NEWSERVER -j SNAT --to $OLDSERVER
echo 1 > /proc/sys/net/ipv4/ip_forward
此转发应在防火墙内部实现,而不应留给公众访问。
至于为什么默认情况下不启用转发,其他回复可能说得更清楚:如果设备不路由数据包,则不应启用转发。这是否存在安全风险?这完全取决于服务器的角色和配置。
希望这可以帮助。