在Linux上进行IP转发 – 确保做什么或知道什么重要?

在使用专用IP从一台服务器移动到另一台服务器的网站中,为了最大限度地减less由于DNS传播延迟而导致的停机时间,使用IP转发的方法使所有到原始IP的stream量都被转发到新的IP。

有什么重要的知道这样做吗? 以下是我打算使用的步骤。 有没有从安全的angular度来看,或者我错过了?

  1. echo "1" > /proc/sys/net/ipv4/ip_forward (或永久设置)
  2. iptables -t nat -A PREROUTING -d original.ip.goes.here -p tcp --dport 80 -j DNAT --to-destination new.ip.goes.here
  3. iptables -t nat -A POSTROUTING -p tcp -d new.ip.goes.here --dport 80 -j MASQUERADE
  4. 重复#2和#3,但对于端口443而不是80如果该站点具有SSL

我知道停机时间可以减less,而不是通过降低DNSlogging的TTL,在更改之前足够远,但是这仍然不是很好,因为这样做可以减less停机时间,因为据推测某些DNS服务器(也可能是客户端)会cachinglogging的时间比TTL长,说明是否短。

编辑:

部分原因是我想知道是否有什么我缺less的是为什么ip_forward不是总是设置为1 ,而是默认为0 – 就像是有一些安全风险或不希望的行为,如果在某些情况下设置为1

IP转发本身并不存在固有的不安全性,除非你的防火墙是相同的机器。 相反,它可以通过隐藏真实的服务器IP来提供某种安全性。

通过启用ip_forwarding可以将一个linux盒子变成一个路由器 (可以在networking之间进行数据包转发),这并不总是需要或者预期的,这就是为什么默认禁用它的原因。

RedHat的下面的文章解释了这一切。

7.4。 FORWARD和NAT规则

目前还不清楚在哪里添加规则,因为您需要在防火墙/路由器/网关的边缘添加该规则,以便拦截并将数据包路由到所需的目的地。 否则,它不会工作。 只要这个规则被应用在边缘,就不会涉及到额外的安全问题,因为你的内部networking像以前一样保持安全。 但这取决于你的networking结构。

我也猜测,这将是一个临时的措施,规则将在以后被删除。 也许你应该事先做所有可能的testing,并确保它会按照你想要的方式工作。

部分原因让我想知道是否有什么我缺less的是为什么ip_forward不是总是设置为1,而是默认为0的问题 – 就像是有一些安全风险或不希望的行为,如果在某些情况下设置为1 。

如果您的系统(与许多其他系统一样)不需要成为路由器,则没有理由启用路由。

关于端口80.由于您已经有了一个在example.com上监听的web服务器,所以configuration一个反向代理到新的web服务器是相当容易的。 服务器故障上有很多例子,但是很简单

 <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> 

您唯一需要做的其他事情是configuration一个本地DNSparsing器,其中包含一个example.com条目,以便优先于全局DNS。 像dnsmasq这样的应该很容易做到这一点。


在您的具体情况下,您可以提前为example.com准备新的虚拟主机,安装dnsmasq并将example.com添加到本地主机文件中。 然后,当你准备好了,启用dnsmasq服务,并重新启动apache,你走了。

ip_forwarding:在使用公共IP地址的情况下,ip_forwarding可能是危险的。 然后,新安装的Linux机器可以用作不应该以这种方式路由的networking的路由器。

iptables:你的iptables设置的主要问题可能是新机器上的路由。 那台机器必须使用旧机器作为路由器来发送重组数据包,这样你最终会遇到路由挑战。 使用像varnish这样的代理来转发httpstream量可能更安全/更容易。 如果您使用apache或nginx进行托pipe,您甚至可以将它们设置为新Web服务器的代理服务器。

你可以使用haproxy。 configuration可以在下面find:

 global chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http option abortonclose no option checkcache option redispatch retries 3 timeout http-request 30s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout server 1m timeout http-keep-alive 5s timeout check 10s maxconn 4000 # xxxx = new IP # yyyy = old IP listen lxxxx option forwardfor header X-Real-IP option http-server-close source yyyy bind yyyy:80 server newserver xxxx:80 id 1 listen lxxxxssl source yyyy mode tcp bind yyyy:443 server newserver xxxx:443 id 1 

另外,你可以使用dnsmasq转发DNS请求 – 在这里可以find一个有用的答案在这里serverfault 如何强制dnsmasq使用DNS的一些主机?

