friemler
Goto Top

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

Content-ID: 382470

Url: https://administrator.de/contentid/382470

Ausgedruckt am: 03.12.2024 um 17:12 Uhr

aqui
aqui 06.08.2018 um 17:55:24 Uhr
Goto Top
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 !
Friemler
Friemler 06.08.2018 um 18:37:20 Uhr
Goto Top
Die Kommunikation mit dem SQL Server ist gar kein Problem. Und welche Ports die Applikation nutzt weiß ich natürlich, ich habe sie ja geschrieben. Wenn ich genau diese Ports für alle Programme in der Firewall freischalte oder eben alle TCP Ports für alle Programme (Scheunentor) funktioniert ja alles. Ich möchte wissen wie ich eine Regel definiere, die sich nur auf den Webservice bezieht und ihm gestattet, an allen TCP Ports zu lauschen.

Ein netstat -a -b -o hat ergeben, dass an den von mir benutzten Ports der System-Prozess lauscht. Verschiedene Fundstellen im WWW (u.a. StackOverflow) sagen, dass ein .Net Webservice nicht selbst am Netzwerk lauscht, sondern dass das die SMSvcHost.exe übernimmt, die zu .Net gehört (wenn es ein net.tcp basierender Webservice ist). Meiner ist jedoch basic-http basiert und deshalb lauscht anscheinend der System-Prozess. Alles viel zu kompliziert, Microsoft .Net Geraffel halt.

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.
Pedant
Lösung Pedant 06.08.2018 aktualisiert um 20:22:48 Uhr
Goto Top
Hallo Friemler,

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.

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
Friemler
Friemler 06.08.2018 um 21:03:15 Uhr
Goto Top
Hallo Frank,

nur aus Interesse: Hast Du eine Ahnung, welche .Net-Komponente für meinen Fall in Frage kommt? Da der System-Prozess das Lauschen übernimmt, kann es sich ja nur um einen Kernel-Mode-Treiber o.ä. handeln.

Grüße
Friemler
Pedant
Lösung Pedant 07.08.2018 um 10:57:31 Uhr
Goto Top
Hallo Friemler,

Zitat von @Friemler:
Du eine Ahnung, welche .Net-Komponente für meinen Fall in Frage kommt?

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
und als versteckter Process-Aufruf in C# beispielsweise so:
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
	};
(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
Friemler
Friemler 07.08.2018 um 11:54:24 Uhr
Goto Top
Hallo Frank,

vielen Dank für die ausführliche Antwort!

Ich bin in Sachen .Net noch blutiger Anfänger. Nach 25 Jahren Delphi will mein Chef jetzt auch mal "was mit .Net machen" face-plain und hat mir den Auftrag für dieses Projekt erteilt, aus dem später mal ein reales Produkt entwickelt werden soll.

Ein Kollege, der schon fit ist in .Net, hat mir einen Schnellkurs verpasst und dabei ein grobes Gerüst für den Webservice entwickelt, das ich ausgebaut habe. Ich kann deshalb nicht wirklich sagen ob der Webservice auf HttpListener basiert, im Quelltext findet sich auf jeden Fall keine Stelle, an der die Klasse WebHostBuilder verwendet wurde (wie in dem Beispiel-Code auf der von Dir verlinkten Seite).

In der App.Config hat der XML-Knoten /configuration/system.serviceModel/services/service/endpoint das Attribut bindingConfiguration="basicHttp", daher meine Aussage, dass der Webservice basic-http basiert ist.

Auf die Möglichkeit, eine Firewall-Regel für den System-Prozess zu erstellen, werde ich wohl verzichten, denn wie Du schon geschrieben hast

wird zwar vermutlich kein Programm ausgeschlossen, das ebenfalls auf http.sys basiert

Trotzdem vielen Dank für Deine Mühen.

Grüße
Friemler