Você pode fazer isso por roteamento avançado, como sugerido, mas não é tão simples assim.
A solução mais simples para atingir seu objetivo é rotear pacotes endereçando seu endereço IP (home) de maneira diferente. É sempre boa ideia restringir o acesso ssh a vários endereços IP seguros. Por exemplo, você pode fazer:
ip route add 1.1.1.1 via 9.9.9.9
Aqui 1.1.1.1 é o seu endereço IP, e 9.9.9.9 é algum gateway padrão já acessível na tabela de roteamento. Agora todos os pacotes da sua máquina para o IP externo retornarão da mesma maneira. Você pode rotear todo o resto da VPN como normal. Você pode até adicionar esta rota no arquivo de configuração openvpn. Tudo é super.
No entanto, não é tão bom se seu IP residencial está mudando (também conhecido como endereço dinâmico) ou você precisa acessar sua máquina a partir de endereços aleatórios (vários usuários, viajando). Nesse caso, você deve seguir o caminho difícil.
Por favor note que se você não fizer nada, os pacotes ssh chegarão na sua interface externa (e ip), mas eles não poderão encontrar o caminho de volta se você os rotear através da VPN (na verdade eles poderiam dependendo das configurações de VPN, mas o IP de origem será diferente e o pacote será descartado). Seu objetivo é redirecionar alguns pacotes de saída para a interface externa e alguns para a VPN. Este é o problema.
Crie uma tabela de roteamento alternativa:
echo "100 secure" >> /etc/iproute2/rt_tables
Preencha e controle o roteamento:
# route ssh over external iface eth0 to router 9.9.9.9
ip route add default via 9.9.9.9 dev eth0 table secure
# send all packages with fwmark 1 to the secondary routing table
ip rule add fwmark 0x1 table secure
# Mark outgoing ssh packages with the mark 1
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 1
Aqui, marcaremos todos os pacotes ssh de saída e, em seguida, redirecionaremos todos os pacotes marcados pelo roteiro alternativo. Claro, agora você não vai poder fazer o ssh em sua vpn porque todas as respostas seriam redirecionadas para uma outra interface. O ponto é, você pode criar regras iptables arbitrariamente complexas e rotea-las diferentemente usando set-mark.
Felizmente, temos uma coisa chamada CONNMARK que (utilizando o recurso de rastreamento de conexão do kernel) pode marcar conexões inteiras para frente e para trás (você precisará do módulo xt_connmark).
# mark incoming ssh *connection* with 1. Here eth0 is your external interface
iptables -A INPUT -m state --state NEW -i eth0 -p tcp --dport 22 -t mangle -j CONNMARK --set-mark 1
# restore connection mark (e.g. mark the packages)
iptables -A OUTPUT -t mangle -j CONNMARK --restore-mark
# send all packages with fwmark 1 to the secondary routing table as before..
ip rule add fwmark 0x1 table secure
Por favor, use o acima de acordo com sua configuração atual depois de entender os conceitos e não apenas copiar e colar.
Editar: da perspectiva do cliente
Se você estiver usando sua VPN da mesma máquina onde é feita a conexão ssh, um problema adicional surge.
Por padrão, o par de VPN é o gateway padrão. Ele pode facilmente quebrar sua conexão existente, já que seus pacotes ssh serão roteados pelo canal VPN (o servidor os obterá da interface tun ou tap e não da interface eth física). A solução fácil não inclui a opção de gateway padrão na configuração do lado cliente (ou não a envia). Pressione apenas a rota das sub-redes preferidas. Aviso: se você fez a VPN para ocultar seu endereço público (em casa), isso pode não ser o que você quer!