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 / 问题 / 627973
Accepted
hookenz
hookenz
Asked: 2014-09-12 14:54:13 +0800 CST2014-09-12 14:54:13 +0800 CST 2014-09-12 14:54:13 +0800 CST

为什么 conntrackd 不复制状态?

  • 772

我有一个主动/主动防火墙集群的问题,其中防火墙中的连接跟踪状态似乎没有被复制。

它是主动/主动的,因为我有两个通过不同 ISP 连接的路由器和一个通过 BGP 提供的网络范围。数据如何回传由 BGP 决定。因此路由是不对称的。这两个防火墙在内部网络上联网,我有一个虚拟 IP 作为 Windows 服务器的默认路由。

当两个防火墙都在运行并且内部服务器尝试连接时,回复通过辅助防火墙(没有连接状态记录的防火墙)返回。因此,回复被丢弃并且不会路由到发起请求的服务器。

我以为 conntrackd 会解决这个问题,但我似乎无法让它工作。也许我误解了它是如何工作的。我可以通过 conntrackd 复制 iptables 状态吗?它实际上在主动/主动模式下工作吗?状态是否实时复制?

这是我的 conntrackd.conf 文件包含的内容。

Sync {
  Mode ALARM {
    RefreshTime 15
    CacheTimeout 180
  }

  Multicast {
    IPv4_Address 225.0.0.50
    Group 3780
    IPv4_Interface 10.0.0.100
    Interface eth2
    SndSocketBuffer 1249280
    RcvSocketBuffer 1249280
    Checksum on
  }
}

General {
  Nice -20
  HashSize 32768
  HashLimit 131072
  LogFile on
  Syslog on
  LockFile /var/lock/conntrack.lock
  UNIX {
    Path /var/run/conntrackd.ctl
    Backlog 20
  }
  NetlinkBufferSize 2097152
  NetlinkBufferSizeMaxGrowth 8388608
  Filter From Userspace {
    Protocol Accept {
      TCP
    }

    Address Ignore {
      IPv4_address 127.0.0.1 # loopback
      IPv4_address 10.0.0.100 # dedicated link0
      IPv4_address 10.0.0.101 # dedicated link1
      IPv4_address x.x.x.130 # Internal ip
    }
  }
}

除了多播部分中的 IPv4_interface 具有 10.0.0.101 之外,其他 conntrackd 是相同的。并且过滤部分的内部IP以131结尾

我已设置防火墙规则以接受 225.0.0.50/32 的输入和 225.0.0.50/32 的输出。

我在这里将模式设置为警报,但首先尝试了 FTFW。两者似乎都不起作用。

我的内核版本是:3.11.0。

抱歉,我的剪切和粘贴无法从虚拟框窗口工作。但是,我只想说,当我运行时: sudo conntrackd -i 它列出了一个 ESTABLISHED tcp 连接作为输出,这是我使用 ssh 创建的连接。

但是,在另一台路由器上,相同的命令不会产生任何输出。我认为这应该意味着状态没有被转移到另一个路由器上。

有任何想法吗?


更新:我在每台机器上运行了 tcpdump -i eth2 ,我可以看到从另一台路由器本地到达的 UDP 数据包发往多播地址 225.0.0.50 端口 3780,长度为 68 字节。

如果我启动 ssh 连接,我会在 tcpdump 上看到即时活动,并且断开连接也是如此。否则,该消息的常规心跳就会通过。所以很明显路由器正在发送数据包,但 conntrackd 是否忽略了它们?我可以打开一些隐藏的调试吗?


Update2:好的,经过几天的谷歌搜索和查看源代码后,我发现 conntrackd 正在复制状态,但它最终在外部缓存中。要提交规则,您需要运行 conntrackd -c。显然 conntrackd 设计用于主动/备份模式。

似乎在某个时候引入了一个名为 CacheWriteThrough 的新选项。但随后被删除。conntrack 可以主动/不主动吗?我似乎无法找到答案。

linux
  • 2 2 个回答
  • 4814 Views

2 个回答

  • Voted
  1. Best Answer
    hookenz
    2014-09-12T16:12:19+08:002014-09-12T16:12:19+08:00

    好的,经过几天的挫折和很少的文档,甚至阅读源代码。我想通了。

    Mode FTFW {
         [...]
         DisableExternalCache On
    }
    

    非对称路由方案需要禁用外部缓存。否则,对于活动/备份,您希望使用默认关闭并在 keepalived 中设置 notify_master、notify_backup、notify_fault 设置。

    CacheWriteThrough 设置已被移除并替换为 DisableExternalCache。

    这些脚本用于将外部连接状态缓存提交给持有 IP 的路由器。使用 DisableExternalCache On 时,不需要它们,因为状态已经提交。

    • 5
  2. Chris Tucker
    2018-05-01T01:04:29+08:002018-05-01T01:04:29+08:00

    如果重新启动活动服务器,我发现防火墙/路由器对上的活动/备份配置(没有 nopreempt)失败。随着 master 宕机,备份接管,primary-backup.sh 脚本将外部缓存提交给内核表,正如预期的那样。所有连接都保持活动状态。然而,当(原始)master 重新启动并再次接管时,由于其外部缓存为空,primary-backup.sh 脚本向内核表提交了一个空的外部缓存,并且所有连接都被 iptables 删除。我通过在脚本开头附近添加几行来解决此问题:

    case "$1" in
      primary)
        #
        # request resynchronization with master firewall replica
        #
        # Note: this is an attempt to fix problem after reboot of original master,
        # which had no entries in external cache and so resulted in empty
        # conntrack table
        #
        $CONNTRACKD_BIN -C $CONNTRACKD_CONFIG -n
        if [[ $? -eq 1 ]]
        then
            logger "ERROR: failed to invoke conntrackd -n"
        fi
    
        #
        # commit the external cache into the kernel table
        #
        # etc
    
    • 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