在移动服务器之前记录网络连接?

在移动服务器之前记录网络连接?

我们正在升级旧的数据库服务器,但想确保更新连接到该服务器的所有其他服务器上的代码。我正在考虑镜像网络端口并记录连接到该服务器的 IP 地址。我考虑过在服务器本身上启用日志记录,但我不想影响其性能,因为它仍在生产中。

有没有推荐的软件可以用来记录 IP 地址?可以是 Windows、Linux、FreeBSD、VM、LiveCD 或其他软件。只要它能在 x86 兼容的机器上运行,我就应该能够运行它。

答案1

数据库服务器本身运行的是什么操作系统?如果是 Linux,您可以在本地防火墙配置中添加一条日志记录规则,对服务器的影响最小。类似以下内容:

iptables -A INPUT -m state --state NEW -p tcp --dport <yourdbport> -j LOG --log-prefix "[database] "

您可以添加-m limit --limit 4/s限制此规则以仅记录 4 次/秒(等等),如果连接速率很高,这将防止它占用所有 IO。这将记录如下行到 syslog:

[database] IN=eth0 OUT= MAC=00:16:3c:21:7c:f1:00:d0:00:6f:8c:00:08:00 SRC=a.b.c.d
  DST=w.x.y.z LEN=48 TOS=0x00 PREC=0x00 TTL=114 ID=16448 DF PROTO=TCP SPT=59871
  DPT=5900 WINDOW=8192 RES=0x00 SYN URGP=0 

您想要的信息就是该SRC=字段。

如果您设置了单独的 Linux(或 FreeBSD)系统来接收来自镜像端口的流量,则可以使用它tcpdump来记录 IP 地址。例如:

tcpdump -w record_of_connections -i eth0 \
  dst port <yourdbport> and 'tcp[tcpflags] & tcp-syn != 0'

这将匹配所有到端口的数据包您的数据库端口设置了 SYN 标志的数据包(例如,它们是新的连接尝试)。对文件运行此操作后,您可以像这样提取 IP 地址:

tcpdump -r record_of_connections -n

这将产生如下行:

15:07:40.808035 IP 10.243.16.190.53967 > 10.243.18.22.http: Flags [S], 
  seq 1235802021, win 5840, options [mss 1380,sackOK,TS val 3739192250 
  ecr 0,nop,wscale 7], length 0

其中字段为:

<time> <protocol> <src_addr>.<src_port> > <dest_addr>.<dest_port>: ...

这意味着你可以像这样获取源 IP 地址:

tcpdump -r record_of_connections -n |
 awk '{print $3}' |
 sed 's/\.[^.]*$//' |
 sort -u

sort -u会为您提供一个唯一的地址列表。

相关内容