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 / 问题 / 35764
Accepted
Joel
Joel
Asked: 2009-07-04 17:29:19 +0800 CST2009-07-04 17:29:19 +0800 CST 2009-07-04 17:29:19 +0800 CST

使用多宿主服务器丢弃 IP 流量

  • 772

(在详细介绍之前,我以 Apache 和 SSH 为例来介绍这个问题,但这并不特定于 TCP 流量,它与基于 TCP 和 UDP 的协议的问题相同。)

我有一个运行 Ubuntu 9.04 的多链接、多宿主服务器,eth0 连接到外部网络,eth1 连接到内部网络。外部网络呈现给“世界其他地方”,内部网络包含所有开发人员工作站和主力服务器。有防火墙阻止从“世界其他地方”到内部网络的流量,但不阻止传出请求。

$ /sbin/ifconfig
eth0  Link encap:Ethernet  HWaddr 00:30:18:a5:62:63  
      inet addr:xxx.yyy.159.36  Bcast:xxx.yyy.159.47  Mask:255.255.255.240
      [snip]

eth1  Link encap:Ethernet  HWaddr 00:02:b3:bd:03:29  
      inet addr:xxx.zzz.109.65  Bcast:xxx.zzz.109.255  Mask:255.255.255.0
      [snip]

$ route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
xxx.yyy.159.32  0.0.0.0         255.255.255.240 U     0      0        0 eth0
xxx.zzz.109.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
0.0.0.0         xxx.yyy.159.33  0.0.0.0         UG    100    0        0 eth0

Apache 监听 80 端口,sshd 监听 22:

$ netstat --tcp -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:www                   *:*                     LISTEN     
tcp        0      0 *:ssh                   *:*                     LISTEN     
[snip]

从我在里面的开发机器,xxx.zzz.109.40,我可以连接到里面的地址,一切都很好。从外部我可以连接到外部地址,一切正常。

但是对于某些类型的测试,我想从我的开发机器连接到外部地址,但服务器拒绝连接请求。我猜它正在查看它的路由表,并且由于传入的数据来自一个应该在 eth1 上但到达 eth0 的地址,因此它正在丢弃它,这可能是出于安全预防措施。

有什么办法可以放宽这个限制吗?

奇怪的是,这曾经在 8.04 上工作,但在 8.10 或 9.04 上不起作用,所以在去年的某个时候,内核正在做一些额外的检查。为了使连接正常工作,返回路径需要与源路径相同,这意味着来自我的开发机器到达 eth0 的消息必须返回到 eth0 才能路由回我的机器。


这是一个图表,任何地方都没有 NAT。

图表

linux ubuntu routing networking ip
  • 7 7 个回答
  • 4216 Views

7 个回答

  • Voted
  1. Best Answer
    David Pashley
    2009-07-04T17:41:57+08:002009-07-04T17:41:57+08:00

    假设您没有任何 iptables 规则可以阻止这种情况,您需要禁用返回路径过滤。您可以使用以下方法执行此操作:

    # echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
    

    您还可以使用特定的接口名称而不是全部,并且还有一个默认值,这会影响新创建的接口。

    从:

    反向路径过滤器;检查是否对于到达接口的数据包,发送到原始数据包源地址的数据包将在该接口上发送出去;如果不是,则丢弃到达的数据包。它可以被认为是检测带有欺骗源地址的数据包的尝试。

    • 3
  2. womble
    2009-07-04T18:03:12+08:002009-07-04T18:03:12+08:00

    您还没有显示您的防火墙配置,但我敢打赌,那里有一条规则在过滤从内部到外部 IP 地址的连接时会做一些不利的事情。一个严重搞砸的 NAT 配置也可能有问题,但我很难想象一次普通的配置尝试会导致如此病态的事情。

    也只是为了澄清一点:仅仅因为一个数据包来自一个接口,地址是另一个接口的 IP 地址,不会导致内核拒绝该数据包。无论发生什么,都不是内核的错。

    此外,流量的 tcpdump(在服务器的内部和外部接口上以及在客户端上)在诊断上也很有用。

    • 0
  3. Saurabh Barjatiya
    2009-07-04T20:51:36+08:002009-07-04T20:51:36+08:00

    您的开发机器的默认网关是什么?假设第 3 层交换机/路由器的默认网关应该知道如何到达服务器的其他接口。

    你应该有类似的东西

    ip route xxx.yyy.159.36 netmask 255.255.255.240 gw xxx.zzz.109.65
    

    这应该使事情正常进行。但如果这还不够,请在机器 xxx.zzz.109.65 上启用 IP 转发,使用

    sysctl net.ipv4.ip_forward = 1
    

    还要编辑 /etc/sysctl.conf 并在那里启用 ip 转发。

    确保 xxx.zzz.109.65 上过滤表的 iptables FORWARD 链允许您的开发机器进行数据包转发。

    • 0
  4. Whisk
    2009-07-06T01:33:11+08:002009-07-06T01:33:11+08:00

    我猜您正在使用该框作为使用 iptables NAT 的 Internet nat 路由器 - 显然,如果不是这种情况,那么这将无济于事,否则您可能需要类似的东西:

    iptables -t nat -I POSTROUTING -s xxx.zzz.109.0/24 -d xxx.yyy.159.36 -j ACCEPT
    

    这将跳过您为从内部到外部传输的数据包所做的源 natting,这些数据包针对任何发往该服务器的外部 IP 的内容。

    • 0
  5. Jason Tan
    2009-07-06T09:43:58+08:002009-07-06T09:43:58+08:00

    只是为了肛门,我不会将上述网络配置称为多宿主。它只是在同一个 AS 内的两个网络之间转发。如今,多宿主实际上意味着连接到两个或多个邻居 (AS),或者至少连接到同一个上游邻居 (AS) 的多条路由,在叶网络具有单个上游连接提供商的情况下。

    • 0
  6. Marie Fischer
    2009-07-07T14:08:20+08:002009-07-07T14:08:20+08:00

    已经给出了很多有用的想法。我会 a) 仔细检查它不是防火墙/NAT。在你的 REJECT 和 DROP 规则之前添加一个 -j LOG 规则,看看是否有任何可疑的东西被捕获。b) 在两个接口(-i any)上运行 tcpdump 并查找您的数据包。

    顺便说一句,“服务器拒绝连接请求”到底是什么意思?您是否看到一些(立即)拒绝消息或连接只是超时?

    • 0
  7. pjz
    2009-07-07T19:20:39+08:002009-07-07T19:20:39+08:00

    这一定是您的防火墙规则的问题。盒子自己的外部 IP 很可能与“所有外部流量”混为一谈,因此不允许返回到内部客户端。尝试在该 IP 地址的防火墙规则中设置一个例外;也就是说,明确允许网络服务器的外部 IP 地址向内部网络发送流量。

    更多调试将要求您发布防火墙规则。

    • 0

相关问题

  • 保护新的 Ubuntu 服务器 [关闭]

  • 带宽利用工具?[关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

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

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +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