Linux之NAT和状态防火墙及外部IP连接状态之谁在占用带宽

需求概述

国内很多场景都是局域网外加NAT路由器来实现的上网。最近公司网上总是卡顿,公司网络大致拓扑结构如下:


公司内网->交换机->路由器网关->公网

路由器网关使用的系统为:Openwrt,某日发现网络巨卡,在Openwrt命令行网关上面iftop命令查看:
iftop -P -m 100m
image-20200903134706409

比如这条,观察了一下,192.168.0.1是网关,对端IP为:115.236.131.93:443
现在我要查询192.168.0.1:2050 这个端口是给内网的哪个IP转发的,为后续的维护做准备。
经过多方查找资料,测试发现,现有的方法比如tcpdump,netstat,netcat,iptables -t nat -nvL 基本上都无法实现。

如果是华为或者思科路由器可以使用:show ip nat translations [verbose],很明显我们的Linux暂时不适用。

最后在这个站点上面:https://www.cyberciti.biz/faq/display-iptables-router-nat-connections-using-netstat-nat/


找到了两种解决办法:

方法一、用netstat-nat命令

​ 需要安装软件:

Centos7系统安装netstat-nat

yum install http://repo.iotti.biz/CentOS/7/x86_64/netstat-nat-1.4.10-1.x86_64.rpm -y

参考资料:https://www.tweegy.nl/projects/netstat-nat/

Debian系统安装netstat-nat

sudo apt-get install netstat-nat

netstat 命令帮助
如何使用netstat-nat命令?
以root用户身份登录并键入以下内容以显示所有整理的连接的列表:
# netstat-nat -n

要显示带有协议选择的NAT连接,请输入:
# netstat-nat -np

要显示所有名为192.168.1.100的源IP的连接,
# netstat-nat -s 192.168.1.100

要显示所有目标IP /称为笔记本电脑的主机名的连接,请输入:
# netstat-nat -s laptop

要显示SNAT连接,请输入:
# netstat-nat -S

要显示DNAT连接,请输入:
# netstat-nat -D

方法二、免安装查看NAT连接

由于网关设备一般很重要,安装软件一般行不通,由于是Linux,使用现有的系统文件也可以间接的达成目的,办法是:

使用/proc/net/ip_conntrack

/proc/net/nf_conntrack(经确认此文件是有的)
,这是netfilter的临时conntrack存储。

这里我们按照第二个办法,匹配一下上图出现的192.168.0.1:2050端口,在/proc/net/nf_conntrack这个文件中匹配2050,
结果如下图:

image-20200903140323962

结果有多条,其中同时存在TCP和UDP连接,
TCP有状态ESTABLISHED,
UDP无状态。
iftop一般查看的是TCP连接,
找到sport端口是2020的,TCP连接,经确认本地内网地址为192.168.30.33。

至此确认IP为:192.168.30.33。后面就好办了使用arp找到目标MAC。后续工作就好进展了。

小结:此办法适用于任何基于Linux类系统的网关,代理节点上面。操作方法基本一致。


参考资料

具体的linux系统nat网络连接状态映射参见以下资料:
有用的参考资料:
1、linux 连接跟踪nf_conntrack 与 NAT和状态防火墙

本文链接:目录"--EOF--