AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 749682
Accepted
sa289
sa289
Asked: 2016-01-17 20:04:37 +0800 CST2016-01-17 20:04:37 +0800 CST 2016-01-17 20:04:37 +0800 CST

Linux 上的 IP 转发 - 有什么重要的事情要确保去做或知道吗?

  • 772

在将具有专用 IP 的网站从一台服务器移动到另一台服务器时,为了最大限度地减少由于 DNS 传播延迟导致的停机时间,有一种使用 IP 转发的方法,以便将原始 IP 的所有流量转发到新 IP。

这样做时有什么重要的事情要知道吗?这是我计划使用的步骤。从安全角度或其他方面我有什么遗漏的吗?

  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

我知道停机时间可以通过在更改之前足够远地降低 DNS 记录的 TTL 来减少停机时间,但这仍然不能很好地减少停机时间,因为据说某些 DNS 服务器(可能还有客户端)会缓存记录的时间长于 TTL 所说的是否短。

编辑:

让我想知道我是否缺少某些东西的部分原因ip_forward是为什么不总是设置为1而是默认为- 比如如果在某些情况下0将其设置为存在一些安全风险或不良行为。1

linux
  • 9 9 个回答
  • 12255 Views

9 个回答

  • Voted
  1. user9517
    2016-01-20T06:47:24+08:002016-01-20T06:47:24+08:00

    让我想知道我是否缺少某些东西的部分原因是为什么 ip_forward 并不总是设置为 1 而是默认为 0 - 比如在某些情况下将其设置为 1 是否存在一些安全风险或不良行为.

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

    关于端口 80。由于您已经在 example.com 上侦听了一个网络服务器,因此为新的网络服务器配置反向代理相当容易。关于如何执行此操作的服务器故障有很多示例,但简要说明

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

    您唯一需要做的另一件事是使用 example.com 的条目配置本地 DNS 解析器,以便优先选择全局 DNS。像 dnsmasq 这样的东西应该很容易做到这一点。


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

    • 4
  2. Best Answer
    Diamond
    2016-01-20T05:57:29+08:002016-01-20T05:57:29+08:00

    IP转发本身没有固有的不安全性,除了防火墙的配置方式(如果它们是同一台机器)。相反,它可以通过隐藏真实的服务器 ip 来提供某种安全性。

    通过启用ip_forwarding,可以将 linux 机器变成路由器(可以在网络之间进行数据包转发),这并不总是需要或预期的,这就是默认情况下禁用它的原因。

    RedHat 的以下文章很好地解释了这一切。

    7.4. FORWARD 和 NAT 规则

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

    我也猜想,这将是一个临时措施,稍后将删除规则。也许您还应该事先进行所有可能的测试,并确保它会按照您想要的方式工作。

    • 3
  3. Micha Kersloot
    2016-01-20T06:21:24+08:002016-01-20T06:21:24+08:00

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

    iptables: 您的 iptables 设置的主要问题可能是新机器上的路由。该机器必须使用旧机器作为路由器将损坏的数据包发送回,这样您最终会遇到路由挑战。使用 varnish 之类的代理转发 http 流量可能更安全/更容易。如果您使用 apache 或 nginx 进行托管,您甚至可以将它们设置为新网络服务器的代理服务器。

    • 1
  4. Mugurel
    2016-01-20T06:28:02+08:002016-01-20T06:28:02+08:00

    您可以为此使用 haproxy。配置可以在下面找到:

    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
    
    # x.x.x.x = new IP
    # y.y.y.y = old IP
    
    listen l.x.x.x.x
           option forwardfor header X-Real-IP
           option http-server-close
           source y.y.y.y
           bind y.y.y.y:80
           server newserver x.x.x.x:80 id 1
    
    listen l.x.x.x.x.ssl
           source y.y.y.y
           mode tcp
           bind y.y.y.y:443
           server newserver x.x.x.x:443 id 1
    

    此外,您可以使用 dnsmasq 转发 DNS 请求 - 一个有用的答案可以在这里找到 serverfault如何强制 dnsmasq 对某些主机使用 dns?

    • 1
  5. Gmck
    2016-01-20T07:27:53+08:002016-01-20T07:27:53+08:00

    我已经搬迁了几次数据中心,整个 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
    

    这种转发应该在防火墙内实现,而不是让公众访问。

    至于为什么默认不设置转发,可能其他响应说得最好:如果设备没有路由数据包,它不应该打开。是否存在安全风险?这一切都取决于服务器的角色和配置。

    希望这可以帮助。

    • 1
  6. Flole
    2016-01-20T15:42:22+08:002016-01-20T15:42:22+08:00

    您还必须确保 -A Forwarding 未设置为 ACCEPT,因为您的服务器将成为可能(并且很可能会)用于恶意活动的开放路由器。话虽如此,只需添加一条规则以仅转发您需要的流量,您应该一切顺利。

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

    • 1
  7. parkamark
    2016-01-21T07:20:11+08:002016-01-21T07:20:11+08:00

    您的 iptables NAT 重定向将起作用,但请注意此方法取决于 conntrack 模块。如果您的服务器有太多同时请求,conntrack 表将变满,您将遇到停机时间。您当然可以增加 conntrack 哈希表的大小以及如何完成哈希查找,但这可能会影响性能。因此,如果您的服务器正在为大量网络流量提供服务,我建议您彻底调查此问题。

    我也不会-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
    

    这很方便,因为它将转发限制为单个源(测试)主机/IP 地址,然后您将能够使用该主机来测试转发是否有效。-s TEST_IP一旦您感到满意,您就可以在删除后重新应用这些规则。

    由于我关于 conntrack 过载的第一点,我仍然会像您所描述的那样降低 DNS TTL - 这应该最大限度地减少到达旧服务器的流量总量,因此任何恶意请求都通过 iptables NAT 端口重定向处理,其中卷请求的数量应该足够低,以免冒着填满 conntrack 表的风险。

    • 1
  8. user1700494
    2016-01-21T03:47:41+08:002016-01-21T03:47:41+08:00

    对于这样一个简单的任务,您不需要iptables,等等。haproxy安装即可rinetd,它的配置文件最简单。

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

    IE

    old.webserver.com 80 new.webserver.com 80
    
    • 0
  9. John May
    2016-01-19T22:03:05+08:002016-01-19T22:03:05+08:00

    我见过的 IP 转发最好的例子是日本太极镇的网站。作为活动家的热门目标,他们在其专用转发目标 IP 地址 58.94.160.100 上运行一个虚拟的过时 Apache 网络服务器。这可以作为他们其他三个 Web 服务器的避雷针,它们是 MS 2012R 模型,分配到 10.0.0.0,但物理位置未知。他们利用十几个不同的托管公司来稳定他们的网站,同时使用持久的 IP 转发,几乎没有任何停机时间。除非您的公司是拒绝服务攻击的热门目标,否则将您的信号转发到专用和转发的 IP 地址应该完全没有问题,尤其是在您提前做好计划的情况下。我的 VPN 使用 NYC 网络,该网络在 opendns.com 注册,并以 att.net 作为我的 ISP,这给了我位于 208.67.220.220 和 208.67.222.222 的名称服务器,它们与位于 209.xxx.xxx.xxx 的 att.net 名称服务器很接近。我的循环设置为 127.0.0.1,在 TCP 和 ipv6 模式下使用 Tor 和 dnschef 效果很好。我的第一个网络适配器是 NAT,然后我指定另外两个作为 nat 网络,我的第四个也是最后一个适配器仅作为主机。结果是我总是占用 10.0.2.2、127.0.0.1 或 192.156.0.100,这是匿名的理想选择,并且能够解析网站地址。总而言之,我认为 IP 转发可能旨在用于安全目的,因此默认为 0 可能是保护特定子网地理匿名性的一种方式,即使使用注册的名称服务器,因为如果转发的 IP 发生故障,应该完全隔离工作网络。搜索您的 IP 的人不太可能发现任何 dns 泄漏,因为系统需要积极维护。我听说全球有多达 50,000 个公共名称服务器可用,具有您明确网络专业知识的人可以轻松地将其中一些在您的系统中临时工作,同时避免任何停机时间。

    • -2

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve