我正在尝试从 Docker 容器内部 ping IPv4 和 IPv6 地址。
我已经尝试过使用
ping3
,但不支持IPv6
>>> from ping3 import ping
>>> v4 = ping("142.250.185.110")
>>> v6 = ping("2a00:1450:4001:831::200e")
>>> print(v4)
0.003611326217651367
>>> print(v6)
False
我还尝试使用
multiping
,它返回无效 IP 地址的响应时间(例如,来自我的 docker 容器内的 1.2.3.4
)
mp = MultiPing([server_address])
mp.send()
responses, no_responses = mp.receive(timeout)
print(server_address + " " + str(responses))
# 1.2.3.5 {'1.2.3.5': 0.004548549652099609}
# 1.2.3.4 {'1.2.3.4': 0.004738330841064453}
是否有一种良好且可靠的方法来 ping IPv4 和 IPv6 地址(包括响应时间)?
scapy
from scapy.all import sr1, IP, ICMP, IPv6, ICMPv6EchoRequest, conf
def _ping_v4(address: str, timeout: int = 5) -> float:
packet = IP(dst=address) / ICMP()
start_time = time.time()
response = sr1(packet, timeout=timeout, verbose=0)
if response is None:
return -1.0
return (time.time() - start_time) * 1000
def _ping_v6(address: str, timeout: int = 5) -> float:
packet = IPv6(dst=address) / ICMPv6EchoRequest()
start_time = time.time()
response = sr1(packet, timeout=timeout, verbose=0)
if response is None:
return -1.0
return (time.time() - start_time) * 1000