备份时间太长,防火墙会关闭连接

备份时间太长,防火墙会关闭连接

这里有点系统混搭,所以请耐心听我说。本质上,我在尝试备份远程 Linux 服务器时使用 Oracle 的 Backup Exec 代理遇到了一些问题。BE 代理似乎使用 RMAN 来备份数据库

备份服务器位于一个 VLAN 上,而目标服务器位于另一个 VLAN 上,Cisco ASA 防火墙提供它们之间的唯一链接。这是设计使然,因为备份服务器要支持众多客户端,并且每个客户端都必须位于自己的 VLAN 上,以防止它们相互访问。我已将推荐的端口添加到防火墙,以至少允许代理与媒体服务器通信。

备份开始得相当顺利(事实上,同一服务器上较小的 Oracle 数据库可以毫无问题地完成备份),但 200GB 的数据库显然需要几个小时才能完成,但却无法完成。

我认为问题在于http://www.symantec.com/business/support/index?page=content&id=TECH59632,它表示在备份开始时在端口 5633 上建立了一个 CORBA 会话,并在每次 RMAN 操作之前使用,但在传输数据时,CORBA 会话的套接字未收到任何数据包。由于防火墙上的连接超时为 60 分钟,CORBA 会话被丢弃,当 RMAN 代理尝试执行其下一个操作时,整个过程就会失败。赛门铁克表示,此问题已在 Backup Exec 的早期版本中得到修复,但没有详细说明任何强制执行该问题的额外设置。

将防火墙上的连接超时设置为足够高的值以覆盖备份窗口(例如 12 小时)似乎是错误的做法,因为这是一个整个范围的更改,还会影响(例如)与另一个客户端的 Web 服务器的 Web 请求的连接寿命。

将 Linux 服务器移到与备份服务器相同的 LAN 中是不可能的。

