Firewall UDP Port freigeben

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    Firewall UDP Port freigeben

    Hallo und frohe Ostern,
    ich kommuniziere hier in meinem Programm, im Netzwerk ohne Router dazwischen, mit einem Sensor der sich über TCP steuern lässt und Daten über UDP an mein Programm sendet.
    Bei der ersten Verbindung kommt ein Fenster (Firewall) hoch in dem man die eingehende Verbindung freigeben soll.
    Das würde ich gerne automatisieren.
    In meinem Programm kann man den UDP Port einstellen, von daher würde ich nicht nur die Freigabe steuern sondern auch gleich die alte Freigabe löschen oder abändern damit immer nur der aktuell eingestellt Port freigegeben ist.
    Kann mir Jemand erklären wie man eine UDP Port Freigabe für seine eigen Applikation erstelle und ändern oder löschen kann?

    Vielen Dank vorab, und viel Erfolg beim Eiersuchen. :D

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Habe wohl ein Problem mit dem inboundRule Objekt.
    Einige Felder sind "NULL" Nothing, unter anderem auch 'LocalPorts', deshalb bekomme ich bei der Zuweisung ein Exception.
    Weis Jemand wie ich den Port in das Objekt bekomme?

    VB.NET-Quellcode

    1. Public Shared Sub Add(ruleName As String, port As Integer)
    2. Dim inboundRule As INetFwRule2 = CType(Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule")), INetFwRule2)
    3. inboundRule.Enabled = True
    4. inboundRule.Name = ruleName
    5. inboundRule.LocalPorts = port.ToString '<-
    6. inboundRule.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP
    7. inboundRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN
    8. inboundRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW
    9. inboundRule.Profiles = NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_ALL
    @Naifu Bist Du sicher, dass da ein String eingetragen werden muss?
    Was wird denn da erwartet?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Naifu OK.
    Was ist denn das für ein Port?
    Bei UDP würde ich iwie eine TCP-Adresse sehen, die lässt sich aber nicht mit einem Integer beschreiben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    OK, dann das hier versucht:

    VB.NET-Quellcode

    1. inboundRule.LocalPorts = "0.0.0.0:1234" ' port.ToString

    Geht aber auch nicht.
    Ich wüsste auch nicht was die IP in LocalPorts zu suchen hätte.
    Dann, nach deinem Hinweis noch versucht die inboundRule.LocalAddresses zu setzen.
    Das geht, aber er nimmt den Port nicht
    Bei allen andern Feldern ist es kein Problem mit dem String.
    Die Exception lautet:
    System.ArgumentException: "Der Wert liegt außerhalb des erwarteten Bereichs."
    Habe es dann auch mit Ports oberhalb von 1024 versucht.
    Kein Erfolg.

    Edit:
    Habe nun mit dem Code mir die aktuellen Rules ausgeben lassen.
    Da ist LocalPorts eindeutig ein String, als LocalIP ist "*" eingetragen.
    Das hilft aber auch nicht, das Feld LocalPorts lasst sich nicht zuweisen.

    VB.NET-Quellcode

    1. Public Shared Sub Test(ByVal Optional RuleName As String = "Test")
    2. Try
    3. Dim tNetFwPolicy2 As Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2")
    4. Dim fwPolicy2 As INetFwPolicy2 = CType(Activator.CreateInstance(tNetFwPolicy2), INetFwPolicy2)
    5. Dim currentProfiles As Integer = fwPolicy2.CurrentProfileTypes
    6. Dim RuleList As List(Of INetFwRule2) = New List(Of INetFwRule2)()
    7. Dim rule As INetFwRule
    8. Dim i As Integer = 0
    9. For Each rule In fwPolicy2.Rules
    10. If rule.Name.IndexOf(RuleName) <> -1 Then
    11. 'Dim firewallPolicy As INetFwPolicy2 = CType(Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")), INetFwPolicy2)
    12. 'firewallPolicy.Rules.Remove(rule.Name)
    13. i = i + 1
    14. End If
    15. Next
    16. If i <> 0 Then
    17. MsgBox(RuleName & " has been deleted from Firewall Policy")
    18. End If
    19. Catch r As Exception
    20. MsgBox(r.Message)
    21. End Try
    22. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Naifu“ ()

    Naifu schrieb:

    Ich wüsste auch nicht was die IP in LocalPorts zu suchen hätte.
    Keine Ahnung.
    Wie wäre es mit "1234" aus Deinem Beispiel?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Naifu schrieb:

    Ich wüsste auch nicht was die IP in LocalPorts zu suchen hätte.
    Keine Ahnung.
    Wie wäre es mit "1234" aus Deinem Beispiel?

    Sorry, verstehe ich nicht, sehe ich den Wald vor lauter Bäumen nicht mehr?
    Kannst du das bitte erläutern?
    Es könnte zwar durchaus sein, das mein Wissensstand nicht ganz ausreicht um genau zu verstehen was du erreichen möchtest, aber wenn es lediglich darum geht einen UDP-Port als Offen in der Windowseigenen Firewall zu hinterlegen:

    VB.NET-Quellcode

    1. Public Shared Sub AddRule(ByVal ruleName As String, ByVal udpPort As String)
    2. Dim policy = CreatePolicy()
    3. Dim rule = CreateRule()
    4. rule.Name = ruleName
    5. rule.Enabled = True
    6. rule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW
    7. rule.Profiles = CInt(NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_ALL)
    8. rule.Protocol = CInt(NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP)
    9. rule.LocalPorts = udpPort
    10. policy.Rules.Add(rule)
    11. End Sub
    12. Private Shared Function CreatePolicy() As INetFwPolicy2
    13. Return CType(Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")), INetFwPolicy2)
    14. End Function
    15. Private Shared Function CreateRule() As INetFwRule2
    16. Return CType(Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule")), INetFwRule2)
    17. End Function


    Aufrufen einfach mit dem Namen den du der Regel verpassen willst und dem Port

    VB.NET-Quellcode

    1. AddRule("testRuleMKE2", "8090")



    Nachtrag: Die App oder während der Entwicklung das VisualStudio müssen als Admin gestartet werden sonst schmierts ab
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @asusdk
    Das ist schön kurz und knackig. :thumbsup:
    Vielen Dank!

    Habe nun auch raus bekommen warum mein Code nicht funzt. :D
    Das hier geht nicht:

    VB.NET-Quellcode

    1. inboundRule.LocalPorts = port.ToString
    2. inboundRule.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP



    Aber so geht es

    VB.NET-Quellcode

    1. inboundRule.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP
    2. inboundRule.LocalPorts = port.ToString


    Die Reihenfolge ist entscheidend.

    Naifu schrieb:

    Kannst du das bitte erläutern?

    VB.NET-Quellcode

    1. inboundRule.LocalPorts = "0.0.0.0:1234" ' port.ToString
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nachtrag:

    Hab noch etwas damit herumgespielt und falls jemand mal auf den Thread stößt wäre evtl. auch das Entfernen von freigaben relevant, deshalb füg ich das noch an:

    VB.NET-Quellcode

    1. Public Shared Sub RemoveRule(ByVal ruleName As String)
    2. Dim policy = CreatePolicy()
    3. policy.Rules.Remove(ruleName)
    4. End Sub
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If