A端:IP 172.17.178.105,内部隧道IP 192.168.255.1

A端:IP 172.17.178.105,内部隧道IP 192.168.255.1

我们在应用程序子网中运行一个 Oracle 生产实例,其中多个应用程序正在从子网 (172.17.xx) 内访问数据库,不幸的是,数据库非常旧,所有应用程序都使用 IP 地址而不是 DNS 名称连接它。我不知道连接到数据库的所有应用程序是什么。我们需要将数据库移动到同一位置 (10.52.xx) 内的另一个子网。但应用程序将保留在另一个子网中。我想知道在不影响 IP 地址(假设为 172.17.178.100)的情况下移动数据库的所有机制是什么。请提出建议

我建议在主子网中使用 F5 负载均衡器来平衡 Oracle 数据库,前端 IP 为 172.17.178.100,并将其映射到辅助子网的新数据库实例的后端 IP 地址。请建议所有替代解决方案,因为我对网络方面的了解有限。

答案1

将所有应用程序迁移至使用 DNS,并且记录你的发现。由于你并不了解所有这些,这将是一个发现的过程。

在主机上配置一个新的不同 IP 地址,并将其作为服务地址放入 DNS 中,db.example.net等等。向所有可能的应用程序所有者传达重命名项目,如果不采取行动,事情将无法进行。设定一个截止日期来识别和重命名每个接口系统。

不可避免地会忘记一些东西。通过使用防火墙规则记录与现有172.17.178.100IP 的剩余连接来识别落后者。对这些进行一些调查,并向所有者发送越来越紧急的提醒,提醒他们您发现的任何内容。

那是艰苦的工作。实际上,移动 IP 可能相对容易。按照您的清单重新设置服务器的 IP 并更新 DNS 名称。


在更新本世纪的网络技术时,坚持要求供应商支持 IPv6。充足的全局地址空间可防止子网耗尽或重叠。

答案2

@John Mahowald 的建议很合理,尤其是记录连接到 172.17.178.100 的 IP 以确定哪些主机仍在使用旧 IP。

根据您的情况,可以将所需的 IP 从旧子网隧道传输到新子网。如果您的最后期限即将完成将服务器迁移到新的 10.52.xy 子网,并且没有时间在迁移之前让所有人停止使用旧 IP,那么这可能会很有帮助。下面描述的技术可以使您的用户访问 172.17.178.100,即使服务器已物理移动到新的 10.52.xy 子网。

我过去曾使用过这种技术,使 DNS 服务器同时在两个 IP 上可用——新位置的新 IP 和不同位置的单独子网中的旧 IP。然后,我能够记录仍在使用旧 IP 的远程主机,并将它们迁移到使用新 IP,而不必急于避免任何潜在的停机。

必要的成分是宿主仍然在旧子网上,并且必须保留在该子网上,直到您完成从旧 IP 号到新 IP(或更好的是,新 DNS 名称)的迁移。我将始终将该机器称为“A 端”和/或子网 A。

然后,机器 B 位于新子网(子网 B)中,并在子网 B 中拥有一个正常的 IP 地址。机器 B 最终将被配置旧 IP,并且来自旧子网的流量将通过隧道重新路由到机器 B。

当我实现这个(大约 3 个月的过渡期)时,它是在 FreeBSD 上,因此这里的语法是 BSD 特定的。下面的设置可能听起来有点棘手,但其中很多是我自己过度描述。它只有 5 个或更少的命令行,可以放在脚本中并添加到启动时启动配置中。假设旧子网和新子网都在同一个数据中心,并使用不会将您的流量暴露给公共互联网的安全路由路径,则安全隐患应该相当小。如果到 172.17.178.100 的流量已加密或尚未加密,则使用此方法它将保持加密(或未加密)。我不是安全专家,但这似乎是“没有净变化”的结果。这种方法应该不是用于从机器 A 到机器 B 通过不安全网络(如互联网)传输的敏感流量。

有关此概念的更安全和完整的处理,请参阅FreeBSD 手册中有关 IPSec 上的 VPN 的条目,这个想法就是基于此。

A端:IP 172.17.178.105,内部隧道IP 192.168.255.1

# sysctl net.inet.ip.forwarding=1
# arp -s 172.17.178.100 78:2b:cb:3a:f6:93 pub
# ifconfig gif0 create
# ifconfig gif0 192.168.255.1 192.168.255.2
# ifconfig gif0 tunnel 172.17.178.105 10.52.100.200
# route add 172.17.178.100 192.168.255.2

具体来说:

A端将需要跨接口转发数据包,因此sysctl需要正确的设置:

# sysctl net.inet.ip.forwarding=1

使其永久生效:

# echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf

确定机器 A 的子网 A MAC 地址,并使用相同的 MAC 地址和旧 IP 172.17.178.100 发布 ARP 代理条目:

# arp -s 172.17.178.100 78:2b:cb:3a:f6:93 pub

然后我们创建一个gif接口,并使用本地 IP 和远程 IP(按此顺序)配置gif隧道。请注意,这些是隧道的“内部”IP。它们对外界不可见,仅用于将流量从机器 A 路由到机器 B。

# ifconfig gif0 create
# ifconfig gif0 192.168.255.1 192.168.255.2

