Linux 上的自訂 Ping 承載
在 Linux 上,未獲授權的流程無法傳送原始 IP 封包。 Ping 功能必須藉由連接 ping
公用程式來實作。 不過,此公用程式並不支援指定網際網路控制訊息通訊協定 (ICMP) ping 封包的自訂承載。 .NET 7 會新增這類案例的檢查,並在指定自訂承載時擲回例外狀況。
先前的行為
在舊版中,ping 封包承載會在未獲授權的 Linux 流程中以無訊息方式忽略 (也就是說,不會傳送它)。
新的行為
從 .NET 7 開始,如果您嘗試在未獲授權的 Linux 流程中傳送自訂 ping 封包承載,就會擲回 PlatformNotSupportedException。
導入的版本
.NET 7
中斷性變更的類型
這項變更會影響二進位相容性。
變更原因
最好是向使用者發出訊號,指出無法執行作業,而不是以無訊息方式卸除承載。
建議的動作
如果需要 Ping 承載,請以 root
身分執行應用程式,或使用 setcap
公用程式授與 cap_net_raw
功能權限。
否則,請使用 Ping.SendPingAsync 的多載,不接受自訂承載或傳入空陣列。
受影響的 API
- System.Net.NetworkInformation.Ping.Send(IPAddress, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.Send(IPAddress, Int32, Byte[])
- System.Net.NetworkInformation.Ping.Send(String, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.Send(String, Int32, Byte[])
- System.Net.NetworkInformation.Ping.SendAsync(IPAddress, Int32, Byte[], PingOptions, Object)
- System.Net.NetworkInformation.Ping.SendAsync(IPAddress, Int32, Byte[], Object)
- System.Net.NetworkInformation.Ping.SendAsync(String, Int32, Byte[], PingOptions, Object)
- System.Net.NetworkInformation.Ping.SendAsync(String, Int32, Byte[], Object)
- System.Net.NetworkInformation.Ping.SendPingAsync(IPAddress, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.SendPingAsync(IPAddress, Int32, Byte[])
- System.Net.NetworkInformation.Ping.SendPingAsync(String, Int32, Byte[], PingOptions)
- System.Net.NetworkInformation.Ping.SendPingAsync(String, Int32, Byte[])