如何判断 TCP 连接将在哪个接口上进行?

bro*_*s94 11 networking routing

我有一个带有多个以太网接口的服务器。判断传出 TCP 连接将通过哪个接口的最简单方法是什么?“netstat -rn”的结果对我来说是希腊语,所以如果你的回答是“查看本地路由表”,请详细清楚。

Lui*_*ado 13

对我来说,我可以使用netstat -rn或查看我在那里拥有的界面route -n

cyrex@cyrex:~$ netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.48.0.1      0.0.0.0         UG        0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
192.48.0.0      0.0.0.0         255.255.224.0   U         0 0          0 eth0
Run Code Online (Sandbox Code Playgroud)

或者 netstat -r

cyrex@cyrex:~$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         192-48-0-1.dyn. 0.0.0.0         UG        0 0          0 eth0
link-local      *               255.255.0.0     U         0 0          0 eth0
192.48.0.0      *               255.255.224.0   U         0 0          0 eth0
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都可以在末尾看到接口的名称,在这种情况下它是eth0

该命令给出的信息如下(来源在这里):

目标- 目标网络或目标主机。

网关- 网关地址,*如果没有设置。

Genmask - 目标网络的网络掩码。

 255.255.255.255 for the host destination.
 0.0.0.0 for the default route.  
Run Code Online (Sandbox Code Playgroud)

标志- 可能的标志包括:

 U (route is up)  
 H (target is a host)  
 G (using gateway)  
 R (reinstate route for dynamic routing)  
 D (dynamically installed by daemon or redirect)  
 M (modified from routing daemon or redirect)  
 A (installed by addrconf)  
 C (cache entry)  
 ! (reject route)  
Run Code Online (Sandbox Code Playgroud)

MSS - 此路由上 TCP 连接的默认最大段大小。

窗口- 此路由上 TCP 连接的默认窗口大小。

irtt - 初始 RTT(往返时间)。内核使用它来猜测最佳 TCP 协议参数,而无需等待(可能很慢)的答案。

Iface - 此路由的数据包将发送到的接口。

其他字段可以是:

指标- 到目标的距离(通常以跳数计)。最近的内核不使用它,但路由守护程序可能需要它。

Ref - 对该路线的引用次数。(未在 Linux 内核中使用。)

使用- 路由的查找次数。根据 -F 和 -C 的使用,这将是路由缓存未命中 (-F) 或命中 (-C)。

HH(仅缓存)- 引用缓存路由的硬件标头缓存的 ARP 条目和缓存路由的数量。如果缓存路由的接口(例如 lo)不需要硬件地址,则该值为 -1。

Arp(仅缓存)- 缓存路由的硬件地址是否是最新的。

现在到手头的问题。我现在记得的最简单的方法(一如既往,有几种方法可以做同样的事情)是使用iptraf. 只需安装它:

sudo apt-get install iptraf

并使用 root 权限运行它: sudo iptraf

iptraf选择IP Traffic Monitor的菜单中,然后选择All Interfaces。这应该会显示所有 TCP 连接以及它们与哪个接口相关。它是基于终端的,有利于监控目的。


zwe*_*ets 9

您可以使用该ip命令查询内核路由表。它的route get子命令会告诉你内核如何将数据包路由到目标地址:

 $ ip route get to 10.0.2.2
 10.0.2.2 dev eth0  src 10.0.2.15
Run Code Online (Sandbox Code Playgroud)

然而

$ ip route get to 192.168.3.5
192.168.3.5 via 10.0.2.2 dev eth0  src 10.0.2.15
Run Code Online (Sandbox Code Playgroud)

$ ip route get to 127.0.1.1
local 127.0.1.1 dev lo  src 127.0.0.1
Run Code Online (Sandbox Code Playgroud)