Нашел проблему, но не нашел пока решение. Дело в том, что ответы со стороны домашнего сервера идут по дефолтному маршруту (в роутер, через eth0), хоть и приходят из ppp0. Если прописать route add -net 123.123.123.123 netmask 255.255.255.255 dev ppp0, где IP — адрес, с которого я подключаюсь, то всё работает.
В моём случае, кроссплатформенный != работающий одновременно на всех системах скрипт. Так что много if-ов не понадобится. Задача написать программу, которая бы выполнялась в линуксе и винде, не стоит. Главное — универсальный язык, просто чтобы не учить сразу два, под разные платформы.