Conntrackd 缓存未显示 TCP 会话

Conntrackd 缓存未显示 TCP 会话

我遇到了一个有点奇怪的问题conntrackd。我创建了一个具有主动/备份场景的环境,其中会话将在故障转移后复制到备份,反之亦然。我已遵循官方手册该工具和其他教程几乎使用相同的配置。

问题

我使用或创建了多个tcp会话,并且可以看到在和中创建的会话wgetsshconntrack -Lconntrack -E -p tcp

root@master:/home/master# conntrack -L
udp      17 22 src=x.x.x.190 dst=x.x.x. sport=138 dport=138 [UNREPLIED] src=x.x.x. dst=x.x.x.190 sport=138 dport=138 mark=0 use=1
udp      17 4 src=x.x.x.9 dst=255.255.255.255 sport=11235 dport=11232 [UNREPLIED] src=255.255.255.255 dst=x.x.x.9 sport=11232 dport=11235 mark=0 use=1
udp      17 21 src=x.x.x.26 dst=255.255.255.255 sport=17500 dport=17500 [UNREPLIED] src=255.255.255.255 dst=x.x.x.26 sport=17500 dport=17500 mark=0 use=1
udp      17 14 src=x.x.x.212 dst=x.x.x. sport=137 dport=137 [UNREPLIED] src=x.x.x. dst=x.x.x.212 sport=137 dport=137 mark=0 use=1
udp      17 18 src=x.x.x.50 dst=x.x.x. sport=62401 dport=3052 [UNREPLIED] src=x.x.x. dst=x.x.x.50 sport=3052 dport=62401 mark=0 use=1
tcp      6 299 ESTABLISHED src=192.168.0.7 dst=x.x.x.58 sport=46026 dport=80 src=x.x.x.58 dst=192.168.0.7 sport=80 dport=46026 [ASSURED] mark=0 use=1

root@master:/home/master# conntrack -E -p tcp
    [NEW] tcp      6 120 SYN_SENT src=192.168.0.7 dst=x.x.x.58 sport=46030 dport=80 [UNREPLIED] src=x.x.x.58 dst=192.168.0.7 sport=80 dport=46030
 [UPDATE] tcp      6 60 SYN_RECV src=192.168.0.7 dst=x.x.x.58 sport=46030 dport=80 src=x.x.x.58 dst=192.168.0.7 sport=80 dport=46030
 [UPDATE] tcp      6 432000 ESTABLISHED src=192.168.0.7 dst=x.x.x.58 sport=46030 dport=80 src=x.x.x.58 dst=192.168.0.7 sport=80 dport=46030 [ASSURED]

但是我无法在主服务器的内部缓存或备份服务器的外部缓存中看到它们,我只能看到udp会话。(我无法发布内部和外部缓存,它们太大了。想象一下就像第一个代码块,但只有udp会话)。这意味着tcp会话在故障转移时被销毁,而不是复制。我的gwet暂停和ssh连接冻结。即使主服务器再次接管,会话也已经丢失。


conntrackd的配置为:

Sync {
    Mode FTFW {
        DisableExternalCache Off
        CommitTimeout 1800
        PurgeTimeout 5
    }

    UDP{
        IPv4_address 192.168.0.4
        IPv4_Destination_Address 192.168.0.5
        Port 3780
        Interface eth1
        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
            UDP
            ICMP # This requires a Linux kernel >= 2.6.31
        }
        Address Ignore {
            IPv4_address 127.0.0.1 # loopback
            IPv4_address x.x.x.58
            IPv4_address x.x.x.56
            IPv4_address x.x.x.59
            IPv4_address x.x.x.7
            IPv4_address 192.168.0.4
            IPv4_address 192.168.0.5
            IPv4_address 192.168.0.6
            IPv4_address 192.168.0.7
            IPv4_address 192.168.100.100
        }
    }
}

如果我DisableExternalCache On使用这个问题表明我的内部和外部缓存都是空的(甚至会话都丢失了)。如果我使用而不是udp,情况也是如此。还建议在主动/主动方案中使用 ,而不是我正在寻找的主动/备份。Address AcceptAddress IgnoreDisableExternalCache On

防火墙规则设置为接受,并添加这些附加规则(取自Netfilter 测试用例

[1] iptables -P FORWARD DROP
[2] iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
[3] iptables -A FORWARD -i eth1 -p tcp --syn -m state --state NEW -j ACCEPT
[4] iptables -A FORWARD -i eth1 -p tcp -m state --state ESTABLISHED -j ACCEPT
[5] iptables -A FORWARD -m state --state INVALID -j LOG
[6] iptables -I POSTROUTING -t nat -s 192.168.0.3 -j SNAT --to 192.168.1.100

我尝试过其他配置、其他同步模式、提交更改并在适当时刷新缓存的脚本。但我似乎找不到tcp会话未显示在缓存中的原因。有什么想法吗?我遗漏了什么吗?

答案1

经过大量阅读、重新配置和外部帮助后,问题得到了解决(噩梦终于结束了)。

问题出在Address Ignore配置部分,而不是我最初认为的规则集。

在我遵循的教程中他们说:

“地址忽略”块应列出防火墙拥有的所有 IP

但他们没有说应该Address Ignore列出防火墙的所有 IP在本地接口上

放置额外的地址(例如测试主机)将忽略该主机生成的所有流量。这就是为什么在预期表中我能够看到会话,但在缓存中看不到。这意味着该Address Ignore块应该只列出它自己的(也可能是备份的)IP 地址(环回、ext、int、VIP)。

附言:另一件需要注意的事情是,防火墙应设置为伪装防火墙 IP。否则,在故障转移时 VIP 会更改所有者,但会话仍会查找​​其创建的计算机的 IP。

为了克服这个问题,snat应该制定一条规则。

相关内容