En premier lieu, on change généralement le port. il est par défaut à 22, et donc facile à identifier. Beaucoup de softs tels que nmap le detecteront.
On peut le changer pour un autre à 5 chiffres, on sera deja un peu plus tranquille.
Pour ce faire, on peut éditer le fichier /etc/ssh/sshd_config
Toujours dans ce même fichier, on peut indiquer les utilisateurs autorisés à se connecter, via la commande AllowUsers.
Exemple, on veut autoriser juste titi et toto :

AllowUsers titi toto

Encore mieux, on peut donner un user@ip.
On peut ainsi autoriser les acces root pour le reseau local, et un utilisateur pour le reste:

AllowUsers titi toto@192.168.1.1 root@192.168.2.0/24

Maintenant, il y a toutes sortes d'attaques utilisant des techniques différentes, je ne vous parlerai ici que de la brute-force.

Lors de ce type d'attaque, le hacker établit plusieurs connexions par secondes, chacune avec un couple login/pass différents. Afin de s'en protéger et de bannir l'adresse ip de l'attaquant, on va rajouter ces 3 lignes dans notre firewall iptables :

iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 90 --hitcount 3 -j LOG --log-prefix="SSH BRUTEFORCE BANNED"
iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 90 --hitcount 3 -j DROP

Explication :
- La 1è ligne indique que lorsqu'une connexion arrive sur le port 22 (port ssh par défaut, à adapter suivant vos besoins), on va la marquer comme "à surveiller"
- La 2è va logger l'adresse IP et la date si il y a 3 nouvelles connexions venant de la meme adresse IP en 90 secondes
- Enfin la 3è va bannir cette adresse IP, et ne plus répondre à ces requêtes.

Ici ces 3 règles sont faites pour des connexions entrantes arrivant sur l'interface eth1, à adapter également ;)

L'avantage de ces règles est que toutes les tentatives de brute-force vont être loggées, et les ip bannies.
(on peut d'ailleurs dé-commenter la 2è ligne si on ne veut pas de log)
Mais l'inconvénient est que si vous vous plantez de login ou mot de passe lors de la connexion, plus de 3 fois en 90 secondes, ou que vous vous connectez puis deconnectez 3 fois en 90 secondes, vous êtes mort ! :D
Il vous faudra donc être trèèèèès prudent (surtout quand vous êtes à l'extérieur et que vous accédez en ssh à votre machine depuis votre iphone jailbreaké, on peut facilement se planter de touche, vécu inside... lol ) et adapter le nombre de connexions et le temps suivant vos besoins.
Dans l'exemple ci dessus, c'est assez drastique, suite à de très nombreuses tentatives. Dans un contexte courant, on pourrait mettre par exemple 5 connexions sur 5 minutes.

Pour faire mieux, on peut également configurer son firewall pour n'autoriser l'accès à SSH que depuis une adresse IP en particulier, comme ça plus de problème ;)

iptables -A INPUT -i eth1 -p tcp --dport 22 -s 1.2.3.4 -j ACCEPT

Par contre, il faut penser à autoriser autant d'adresses ip que vous avez de connexions extérieures; sinon vous serez coincé aussi.

Au passage, si vous avez installé Munin sur votre machine, il y a un plugin pour monitorer les accès. cela peut donner une bonne idées de la quantité de tentatives ;)

Enfin, pendant qu'on est dans les règles firewall, en voici également une pour se protéger du "syn-flood", technique consistant à initier massivement des connexions TCP, donc envoyer des paquets syn à un serveur sans y répondre, rendant ainsi à terme la machine distante non-communicante, voire figée si trop de ressources utilisées.
Testé et approuvé !

echo 1 > /proc/sys/net/ipv4/tcp_syncookies
iptables -A INPUT -m state --state NEW -p tcp --tcp-flags ! ALL SYN -j DROP

La 1è ligne active la protection anti syn-flood au niveau du kernel, et la 2è indique à iptables de bloquer toutes les nouvelles connexions tcp ne commençant pas par un syn.

Longue vie à votre serveur :)