在linux下怎么获得 局域网各个ip,端口的流量速率和流量

在linux下怎么获得 局域网各个ip,端口的流量速率和流量,第1张

Linux下是没有文件直接给你按进程记录流量信息的。你想要编程实现的话,办法是有的,只是比较麻烦。首先,你需要能截取流经网卡的数据包,这个可以通过libpcap来完成,其次你要完成的最重要的一步就是怎么根据端口号找到进程的pid。端口号通过截取的数据包可以获得,这个时候你要按行来解析/proc/net/tcp (如果要支持ipv6的话还要解析/proc/net/tcp6),这个文件记录了当前活跃的TCP连接情况,每一行代表一条连接,我们感兴趣的是其中的inode这一项,你得把inode的值解析出来保存。然后蛋疼的时候来了,接下来你得遍历所有的/proc/pid/fd文件,察看其中每一个文件描述符,如果发现内容为socket[xxxx]的,把xxxx截取出来,这个xxxx也是inode号,如果和你之前解析/proc/net/tcp的inode号吻合,恭喜你,这说明这个pid和那个tcp连接有关系,进而也就确定了端口号和pid的对应关系,也就知道了数据包和进程之间的对应关系了。

配置网卡

建立一台虚拟机,并安装完成后以桥接的方式在虚拟机上面添加两张网卡。分别为eth0和eth1。

eth0: a.b.c.d(外网的上网地址)

eth1: 172.16.44.1(做为内网的网关)

Tip

原先我使用eth0:0的这种虚拟网卡的形式去配置一直不成功,后来使用双网卡的时候一直忘了把eth0:0这张虚拟网卡删掉导致了限速配置一直不成功,浪费了大把的青葱。

配置iptables nat

#开启ip_forward

echo "1">/proc/sys/net/ipv4/ip_forward

#清除原来的防火墙规则

iptables -F

iptables -t nat -F

iptables -t mangle -F

#添加nat转发

iptables -t nat -A POSTROUTING -s 172.16.44.0/24 -o eth0 -j MASQUERADE

通过执行上面的代码后,局域网内的电脑就可以上网了。

端口转发

由于我的内网还挂了网站,所以要开启80端口的转发。

iptables -t nat -I PREROUTING -p tcp -d a.b.c.d --dport 80 -j DNAT --to 172.16.44.210:80

iptables -t nat -I POSTROUTING -p tcp -d 172.16.44.210 --dport 80 -j SNAT --to 172.16.44.1

这条命令指定外网地址a.b.c.d的80端口转发到172.16.44.210:80上。由于是双网卡,所以需要做一下回路。

下载限速

下载限速要在eth1上面做,判断数据包的目的地址来做限制。tc包括三部分:队列、类、过滤器。我使用了htb方式去限制速度,也可以使用cbq,但cbq配置比较复杂一点,而且据说性能没htb好。

#删除原来的tc规则队列

tc qdisc del dev eth1 root

#添加tc规则队列

tc qdisc add dev eth1 root handle 10: htb default 256

#生成根类

tc class add dev eth1 parent 10: classid 10:1 htb rate 100mbit ceil 100mbit

#支类列表用于限制速度

#这里的rate指的是保证带宽,ceil是最大带宽。

tc class add dev eth1 parent 10:1 classid 10:10 htb rate 400kbps ceil 400kbps prio 1

#添加支类规则队列

#采用sfq伪随机队列,并且10秒重置一次散列函数。

tc qdisc add dev eth1 parent 10:10 handle 101: sfq perturb 10

#建立网络包过滤器,设置fw。

tc filter add dev eth1 parent 10: protocol ip prio 10 handle 1 fw classid 10:10

#在iptables里面设定mark值,与上面的handle值对应。

iptables -t mangle -A POSTROUTING -d 172.16.44.130 -j MARK --set-mark 1

通过上面的代码就可以限制172.16.44.130这台机子的下载速度到400kbps。

Tip

经过实际测试这里的kbps实际上就是KB/S每秒千字节。另一个单位是kbit,这个才是每秒千比特。这里的172.16.44.130也可以写成一个网段,比如:172.16.44.0/24

上传限速

上传限速的原理其实跟下载的差不多,只不过限制的网卡不同,要在eth0上过滤来源地址去限制。

#删除原来的tc规则队列

tc qdisc del dev eth0 root

#添加tc规则队列

tc qdisc add dev eth0 root handle 20: htb default 256

#生成根类

tc class add dev eth0 parent 20: classid 20:1 htb rate 100mbit ceil 100mbit

#支类列表用于限制速度

tc class add dev eth0 parent 20:1 classid 20:10 htb rate 40kbps ceil 40kbps prio 1

#添加支类规则队列

tc qdisc add dev eth0 parent 20:10 handle 201: sfq perturb 10

#建立网络包过滤器

tc filter add dev eth0 parent 20: protocol ip prio 100 handle 2 fw classid 20:10

iptables -t mangle -A PREROUTING -s 172.16.44.130 -j MARK --set-mark 2

Tip

跟下载不同的是POSTROUTING要改成PREROUTING,-d改成-s。

观察连接数

通过iptables的nat连接可以通过下面的代码查看。至于统计连接数可以写代码实现,也可以利用awk,grep等工具。反正里面的内容就是文本,处理起来也比较简单。

cat /proc/net/ip_conntrack

写在结尾

到此上网、端口转发和流量限制都已经实现。下次再考虑配置个dhcp server和dnsmasq。至于一些路由器其它诸如mac地址绑定,限制上网等用到的时候再去研究研究。

在类Unix系统中可以使用top查看系统资源、进程、内存占用等信息。查看网络状态可以使用netstat、nmap等工具。若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop。

iftop类似于top的实时流量监控工具,可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等。

查看流量是从哪些端口发送出去的:

# iftop -P

-P 选项会在iftop 的输出结果中开启端口显示

界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。

中间的<= =>这两个左右箭头,表示的是流量的方向。

TX:发送流量

RX:接收流量

TOTAL:总流量

Cumm:运行iftop到目前时间的总流量

peak:流量峰值

rates:分别表示过去 2s 10s 40s 的平均流量

要找到运行在该端口的进程,那么可以用netstat 或者lsof 来找到相应的进程。

使用netstat 命令来找到运行在10910这个端口上的进程:

# netstat -tunp | grep 10910

可以使用lsof 命令来找到运行在10909这个端口上的进程:

# lsof -i:10909

查看进程PID为51919的应用程序:

# ps -ef |grep 51919


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7505804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存