我嘗試使用 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
我該如何解決?
uj5u.com熱心網友回復:
首先,我有一種強烈的預感,您實際上正在使用 WSL1 實體。首先用 . 仔細檢查wsl.exe -l -v。
安裝/啟用 WSL2 但仍然有從未轉換為 WSL2 的 WSL1 實體是很常見的。
有幾件事表明這是 WSL1:
你有一個
eth1介面——WSL2 通常沒有,因為它只設定一個虛擬以太網設備供 Linux 內核使用。另一方面,WSL1 使用 Windows API(通過系統呼叫轉換層)來列舉 Windows 可用的實際網路介面。
該錯誤訊息
OSError: [Errno 97] Address family not supported by protocol僅在 WSL1 上可見。系統呼叫轉換層不提供所有 Linux API 的完整實作,網路介面配置是未完全實作的一個領域。
因此,至少,您需要轉換為 WSL2 才能使其正常作業。假設 WSL2 已實際安裝并在您的系統上可用,您可以通過以下方式執行此操作:
- 退出 WSL
- 從 PowerShell:
- 使用 確認實體/發行版的名稱
wsl -l -v。 - (可選)備份現有實體
wsl --export distro_name path/to/backup.tar wsl --set-version <distro_name> 2
- 使用 確認實體/發行版的名稱
您仍然應該了解,在 WSL2 下,網路介面確實在具有所有功能的普通 Linux 內核下運行。但是,它是一個運行在經過 NAT 的虛擬交換機后面的虛擬化 NIC。目前對該開關沒有太多控制,盡管這在某種程度上正在發生變化。也就是說,第 3 層在 WSL2 中應該可以正常作業,盡管您當然需要確保適當的權限。例如,您問題中的示例代碼將需要sudo/root。
但是,無論如何,您都可以更好地控制真正的虛擬機中的網路。如果你在 WSL2 中遇到了太多的 scapy 障礙,那么我會考慮切換到這個特定的用例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/492899.html
標籤:python-3.x 插座 windows-subsystem-for-linux 狡猾的 wsl-2
