多户系统是指具有多个IP接口的系统。这些接口可以在同一个子网,也可以在不同的子网。今天我想考虑FTP和NDMP等协议。在这两个协议中,服务器接受来自客户端的连接,然后建立一个新的连接回到客户端。在一个多主机系统中,正是这个新的连接导致了所有的问题。
在这两个协议中,源IP地址并不是基于客户端最初连接到的IP地址,而是基于与用于返回客户端的网关相关的接口。相反,它是基于与网关相关联的接口,用于返回到客户端。
例如,给定以下接口和路由表。
ifconfig -all

Number of interface(s) under IP: 5

%phx_vos#loop.m16: <UP, LOOPBACK, RUNNING>
127.0.0.1 netmask 0xff000000

%phx_vos#enetA: <UP, BROADCAST, RUNNING, NOFORWARDBROADCAST, KEEPALIVE>
172.16.1.50 netmask 0xffffff00 broadcast 172.16.1.255

%phx_vos#enetZ: <UP, BROADCAST, RUNNING, NOFORWARDBROADCAST, KEEPALIVE>
192.168.77.50 netmask 0xffffff00 broadcast 164.152.77.255

ready 15:33:51


route print

Default Gateway: 192.168.77.1
ready 15:33:57
一个IP地址为10.1.1.1的客户端连接到172.16.1.50,称这个连接为"A"。为了向 10.1.1.1 发送数据包,模块必须使用默认网关,该网关在 192.168.77.0/24 网络上,因此使用 192.168.77.50 接口。在连接"A"时,它使用这个接口来处理所有到 10.1.1.1 的流量;但 TCP 头中的 IP 地址将是 172.16.1.50,因为那是客户端连接到连接 A 的 IP 地址。然而,当模块创建一个新的连接到10.1.1.1,连接"B"时,STCP会默认选择192.168.77.50作为源IP地址。这样做是因为网关也是连接在这个接口上的。应用程序可以覆盖这一点,但FTP和NDMP都不会这样做。
主要考虑的是防火墙和路由器上访问列表的配置。如果客户端防火墙或路由器ACLs配置成只允许从172.16.1.50的连接,那么从192.168.1.50的连接就会失败。解决方法是使用172.16.1.0/24子网的路由器创建一条通往10.1.1.1的路由(当然所选路由器必须能够到达10.1.1.1),或者将防火墙和路由器访问列表但重新配置为允许192.168.1.50。
你可以用下面的脚本来测试
stcp_calls
socket
connect -name 10.1.1.1 -port N
socket
bind -name 172.16.1.50 -port 0
connect -name 10.1.1.1 -port N
当然,你必须把10.1.1.1替换为客户端的实际IP地址,把172.16.1.50替换为客户端连接的IP地址。端口N应该是客户端开放的一些端口,并且是防火墙和路由器ACL所允许的。
第一次连接将使用默认IP地址,第二次连接将使用172.16.1.50。如果第一次连接超时(需要一分钟左右)或立即返回连接拒绝的错误,但第二次连接正常(你将看到的是"stcp:"提示),你可以确定是防火墙或路由器ACL的问题,需要解决。

© 2020 Stratus Technologies.