瀏覽代碼

Filter invalid IPs on external interface matching (#11766)

gnattu 1 年之前
父節點
當前提交
2eece01acc
共有 2 個文件被更改,包括 21 次插入1 次删除
  1. 5 0
      MediaBrowser.Common/Net/NetworkConstants.cs
  2. 16 1
      src/Jellyfin.Networking/Manager/NetworkManager.cs

+ 5 - 0
MediaBrowser.Common/Net/NetworkConstants.cs

@@ -58,6 +58,11 @@ public static class NetworkConstants
     /// </summary>
     public static readonly IPNetwork IPv4RFC1918PrivateClassC = new IPNetwork(IPAddress.Parse("192.168.0.0"), 16);
 
+    /// <summary>
+    /// IPv4 Link-Local as defined in RFC 3927.
+    /// </summary>
+    public static readonly IPNetwork IPv4RFC3927LinkLocal = new IPNetwork(IPAddress.Parse("169.254.0.0"), 16);
+
     /// <summary>
     /// IPv6 loopback as defined in RFC 4291.
     /// </summary>

+ 16 - 1
src/Jellyfin.Networking/Manager/NetworkManager.cs

@@ -903,6 +903,17 @@ public class NetworkManager : INetworkManager, IDisposable
         return false;
     }
 
+    /// <summary>
+    ///  Get if the IPAddress is Link-local.
+    /// </summary>
+    /// <param name="address">The IP Address.</param>
+    /// <returns>Bool indicates if the address is link-local.</returns>
+    public bool IsLinkLocalAddress(IPAddress address)
+    {
+        ArgumentNullException.ThrowIfNull(address);
+        return NetworkConstants.IPv4RFC3927LinkLocal.Contains(address) || address.IsIPv6LinkLocal;
+    }
+
     /// <inheritdoc/>
     public bool IsInLocalNetwork(IPAddress address)
     {
@@ -1084,7 +1095,11 @@ public class NetworkManager : INetworkManager, IDisposable
     private bool MatchesExternalInterface(IPAddress source, out string result)
     {
         // Get the first external interface address that isn't a loopback.
-        var extResult = _interfaces.Where(p => !IsInLocalNetwork(p.Address)).OrderBy(x => x.Index).ToArray();
+        var extResult = _interfaces
+            .Where(p => !IsInLocalNetwork(p.Address))
+            .Where(p => p.Address.AddressFamily.Equals(source.AddressFamily))
+            .Where(p => !IsLinkLocalAddress(p.Address))
+            .OrderBy(x => x.Index).ToArray();
 
         // No external interface found
         if (extResult.Length == 0)