Вариант ровно один - разнести всё-таки по разным портам. Маловероятно, что подходящий вам костыль - разруливать не по порту назначения, а по адресам источников.
В HTTP специально разработали виртуальные хосты и SNI, чтобы можно было делать то, что вы хотите - по-разному обрабатывать запросы на один и тот же порт в зависимости от заголовка. Если у вашего протокола нет аналогичной функциональности - то, что вы хотите, никак не сделать.