вообще-то rinetd работает глупо: слушает сокет, при поступлении коннекта делает accept() и в соответствии с правилами делает connect() на хост: порт, что указаны в конфиге. потом в цикле: читаем из одного сокета в буфер. пишем в другой сокет.
буфер в юзерспейсе, так что данные постоянно бегают по пути kernel <=> userspace< => kernel. Такой вариант кушает cpu и не отличается производительностью. да, и никакого туннелирования ессно нет ))))