我try 使用Scapy配置L3套接字,如:

from scapy.all import *
soc = conf.L3socket(iface="eth1")

当我在Ubuntu VM中使用此代码时,一切都正常,但当我在WSL中使用此代码时,我遇到了一个错误:

/usr/local/lib/python3.10/dist-packages/scapy/layers/ipsec.py:471: CryptographyDeprecationWarning: Blowfish has been deprecated
  cipher=algorithms.Blowfish,
/usr/local/lib/python3.10/dist-packages/scapy/layers/ipsec.py:485: CryptographyDeprecationWarning: CAST5 has been deprecated
  cipher=algorithms.CAST5,
Traceback (most recent call last):
  File "........./python/test.py", line 2, in <module>
    soc = conf.L3socket(iface="eth1")
  File "/usr/local/lib/python3.10/dist-packages/scapy/arch/linux.py", line 486, in __init__
    self.ins = socket.socket(
  File "/usr/lib/python3.10/socket.py", line 232, in __init__
    _socket.socket.__init__(self, family, type, proto, fileno)
OSError: [Errno 97] Address family not supported by protocol

我怎样才能解决这个问题?

推荐答案

首先,我有一种强烈的预感,您实际上正在使用WSL1实例.首先用wsl.exe -l -v再次判断.

安装/启用WSL2很常见,但仍然有从未转换为WSL2的WSL1实例.

有几件事表明这是WSL1:

  • 您有一个eth1接口——WSL2通常没有,因为它只设置了one个虚拟以太网设备供Linux内核使用.

    另一方面,WSL1使用Windows API(通过系统调用转换层)枚举Windows可用的实际网络接口.

  • 错误消息OSError: [Errno 97] Address family not supported by protocol仅在WSL1上可见.系统调用转换层并没有提供所有Linux API的完整实现,网络接口配置是一个没有完全实现的领域.

因此,至少需要将其转换为WSL2才能工作.假设WSL2已在您的系统上实际安装并可用,您可以通过以下方式完成此操作:

  • 正在退出WSL
  • From PowerShell:
    • wsl -l -v确认实例/发行版的名称.
    • (可选)使用wsl --export distro_name path/to/backup.tar备份现有实例
    • wsl --set-version <distro_name> 2

您仍然应该理解,在WSL2下,网络接口does在具有所有功能的普通Linux内核下运行.然而,它是一个运行在NAT虚拟交换机后面的虚拟NIC.目前没有much个控制switch ,尽管有that's changing to some degree个.这就是说,第3层在WSL2中应该可以正常工作,当然,您需要确保拥有适当的权限.例如,问题中的示例代码需要sudo个/根.

无论如何,在真正的虚拟机中,您将对网络有更多的控制.如果您在WSL2中遇到太多的scapy障碍,那么我会考虑切换到这个特定的用例.

Python-3.x相关问答推荐

文件名中的文件打开和撇号

在 Python 中比较和排序列之间的值(带有不匹配列)

Django在POST到外部URL时如何进行CSRF保护? 更新

两个 y 轴在零处对齐的 plotly barplot

pytorch 中 mps 设备的 manual_seed

python 3.10.5 中可能存在的错误. id 函数工作不明确

删除重复项,但将值相加为一

在气流中运行 DAG 时出现处理信号:ttou消息

两个Pandas数据框中的共同列列表

Python:如何在三个列表中找到共同值

如何为 Python 中的线程设置异步事件循环?

为什么 Django South 1.0 使用 iteritems()?

'~'(波浪号)运算符在 Python 中的应用

Python图例属性错误

迭代dict值

Anaconda 中的依赖项和包冲突?

定义 True,如果没有定义,会导致语法错误

将 args、kwargs 传递给 run_in_executor

根据条件过滤元组列表

警告:请使用 tensorflow/models 中的官方/mnist/dataset.py 等替代方案