In der Regel sichert man Mysql so ab, dass man über das Internet nicht direkt darauf zugreifen kann. Das passiert bereits in der Standard-Mysql-Konfiguration, die lediglich Connections von localhost zulässt.
Wenn man jetzt aber doch einmal ein Client-Programm benötigt, dass auf die Datenbank zugreift, hat man ein Problem. Natürlich kann man einfach Mysql umkonfigurieren und andere Verbindungen auch zulassen, dann macht man noch die Firewall auf und letztendlich sollte man dann auch noch auf Facebook posten, dass das Scheunentor offen ist, damit auch ja jeder los hacken kann.
Also das ist nicht die richtige Lösung.
Die elegantere Lösung ist, dass man einen Ssh-Tunnel aufbaut und dann die Verbindung darüber laufen lässt. Dazu braucht man lediglich einen SSH-Zugang auf den Server und den hat man ja in der Regel.

Die allgemeine Lösung über SSH Tools

Clientseitig kann man diesen Tunnel dann öffnen, indem man entweder in putty den entsprechenden Tunnel einträgt oder wenn man einen Kommandozeilen-Client hat (Linux) kann man mit folgendem Statement den Tunnel öffnen:

ssh -L 2222:localhost:3306 -l username mysql.server.de

Jetzt kann man einfach mit einer normalen Connection darauf zugreifen. In diesem Fall muss man lediglich im ConnectionString den Port 2222 eintragen. Man kann aber auch beim Erzeugen des Tunnels einen anderen, beliebigen Port angeben.

Die Lösung über ein C#-Programm

Jetzt ist das aber für einen Anwender ziemlich unhandlich, wenn man erst putty öffnen muss um den Tunnel aufzubauen und dann die benötigte Anwendung ausfähren kann. Viel schöner wäre es, wenn auch die Anwendung selbst den Tunnel erzeugt.
Dazu braucht man erst einmal einen SSH-Client in C#. Ich verwende dazu das nuget-Paket SSH.NET von Renci. Das Projekt ist auf Github gehostet und kann unter der Url https://github.com/sshnet/SSH.NET gefunden werden.

Mit dieser Library baut man also erst die SSH-Verbindung auf erzeugt dann einen entsprechenden Tunnel. Das Ganze sieht folgendermaßen aus:

PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo(
	"mysql.server.de", "myusername", "mypassword");

var client = new SshClient(connectionInfo);
client.Connect();
var portfwd = new ForwardedPortLocal(IPAddress.Loopback.ToString(), 2222, "localhost", 3306);
client.AddForwardedPort(portfwd);
portfwd.Start();

Das war’s im Grunde schon. Wenn man hier einen using verwenden will, muss man darauf aufpassen, dass der Client geöffnet bleiben muss, bis man alle Datenbank-Operationen abgeschlossen hat. Daher würde ich hier empfehlen, dass mein kein using verwendet, sondern das Schließen der ssh-Verbindung explizit einprogrammiert, wenn man die Anwendung beendet bzw. wenn man die Datenbank nicht mehr benötigt.

Mit folgendem ConnectionString kann man dann auf die Datenbank zugreifen:

string connectionstring = "server=127.0.0.1;port=2222;database=mydatabase;user id=mydbuser;password=mydbpassword;sslmode=None";
MySqlConnection connection = new MySqlConnection(connectionstring);
connection.Open();
...