您应该选择数据中心未使用的 RFC1939 IP 地址。192.168.255.1 是隧道 A 端的内部 IP,192.168.255.2 是 B 端的内部 IP。

接下来我们定义外部隧道端点的IP。

# ifconfig gif0 tunnel 172.17.178.105 10.52.100.200

这里 172.17.178.105 是机器 A 的子网 A IP。这就是为什么我说这种方法需要一个“留在” A 子网中的系统,而您的应用程序 IP 172.17.178.100 则迁移到新位置和子网 B。

机器 A 上的最后一个命令是将旧 IP 的流量路由到远程(B 端)内部的隧道IP:

# route add 172.17.178.100 192.168.255.2

B端:IP 10.52.100.200,内部隧道IP 192.168.255.2

现在,让我们转到 B 端配置。不需要 ARP 代理,也不需要任何特殊路由,因此设置只需三个命令,而不是五个:

# ifconfig gif0 create
# ifconfig gif0        192.168.255.2 192.168.255.1
# ifconfig gif0 tunnel 10.52.100.200 172.17.178.105

请注意,IP 编号与我们在 A 端使用的 IP 编号相反。第一个 IP 是本地 IP,第二个 IP 是远程 IP。因此从 B 端来看,本地端里面IP 为 192.168.255.2,远端内部 IP 为 192.168.255.1。同样,B 端的物理(外部)IP 为 10.52.100.200,A 端的物理(外部)IP 为 172.17.178.105。

检查配置

在 A 端,您应该看到:

# ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        options=80000<LINKSTATE>
        tunnel inet 172.17.178.105 --> 10.52.100.200
        inet6 fe80::7a2b:cbff:fe3a:f693%gif0 prefixlen 64 scopeid 0x8 
        inet 192.168.255.1 --> 192.168.255.2  netmask 0xffff0000 
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        groups: gif 

B 端gif0接口相同,但 IP 反转:

gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        options=80000<LINKSTATE>
        tunnel inet 10.52.100.200 --> 172.17.178.105
        inet 192.168.255.2 --> 192.168.255.1 netmask 0xffff0000
        groups: gif

从 A,您应该能够 ping 远程隧道端点的内部 IP:

# ping -c3 192.168.255.2
PING 192.168.255.2 (192.168.255.2): 56 data bytes
64 bytes from 192.168.255.2: icmp_seq=0 ttl=64 time=0.348 ms
64 bytes from 192.168.255.2: icmp_seq=1 ttl=64 time=0.394 ms
64 bytes from 192.168.255.2: icmp_seq=2 ttl=64 time=0.400 ms

--- 192.168.255.2 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.348/0.381/0.400/0.023 ms

同样,从 B 您应该能够到达隧道 A 端的内部 IP:

# ping -c3 192.168.255.1
PING 192.168.255.1 (192.168.255.1): 56 data bytes
64 bytes from 192.168.255.1: icmp_seq=0 ttl=64 time=0.342 ms
64 bytes from 192.168.255.1: icmp_seq=1 ttl=64 time=0.410 ms
64 bytes from 192.168.255.1: icmp_seq=2 ttl=64 time=0.383 ms

--- 192.168.255.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.342/0.378/0.410/0.028 ms

剩下唯一要做的事情就是在机器 B 上配置旧 IP 172.17.178.100。假设机器 B 的接口是 bge0。

# ifconfig bge0 add 172.17.178.100/32

现在,从机器 A(或者实际上任何机器),您应该能够 ping 172.17.178.100。

概括

在机器 A 上:

sysctl net.inet.ip.forwarding=1
# substitute Machine A's MAC address here:
arp -s 172.17.178.100 xx:xx:xx:xx:xx:xx pub

ifconfig gif0 create
ifconfig gif0        192.168.255.1 192.168.255.2
ifconfig gif0 tunnel 172.17.178.105 10.52.100.200

route add 172.17.178.100 192.168.255.2

在机器B上:

ifconfig gif0 create
ifconfig gif0        192.168.255.2 192.168.255.1
ifconfig gif0 tunnel 10.52.100.200 172.17.178.105
ifconfig bge0 add 172.17.178.100/32

备择方案

如果上述方法不是你想要的,你可以要求你的数据中心网络工程师为你提供聚合以太网端口。这将要求子网 A 和子网 B 可以通过不同的 VLAN 访问。请咨询您的网络工程师以了解情况。机器 B 需要具有 VLAN 感知网络适配器,并且需要调整网络配置以将 10.52.xx VLAN 与 172.17.178.x VLAN 分开配置。这样做的缺点是,这会给数据中心网络工程师带来成本,他们可能有时间或意愿来帮助您。另一方面,gif接口隧道方法需要外部协助,但需要允许计算机 A 在完成迁移期间保持在线并连接到子网 A。

答案3

松散的想法:

  1. 也许在 l3 交换机上设置路由就足够了
  2. 尝试使用 haproxy 作为网络之间的负载均衡器
  3. 使用第二个网络接口(或在同一接口上设置地址)并启动应用程序重新设计项目
  4. 设置第二个 oracle 并进行复制(开个玩笑,没人买第二甲骨文。我们都在学习)。

相关内容