conntrackd正在经历一个奇怪的问题。 我创build了一个具有主动/备份场景的环境,其中会话将在故障切换后被复制到备份中,反之亦然。 我遵循的工具和其他教程,几乎使用相同的configuration的官方手册 。
我使用wget或ssh创build了几个tcp会话,我可以看到在conntrack -L和conntrack -E -p tcp创build的会话
root@master:/home/master# conntrack -L udp 17 22 src=xxx190 dst=xxx sport=138 dport=138 [UNREPLIED] src=xxx dst=xxx190 sport=138 dport=138 mark=0 use=1 udp 17 4 src=xxx9 dst=255.255.255.255 sport=11235 dport=11232 [UNREPLIED] src=255.255.255.255 dst=xxx9 sport=11232 dport=11235 mark=0 use=1 udp 17 21 src=xxx26 dst=255.255.255.255 sport=17500 dport=17500 [UNREPLIED] src=255.255.255.255 dst=xxx26 sport=17500 dport=17500 mark=0 use=1 udp 17 14 src=xxx212 dst=xxx sport=137 dport=137 [UNREPLIED] src=xxx dst=xxx212 sport=137 dport=137 mark=0 use=1 udp 17 18 src=xxx50 dst=xxx sport=62401 dport=3052 [UNREPLIED] src=xxx dst=xxx50 sport=3052 dport=62401 mark=0 use=1 tcp 6 299 ESTABLISHED src=192.168.0.7 dst=xxx58 sport=46026 dport=80 src=xxx58 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=xxx58 sport=46030 dport=80 [UNREPLIED] src=xxx58 dst=192.168.0.7 sport=80 dport=46030 [UPDATE] tcp 6 60 SYN_RECV src=192.168.0.7 dst=xxx58 sport=46030 dport=80 src=xxx58 dst=192.168.0.7 sport=80 dport=46030 [UPDATE] tcp 6 432000 ESTABLISHED src=192.168.0.7 dst=xxx58 sport=46030 dport=80 src=xxx58 dst=192.168.0.7 sport=80 dport=46030 [ASSURED]
但是我看不到他们在主内部caching或外部备份caching中,我只能看到udp会话。 (我不能发布内部和外部caching,他们太大了,想象就像第一块代码,但只有udp会话)。 这意味着tcp会话在故障转移时被销毁而不被复制。 我的gwet暂停,我的ssh连接冻结。 即使主人再次接pipe会议已经失去了。
conntrackd的configuration是:
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 xxx58 IPv4_address xxx56 IPv4_address xxx59 IPv4_address xxx7 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作为这个问题暗示我的内部和外部caching都是空的(即使udp会话丢失)。 如果我使用Address Accept而不是Address Ignore同样适用。 也build议DisableExternalCache On在主动/主动scheme中使用,而不是我正在查找的主动/备份。
防火墙规则设置为接受,并添加这些附加规则(从netfilter testcase中获取 )
[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
我尝试了其他configuration,其他同步模式,提交更改的脚本以及适当时刷新caching。 但我似乎无法find为什么tcp会话不显示在caching中。 有什么想法吗? 我错过了什么吗?
经过大量的阅读,重新configuration和外部帮助,问题解决了(最后的噩梦结束了)。
问题出在configuration的Address Ignore部分,而不是我最初想到的规则集。
在我跟着的教程中他们说:
“地址忽略”块应该列出防火墙所有的IP地址
但是他们没有说Address Ignore应该列出防火墙在本地接口上的所有IP地址。
放置额外的地址,比如说一个testing主机,将会忽略来自该主机的所有stream量。 这就是为什么在期望表中我能看到会话,但不能在caching中看到。 这意味着Address Ignore块应该只列出它自己(也可能是备份的)IP地址(环回,外部,内部,VIP)。
PS:应该提到的另一件事是防火墙应该设置伪装防火墙IP。 如果没有,在故障转移VIP更改所有者,但会话仍然在寻找它创build的机器的IP。
为了克服这snat应该设置一个规则。