我不是 Linux 专家,但我大致了解一下。到目前为止,我尝试使用 libkeepalive (http://libkeepalive.sourceforge.net/) 强制使用 KEEPALIVE TCP 标志创建 beremote 进程的套接字,但快速netstat -top指示它没有成功。要么是我错误地使用了 libkeepalive,要么它不适用于 beremote 二进制文件

我想我正在寻找一个适合我所处环境的选项。我想我正在寻找以下一项或多项:

  • 如何配置 BE 代理来保持连接活跃?
  • 是否有一种将 keepalive 标志注入现有 TCP 连接的方法(例如通过 cronjob)?
  • 有没有一种方法可以告诉思科设备增加特定源/目标的连接超时时间(可能是策略图)?

欢迎任何/所有(其他)想法...

J.


回复:@Weaver 的评论

根据要求,,class-mappolicy-map条目service-map......

class-map CLS_INSPECTION_TRAFFIC
 match default-inspection-traffic
class-map CLS_ALL_TRAFFIC
 match any
class-map CLS_BACKUPEXEC_CORBA
 description Oracle/DB2 CORBA port for BackupExec traffic
 match port tcp eq 5633
!
!
policy-map type inspect dns PMAP_DNS_INSPECT_SETTINGS
 parameters
  message-length maximum client auto
  message-length maximum 1280
policy-map PMAP_GLOBAL_SERVICE
 class CLS_INSPECTION_TRAFFIC
  inspect dns PMAP_DNS_INSPECT_SETTINGS 
  inspect ftp 
  inspect h323 h225 
  inspect h323 ras 
  inspect rsh 
  inspect rtsp 
  inspect esmtp 
  inspect sqlnet 
  inspect skinny  
  inspect sunrpc 
  inspect xdmcp 
  inspect sip  
  inspect netbios 
  inspect tftp 
  inspect ipsec-pass-thru 
  inspect icmp 
  inspect snmp 
 class CLS_BACKUPEXEC_CORBA
  set connection timeout idle 1:00:00 dcd 
 class CLS_ALL_TRAFFIC
  set connection decrement-ttl
!

答案1

ASA 超时/计时器的背景:

全球连接超时是 TCP 虚拟电路(会话)空闲计时器,默认为 60 分钟。全局UDP超时用于 UDP 漏洞,默认为 2 分钟。全局超时用于清理遗留的翻译连接已超时。 conn(TCP)超时优先于 xlate 超时。下一段进一步解释 conn 和 xlate 计时器之间的关系。

如果成功通过 TCP 拆除拆除了连接,则连接和 xlate 也会随之拆除(如果动态 xlate、静态 NAT 和静态 PAT xlate 从未被移除)。如果连接超时,则 xlate 计时器会被考虑在内。如果 xlate 首先超时(您将其设置得非常低),它将不是断开连接直到连接超时。

ASA 有多种方法处理不同的超时情况。Conn 是其中一种可以根据类映射覆盖全局设置的方法——如果可能的话,这应该比增加全局设置更可取。

ASA 拥有的另一个有趣的功能是死连接检测 - DCD。 DCD 允许您将 [全局] conn 超时保持在 60 分钟(默认值),当达到 60 分钟时,ASA 中间人会将空数据 ACK 伪装成另一个端点发送到每个端点。空数据可防止序列号增加。如果双方都响应,则连接的空闲计时器将重置为 0 并重新开始。如果任一方在给定时间段内尝试一定次数(可配置)后仍未响应,则 conn 将被移除,并且 xlate 计时器将如上所述获得相关性。

我建议配置一个类映射并将其添加到启用 DCD 的策略中。您可以使用 ACL 或端口(其他端口也可用)。使用端口既快捷又简单,如果您确定 TCP/5633 是问题所在,那么它会很有效。

我已经使用了下面的 global_policy,但请根据需要随意调整。

class-map BE-CORBA_class
 description Backup Exec CORBA Traffic Class
 match port tcp eq 5633

policy-map global_policy
 class BE-CORBA_class
  -->::Choose one below::<--
  set connection timeout idle 1:00:00 dcd --> for 8.2(2) and up
  set connection timeout tcp 1:00:00 dcd --> for prior to 8.2(2)

service-policy global_policy global

@评论

根据参考指南--“一个数据包只能匹配策略映射中的一个类映射对于每个特征类型“”。

关键词以粗体显示。通过接口的数据包可以匹配策略映射中的多个类,但前提是这些类使用不同的“功能”。如果您在上述链接中向上滚动一点点,就会看到列出的各种功能。整个页面都是 MPF 趣闻的金矿。

正如您提到的,您有一个match any定义的类映射,然后在策略映射中将其作为类引用 - 如果您在该策略映射类中执行任何其他 TCP 和 UDP 连接限制和超时更改,则后续与流量匹配的类映射 - 如果在策略映射中设置 - 将不会对该数据包执行 TCP 和 UDP 连接限制和超时更改。

如果您发布所有 ACL、、class-mappolicy-mapservice-policy我们就可以确定。

答案2

尽管我不喜欢当一个 TCP 会话被终止时应用程序带着玩具回家(并且备份失败),但在这种情况下我会说只需增加 ASA 的 TCP 会话超时。

对会话长度设置硬性限制实际上只是 ASA 需要跟踪所有连接以维持状态(通常是 NAT)的产物 - 如果您正在运行设备的连接限制,那么这可能是一个问题,但除此之外,只需将其延长到 6 小时左右即可。

除非 TCP 会话两端的两个节点都关闭,否则 ASA 将在连接自然结束时见证一端或另一端结束连接,然后断开连接(或触发较短的半关闭连接超时),因此您不太可能最终出现大量死连接堵塞的情况。端点设备也有兴趣拆除无用的连接 - Web 服务器就是一个很好的例子,因为它们的连接超时通常比 ASA 短得多。

答案3

您可能考虑在远程 Linux 计算机上使用通用 TCP 代理,该代理应答 Backup Exec 的连接并将其转发到本地 CORBA 端口。(您可以通过防火墙上的 NAT 规则轻松安排 Backup Exec 服务器连接到此代理。)该 TCP 代理需要在其创建的侦听套接字上设置 SO_KEEPALIVE 选项。我选择的代理是rinetd,但快速查看源代码表明他们没有在侦听套接字上设置 SO_KEEPALIVE 选项(因此您必须对其进行修改才能获得所需的行为)。 可能存在另一个通用 TCP 代理默认设置 SO_KEEPALIVE(或作为选项),但我暂时没有想到有这样的代理。

另一种选择可能是将 SSH 隧道作为预作业脚本的一部分连接到远程机器,并将 SSH 客户端设置为使用 SO_KEEPALIVE 或 SSH 空数据包来保持连接。

相关内容