OS: Arch Linux
Network Manager: Netctl
我正在尝试编写一个 bash 脚本,该脚本将禁用所有当前网络连接并关闭系统上的 wifi。我目前有以下内容,但运行 netstat 后,它似乎没有断开我当前的 TCP 连接。
alias wifioff='sudo netctl stop wlp3s0-network' # Stop WiFi
我应该如何终止此脚本中的所有活动连接?我假设我只需要使用 TCP 连接来执行此操作,因为 UDP 将是无连接的......对吗?
答案1
关闭网络接口通常不会导致 TCP 连接终止。这就是 TCP/IP 的设计方式。这个想法是,断开的链路不应导致上层放弃连接,因为问题可能是暂时的并很快消失,或者路由协议可能会立即安装备用路由并以这种方式修复网络。考虑拔掉以太网电缆几秒钟,然后将其重新插入:通过以太网电缆主动传输数据的 TCP 会话将丢失一些数据包,引发一些短暂的超时,并在电缆断开后快速恢复(可能在进行慢启动后)已恢复。要改变这一点,TCP 就会变得非常脆弱,因为每一个小小的网络故障都会对受影响的 TCP 会话造成致命的影响。
话虽这么说,您仍然希望通过 shell 脚本手动终止活动的 TCP 连接。恐怕 Linux 中没有明显的接口来查找 TCP 连接并强制它们终止。
我能想到的一种方法是发起假RST
数据包(例如通过 tun/tap 接口)来欺骗内核,使其认为另一端已终止连接。这是一项艰巨的工作,因为您必须设置 tun/tap 接口(或其他将数据包注入内核的方法),找到正确的远程 IP 地址、端口号和欺骗的 TCP 序列号,并手动构建IP 和 TCP 标头!
谷歌搜索揭示了一点这个方法使用tcpkill
。也许这对你有用。