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 / 问题 / 586628
Accepted
mdeous
mdeous
Asked: 2014-04-04 23:35:41 +0800 CST2014-04-04 23:35:41 +0800 CST 2014-04-04 23:35:41 +0800 CST

在虚拟 IP 上发送的数据包不符合 iptables 规则

  • 772

我有一个eth1:3带有 IP 地址的虚拟接口222.192.124.3,我设置了一个 iptables 规则来使用该接口的 IP 记录来自该接口的数据包(我知道 iptables 不关心虚拟接口标签),如下所示:

iptables -A INPUT -d 222.192.124.3 -j LOG --log-level warning --log-prefix "VIP3-IN: "

当我从另一台机器运行 tcpdump 并在此 IP 上发送数据包时,我看到了它们,因此我假设它们已被内核正确接收和处理,但 iptables 从不记录这些数据包,并且当我运行时iptables -nvL,该规则的数据包计数是'没有增加,就像他们从未达到规则一样(或者如果 iptables 甚至没有看到该接口上的数据包)。

我首先想到了另一个匹配数据包的规则,因此在它遇到 LOG 规则之前对其进行了处理,所以我删除了每个 iptables 规则,只添加了日志记录规则,没有更多成功。

服务器在 RHEL 6.2 上运行,内核为 2.6.32,在 VMware ESX 上虚拟化。

这是完整的输出iptables -nvL:

Chain INPUT (policy ACCEPT 40 packets, 2891 bytes)
  pkts bytes target     prot opt in     out     source               destination
  0     0    LOG        all  --  *      *       0.0.0.0/0            222.192.124.3 LOG flags 0 level 4 prefix `VIP3-IN: '

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
  pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 34 packets, 3816 bytes)
  pkts bytes target     prot opt in     out     source               destination

这是 tcpdump 输出的示例,显示了传入的数据包 ( tcpdump -n -nn -vvv -i eth1 "host 203.0.59.135"):

10:26:01.259409 IP (tos 0x50, ttl 121, id 26746, offset 0, flags [DF], proto TCP (6), length 52)
    203.0.59.135.62332 > 222.192.124.3.8888: Flags [S], cksum 0x8da8 (correct), seq 3373891789, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0

最后,ifconfig eth1:3输出:

eth1:3    Link encap:Ethernet  HWaddr 00:50:56:AC:35:35
      inet addr:222.192.124.3  Bcast:222.192.127.255  Mask:255.255.252.0
      UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

更新:

iptables 图
(来源:austintek.com)

在上图的帮助下,我在不同的表中设置了 iptables 规则,以查看数据包的去向。我想出了以下脚本:

IPT_FILTER="iptables -t filter"
IPT_MANGLE="iptables -t mangle"
IPT_NAT="iptables -t nat"

$IPT_FILTER -F
$IPT_FILTER -X
$IPT_FILTER -A INPUT -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG filter: "
$IPT_FILTER -Z

$IPT_MANGLE -F
$IPT_MANGLE -X
$IPT_MANGLE -A PREROUTING -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG mangle/prerouting: "
$IPT_MANGLE -A INPUT -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG mangle/input: "
$IPT_MANGLE -Z

$IPT_NAT -F
$IPT_NAT -X
$IPT_NAT -A PREROUTING -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG nat/prerouting: "
$IPT_NAT -Z

似乎数据包通过mangle/PREROUTINGandnat/PREROUTING表,但没有命中mangle/INPUT表,所以我猜它需要“防火墙数据”上的“否”分支。而且绝不是网络或系统专家(最多是高级用户),这就是我迷路并且不明白发生了什么的地方......

最终编辑(解决方案)

正如@nodens 在他们的回答中所建议的那样,问题是由 RPF 处于“严格”模式引起的......对于这样一个简单的设置来说真是令人头疼......

linux
  • 2 2 个回答
  • 6214 Views

2 个回答

  • Voted
  1. Best Answer
    nodens
    2014-04-05T01:47:57+08:002014-04-05T01:47:57+08:00

    您确定其他表中没有匹配规则,例如 mangle 或 nat 吗?您还可以尝试记录 INPUT 中的每个 paquet,或者更好的是,尝试原始表(PREROUTING 链)中的 TRACE 目标,如果在 RHEL 6 上可用的话

    编辑(我还不能添加评论):

    好的,所以数据包到达了接口,但它不被认为是应该在本地处理的。检查您的路由表,也许您没有到该网络的范围链接路由,或者由于 RPF 过滤器而内核丢弃了数据包(这可能取决于网络拓扑):检查https://access.redhat .com/site/solutions/53031

    • 3
  2. Eric Leblond
    2014-04-05T01:17:23+08:002014-04-05T01:17:23+08:00

    内核级别不存在虚拟接口。它们是 ifconfig 放在地址上的别名。自上个千年结束以来,不应使用它们。

    关于iptables。由于这不是内核级别的接口,因此您必须使用真实的接口名称进行过滤。在你的情况下 eth1. 如果您希望严格,您将需要尽可能按源网络进行过滤,以通过使用虚拟接口名称来模仿您尝试执行的操作。

    • 0

相关问题

  • 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