Firewall-Einstellungen für self-hosted .Net Webservice
Hallo Community,
ich habe in Visual Studio 2017 ein Testprojekt für einen self-hosted .Net Webservice erstellt (Programmiersprache C#, SOAP basiert), der als Windows-Dienst läuft. Dazu gehört eine Controller-Applikation, über die bestimmte Konfigurationsparameter des Webservices gesetzt werden sollen.
Der Webservice hat mehrere URLs. Eine dient dazu Daten abzufragen, die der Webservice aus einer MS SQL Server Datenbank liest. Über die andere URL liest und schreibt die Controller-Applikation die Verbindungsdaten für den SQL Server, aus dem der Webservice die Daten lesen soll.
Wenn Webservice und Controller-Applikation auf dem gleichen Rechner laufen funktioniert das alles wunderbar. Liegen die beiden Programme jedoch auf verschiedenen Rechnern (beide VMs mit Windows 7) kommt der Kontakt zwischen Controller und Webservice nur zustande, wenn ich entweder die Windows Firewall auf der VM mit dem Webservice ausschalte oder eine eingehende Regel definiere, die alle TCP-Ports freischaltet. Wenn ich in der Firewall-Regel als weitere Einschränkung "Gilt nur für die EXE des Webservice" setze, kommt keine Verbindung zustande. Auch wenn ich stattdessen die Einschränkung "Gilt nur für den Windows-Dienst des Webservices" setze, funktioniert es nicht.
Da es sicherheitstechnisch natürlich eine Katastrophe ist, einfach alle TCP-Ports freizuschalten, würde ich jetzt gerne wissen, wie ich die Firewall konfigurieren muss, um nur TCP-Verbindungen zu meinem Webservice zu erlauben.
Ein Port-Range ist übrigens keine Option, da der Kommunikationsport zwischen Controller und Webservice ebenfalls über den Controller einstellbar sein soll. Wenn der Port geändert wird, schickt der Controller dem Webservice eine entsprechende Nachricht, der speichert die Port-Nummer in seiner Konfigurationsdatei, schließt die vorhandenen Netzwerkverbindungen und durchläuft dann seine Startup-Sequenz, in der er die Konfigurationsdatei einließt und dementsprechende Netzwerkverbindungen öffnet. Der Controller verhält sich nach einem ähnlichen Muster und somit "kommen die beiden wieder zusammen".
Grüße
Friemler
ich habe in Visual Studio 2017 ein Testprojekt für einen self-hosted .Net Webservice erstellt (Programmiersprache C#, SOAP basiert), der als Windows-Dienst läuft. Dazu gehört eine Controller-Applikation, über die bestimmte Konfigurationsparameter des Webservices gesetzt werden sollen.
Der Webservice hat mehrere URLs. Eine dient dazu Daten abzufragen, die der Webservice aus einer MS SQL Server Datenbank liest. Über die andere URL liest und schreibt die Controller-Applikation die Verbindungsdaten für den SQL Server, aus dem der Webservice die Daten lesen soll.
Wenn Webservice und Controller-Applikation auf dem gleichen Rechner laufen funktioniert das alles wunderbar. Liegen die beiden Programme jedoch auf verschiedenen Rechnern (beide VMs mit Windows 7) kommt der Kontakt zwischen Controller und Webservice nur zustande, wenn ich entweder die Windows Firewall auf der VM mit dem Webservice ausschalte oder eine eingehende Regel definiere, die alle TCP-Ports freischaltet. Wenn ich in der Firewall-Regel als weitere Einschränkung "Gilt nur für die EXE des Webservice" setze, kommt keine Verbindung zustande. Auch wenn ich stattdessen die Einschränkung "Gilt nur für den Windows-Dienst des Webservices" setze, funktioniert es nicht.
Da es sicherheitstechnisch natürlich eine Katastrophe ist, einfach alle TCP-Ports freizuschalten, würde ich jetzt gerne wissen, wie ich die Firewall konfigurieren muss, um nur TCP-Verbindungen zu meinem Webservice zu erlauben.
Ein Port-Range ist übrigens keine Option, da der Kommunikationsport zwischen Controller und Webservice ebenfalls über den Controller einstellbar sein soll. Wenn der Port geändert wird, schickt der Controller dem Webservice eine entsprechende Nachricht, der speichert die Port-Nummer in seiner Konfigurationsdatei, schließt die vorhandenen Netzwerkverbindungen und durchläuft dann seine Startup-Sequenz, in der er die Konfigurationsdatei einließt und dementsprechende Netzwerkverbindungen öffnet. Der Controller verhält sich nach einem ähnlichen Muster und somit "kommen die beiden wieder zusammen".
Grüße
Friemler
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 382470
Url: https://administrator.de/contentid/382470
Ausgedruckt am: 03.12.2024 um 17:12 Uhr
6 Kommentare
Neuester Kommentar
Ohne das du genau weisst WELCHE Ports deine Applikationen genau nutzen kommen wir hier logischerweise keinen Schritt weiter !
Wie auch, denn wir könnten ja auch nur die Glaskugel befragen:
Also...
schmeiss den Wireshark an und sieh dir die Kommunikation zwischen den Diensten genau an, dann bist du (und wir) schlauer und können dir zielführend helfen.
Ports wie TCP/UDP 53 (DNS), TCP 80 (HTTP), TCP 443 (HTTPS) dürften ja Standard sein aber was SQL und Controller verwenden musst du schon genau sagen können.
Der Kabelhai ist hier dein bester Freund !
Wie auch, denn wir könnten ja auch nur die Glaskugel befragen:
Also...
schmeiss den Wireshark an und sieh dir die Kommunikation zwischen den Diensten genau an, dann bist du (und wir) schlauer und können dir zielführend helfen.
Ports wie TCP/UDP 53 (DNS), TCP 80 (HTTP), TCP 443 (HTTPS) dürften ja Standard sein aber was SQL und Controller verwenden musst du schon genau sagen können.
Der Kabelhai ist hier dein bester Freund !
Hallo Friemler,
das Problem und die Lösung hast Du korrekt beschrieben.
Bei den C#-Sachen ist es leider so, dass nicht die kompilierte Exe die Ausnahme benötigt, sondern die verwendetet .Net-Komponente und es dann die bessere Wahl ist den Port für die Ausnahme heranzuziehen.
Gruß Frank
Zitat von @Friemler:
Ich werde es wohl so lösen, dass der Webservice, wenn er vom Controller den Befehl bekommt die Netzwerkports zu wechseln, auch gleich noch die Firewall-Regeln ändert.
Ich werde es wohl so lösen, dass der Webservice, wenn er vom Controller den Befehl bekommt die Netzwerkports zu wechseln, auch gleich noch die Firewall-Regeln ändert.
das Problem und die Lösung hast Du korrekt beschrieben.
Bei den C#-Sachen ist es leider so, dass nicht die kompilierte Exe die Ausnahme benötigt, sondern die verwendetet .Net-Komponente und es dann die bessere Wahl ist den Port für die Ausnahme heranzuziehen.
Gruß Frank
Hallo Friemler,
Basiert die fragliche Anwendung auf HttpListener()?
Der HttpListener() basiert auf http.sys.
Quelle: https://docs.microsoft.com/de-de/aspnet/core/fundamentals/servers/weblis ...
Zum Thema Windows-Firewallausnahme habe ich das hier gefunden:
https://stackoverflow.com/questions/17863294/c-sharp-httplistener-and-wi ...
Dort stehen man könne eine Portnummernausnahme weiter einschränken, indem man auf dem Tab Programme und Dienste ins Feld (x) Dieses Programm: system einträgt.
Anders herum, kann man bei einer Programmausnahme den Programmnamen system ohne Pfadangabe und ohne Extension angeben und natürlich auch zusätzlich den zu verwendenden Port einschränken.
Als Kommandozeile könnte das beispielsweise so aussehen:
und als versteckter Process-Aufruf in C# beispielsweise so:
(Der C#-Code ist ungetestet.)
Wenn das mit system als Programmname funktioniert, also das eigene Programm dadurch nicht nicht blockiert wird, wird zwar vermutlich kein Programm ausgeschlossen, das ebenfalls auf http.sys basiert, aber vielleicht bleiben doch ein paar andere Programme außen vor und wenn nicht hat man auch nichts verloren.
Gruß Frank
Basiert die fragliche Anwendung auf HttpListener()?
Der HttpListener() basiert auf http.sys.
Quelle: https://docs.microsoft.com/de-de/aspnet/core/fundamentals/servers/weblis ...
Zum Thema Windows-Firewallausnahme habe ich das hier gefunden:
https://stackoverflow.com/questions/17863294/c-sharp-httplistener-and-wi ...
Dort stehen man könne eine Portnummernausnahme weiter einschränken, indem man auf dem Tab Programme und Dienste ins Feld (x) Dieses Programm: system einträgt.
Anders herum, kann man bei einer Programmausnahme den Programmnamen system ohne Pfadangabe und ohne Extension angeben und natürlich auch zusätzlich den zu verwendenden Port einschränken.
Als Kommandozeile könnte das beispielsweise so aussehen:
netsh advfirewall firewall add rule name="Friemler" program=system dir=in action=allow protocol=TCP localport=0815 profile=any
string befehlsausgabe = "";
int befehlserrorlevel = 0;
try
{
Process firewallausnahme = new Process();
firewallausnahme.StartInfo.FileName = "C:\\Windows\\System32\\netsh.exe";
firewallausnahme.StartInfo.WorkingDirectory = "C:\\Windows\\System32";
firewallausnahme.StartInfo.Arguments = "advfirewall firewall add rule name=\"Friemler\" program=system dir=in action=allow protocol=TCP localport=0815 profile=any";
firewallausnahme.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
firewallausnahme.StartInfo.CreateNoWindow = true;
firewallausnahme.StartInfo.UseShellExecute = false;
firewallausnahme.StartInfo.RedirectStandardOutput = true;
firewallausnahme.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
firewallausnahme.Start();
befehlsausgabe = firewallausnahme.StandardOutput.ReadToEnd();
firewallausnahme.WaitForExit();
befehlserrorlevel = firewallausnahme.ExitCode;
}
catch (Exception ex)
{
befehlsausgabe = ex.Message.ToString();
befehlserrorlevel = firewallausnahme.ExitCode;
// weitere Fehlerbehandlung
};
Wenn das mit system als Programmname funktioniert, also das eigene Programm dadurch nicht nicht blockiert wird, wird zwar vermutlich kein Programm ausgeschlossen, das ebenfalls auf http.sys basiert, aber vielleicht bleiben doch ein paar andere Programme außen vor und wenn nicht hat man auch nichts verloren.
Gruß Frank