Использование Term для обхода Интернет-Firewall

Сначала с внутренней машины соединитесь с внешней (здесь и далее внутренняя и внешняя относительно firewall) и войдите в систему.

Так как вы используете linux, вы будете использовать файловую систему proc (смотрите далее), удостоверьтесь, что shell - это shell типа sh (bash, zsh и т.д.) . Например, если у вас csh, то установите связь telnet следующей командой:

(setenv SHELL /bin/sh; telnet machine.outside)

После вхождения в систему внешней машины, выполните команду

term -r -n off telnet

теперь выйдите в командную строку telnet на внутренней машине, используя ^] (или как у вас настроено), и, при помощи команды !, запустите term,

telnet> ! term -n on telnet >&3 <&3

(Если у вас нестандартная версия telnet, то вам надо использовать другой дескриптор файла (у меня он 3); его можно легко определить при помощи strace. Но тройка, по-моему, работает на всех bsd-совместимых telnet клиентах, я пробовал на SunOS 4.x и обычных дистрибутивах linux.)

Некоторые клиенты telnet не имеют команды "!", которая запускает внешнюю команду оболочки. Например, telnet-клиент в дистрибутиве Slackware 3.0 именно такой. Исходники (не уверен на 100%) этого клиента лежат на

ftp://ftp.cdrom.com:/pub/linux/slackware-3.0/source/n/tcpip/NetKit-B-0.05.tar.gz

в них есть эта команда. Напрашивается решение - скачать и перекомпилировать их. Но, к сожалению, я не смог этого сделать. и в добавок если у вас используется SOCKS firewall, то вам понадобиться клиент telnet поддерживающий SOCKS. В этом случае я не оплошал и собрал такой клиент, используя ftp://ftp.nec.com/pub/security/socks.cstc/socks.cstc.4.2.tar.gz

или, если вы находитесь за пределами США , ftp://ftp.nec.com/pub/security/socks.cstc/export.socks.cstc.4.2.tar.gz

Если у вас ядро до 1.2.13, вы можете приостановить telnet командой ^]^z, затем выяснить его идентификатор процесса и дать команду

term -n on -v /proc/<telnetpid>/fd/3 telnet

Это не работает с ядрами выше 1.3.x , у которых, из соображений безопасности, закрыт доступ к этим дескрипторам файлов (fd) для всех пользователей, кроме одного.

Множество сокетов term

Хорошая идея - дать сокету term явное имя. Это имя - "telnet" - параметр при вызове term. Если вы не имеете переменную среды TERMSERVER с установленным значением "telnet", вызывайте term клиент с ключом -t, например "trsh -t telnet".

Файл инициализации /.term/termrc.telnet

Я проверил качество линии, при помощи утилиты linecheck. Я думал, что она будет полностью прозрачна, но я ошибся. Однако, проблемы возникли только с символом 255. Поэтому я написал в файле ?/.term/termrc.telnet (.telnet - это имя term-сокета, см.предыдущую главу) следующее:

baudrate off
escape 255
ignore 255
timeout 600

Наверно, после более точной настройки, скорость повысится, но у меня пропускная способность этой системы составляет около 30 тысяч cps (достаточно дальнее соединение и медленный firewall). По ftp скорость немного выше - около 100 тысяч cps. На самом деле пропускная способность может зависит от времен задержки.

Руководство

Очевидно, что если вы находитесь за пределами firewall и входите в систему при помощи карты SecureID или ей подобной, то вам может понадобиться смена ролей, описанных выше локального и удаленного серверов. (Если вы не понимаете, что это такое - значит вы не настолько знакомы с term, чтобы правильно использовать хитрость, описанную здесь))

Безопасность

В этом не больше уязвимости, чем в возможности наличия telnet подключения на необезопасенной машине. Дополнительный риск исходит от людей, способных использовать сокет term, который вы устанавливаете, а вы можете этого узнать. Так будьте внимательными. (Лично, я делаю это с внешней машиной, которую я знаю, а именно это портативный компьютер с linux, который я обслуживаю и который не принимаает никаких внешних соединений).

Другая возможность - добавить "socket off" в удаленном файле ?/.term/termrc.telnet, или add "-u off" при обращении к term. Это предотвращает сокет от нападения с удаленной машины, лишь с небольшой потерей функциональности.

Режим Telnet

Убедитесь, что удаленный telnetd не работает в противном семибитном режиме. Если это не так, вы должны сообщить term об этом, когда вы вызываете его, добавив ключ -a. (Я иногда использую "^] telnet> set outbin", или "set bin" или вызываю telnet с ключом -8, для перевода в восьмибитный режим).

Ошибки и список пожеланий для term

Программа linecheck иногда имеет некоторые проблемы при проверке telnet соединения. Это происходит иногда, потому что она не проверяет код возврата функции read(). Для сетевых соединений вызов read() может возвращать коды ошибок -1, EINTR (прервано) или EAGAIN (попытаться снова). Очевидно, это должно проверяться.

Имеется множество особенностей, которые могут облегчить использование term через telnet. Они прежде всего касаются предположения, которое повлияло на разработку term, а именно, когда подключение идет на линиях с низкой пропускной способностью, малой надежностью и некоторой зашумленностью.

Telnet соединение в общем проходит с высокой пропускной способностью, надежностью и без ошибок. Это означает, что подключение может быть лучше, если (а) максимальный размер буфера увеличен, намного больше предела установленного term - N_PACKETS/2=16, (б) выключена проверка контрольной суммы пакета и (в) разрешены большие пакеты.

Также, чтобы увеличить безопасность, было бы хорошо иметь опцию term, чтобы регистрировать все соединения через сокет, выводить сообщения в журнал, в поток stderr или в оба. Это позволило бы увидеть, не разрушают ли term соединение хакеры на вашей машине.

Приемы, которые, кажется, не работают

Некоторые клиенты и серверы telnet согласны передавать друг другу зашифрованные данные, чтобы обеспечить их безопасность. К сожалению, хак, используемый выше (использование сетевого подключения, которое установил клиент telnet, пока он простаивает) не будет работать в этом случае. Вместо этого, необходимо проверить клиент telnet непосредственно, на наличие функции шифрования. Добавьте команду, которая выполнит процесс с его вводом и выводом.