Бе Vladsun е обяснил много точно проблема малко по-нагоре. Нещата са много прости и очевидни и това между другото е често срещан проблем. Който лесно се намира, стига човек да може да си представи малко как върви една проста TCP комуникация при това положение, нека ви опиша картинката (щото много обичам

'> ):
Машина от вътрешната мрежа с адрес 192.168.0.5 (например) се опитва да върже vlc до "външна" машина (x.x.x.x) на порт 5900. SYN пакетът се препраща през рутера, 192.168.0.1. Оттам се ДНАТ-ва към машината 192.168.0.2. Тя вижда SYN пакет идващ от 192.168.0.5 и му връща SYN-ACK потвърждение. Машината 192.168.0.5 получава потвърждението SYNACK, но то не идва от x.x.x.x - идва от 192.168.0.2 - съответно не е асоцирано с никоя конекция и не се взема предвид. Установяването на сесията пропада.
За да се реши проблема е необходимо на рутера да се сложи и правило, което SNAT-ва всичко от вътрешната мрежа към порт 5900 със "собствения" си адрес - 192.168.0.1. Така логически схемата е завършена. SNAT правилото ТРЯБВА да е преди MASQUERADE правилото в POSTROUTING, иначе ще се появи друг проблем (пакетите към 192.168.0.2 ще се опитват да излязат през "външния" интерфейс - съответно пак проблем).
Що се отнася до quake там има друг проблем - не знам дали комуникацията не минава по UDP. Освен това, не знам дали не се работи с multicasting (поне ако се води "локален" сървър - не съм геймър и не знам как е там, но това беше случая с counterstrike май). Ако искате да си правите "локални" игри в рамките на вашето ISP - тогава се налага да се прави и multicast routing - това е една много дълга, широка и сложна тема в линукс света. Не се наемам да помагам в този случай...