我已经移动了数据中心几次,随着移动一个完整的C类块不断变化。 在iptables中使用conntrack以及snat是明智的。

这是我用了几次的一个方便的小脚本。 简单,像魅力一样工作。 根据需要添加其他端口。 一旦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 

这个转发应该在防火墙内部实现,而不是留给公众访问。

至于为什么默认情况下转发没有设置,其他的响应可以说是最好的:如果设备没有路由数据包,它不应该是打开的。 这是一个安全风险吗? 这一切都取决于服务器的angular色和configuration。

希望这可以帮助。

您还必须确保-A Forwarding未设置为ACCEPT,因为您的服务器将成为可能(也很可能将用于)恶意活动的开放路由器。 有了这个说法,只需添加一条规则,只转发你需要的stream量,你应该很好去。

转发可能被禁用的原因有两个:第一,每个模块加载和活动使用计算能力。 当它被禁用时,可以节省计算能力。 就这么简单。 数字2稍微复杂一点:当一个刚接触Linux或者Iptables的人使用默认的规则集时,会有默认的FORWARD接受策略,导致一个开放的路由器(再次)。 由于没有人希望在服务器开始路由数据包之前采取第二种“安全措施”。

您的iptables的NATredirect将工作,但请注意,此方法依赖于conntrack模块。 如果您的服务器有太多的同时请求,conntrack表将变满,您将遇到停机时间。 您当然可以增加conntrack散列表的大小以及散列查找的方式,但这可能会影响性能。 所以我build议你仔细研究一下,如果你的服务器正在服务大量的networkingstream量。

我也不会在你的规则中使用-j MASQUERADE ; 只有SNAT和DNAT。 我以前做过 我的规则如下:

 iptables -t nat -A PREROUTING -p tcp -s TEST_IP -d ORIGINAL_IP --dport 80 -j DNAT --to NEW_IP iptables -t nat -A POSTROUTING -p tcp -s TEST_IP -d NEW_IP --dport 80 -j SNAT --to ORIGINAL_IP 

这很方便,因为它将转发限制为单一来源(testing)主机/ IP地址,然后您将能够使用此主机来testing转发的工作。 一旦你感到高兴,你可以重新应用这些规则,删除-s TEST_IP

由于我关于conntrack超载的第一点,我仍然会降低DNS TTL,这应该会减less到达旧服务器的总stream量,所以任何恶意请求都会通过iptables NAT端口redirect来处理,其中卷的要求应该足够低,以免冒险填满你的conntrack表。

你不需要iptableshaproxy等这样简单的任务。 只要安装rinetd ,其configuration文件就是最简单的。

 <your IP/FQDN> <your port> <where to forward IP/FQDN> <where to forward port> 

 old.webserver.com 80 new.webserver.com 80 

我所见过的IP转发最好的例子是在日本的太极县网站上。 作为一个stream行的目标,他们保持一个虚拟的过时的Apache Web服务器运行在他们专用的转发目标IP地址58.94.160.100。 这为其他三个网页服务器,即MS 2012R模型,分配到10.0.0.0,但物理位于未知的部分作为一个避雷针。 他们利用十几个不同的托pipe公司来稳定他们的网站,同时使用持久的IP转发,几乎没有任何停机时间。 除非您的公司是拒绝服务攻击的stream行目标,否则将您的信号转发到专用和转发的IP地址应该没有问题,尤其是在您提前做好计划的情况下。 我的VPN使用一个NYCnetworking,这是注册在opendns.com,并与att.net作为我的ISP,这给了我的名字服务器在208.67.220.220和208.67.222.222接近att.net域名服务器在209.xxx .xxx.xxx。 我的循环设置为127.0.0.1,在TCP和ipv6模式下使用Tor和dnschef可以很好地工作。 我的第一个networking适配器是NAT,然后我又指定了两个natnetworking,我的第四个和最后一个适配器只作为主机。 结果是,我总是占用10.0.2.2,127.0.0.1或192.156.0.100,这对匿名是理想的,并且能够parsing网站地址。 总之,我认为IP转发可能是为了安全目的而使用,因此默认为0可能是保护特定子网地理位置的匿名性的一种方法,即使使用注册域名服务器也是如此,因为应该完全分离工作networking在转发IP的情况下发生故障。 search您的IP的人将不可能发现任何dns泄漏,因为系统将需要积极维护。 我听说世界各地有多达5万个公用名称服务器,而拥有清晰networking专业知识的人可以在移动的同时暂时将其中一些人join到您的系统中,并避免任何停机。