  Mini-HOWTO Term-Firewall
  Barak Pearlmutter, barak.pearlmutter@alumni.cs.cmu.edu
  22 Mai 1996

  (Version   francaise   realisee   par  Eric  Dumas,  dumas@freenix.fr,
  dumas@Linux.EU.Org, 1er  Juillet  1997).   Ce  document  decrit  comme
  utiliser  Term pour traverser un Firewall Internet, ce que vous n'etes
  pas suppose pouvoir faire.

  11..  AAvveerrttiisssseemmeennttss ((IImmppoorrttaanntt !!))

  Je  decline  sur  le  present  document  toute  responsabilite   d'une
  quelconque  application  de  ce  qui  va  suivre.  Si  cela  echoue de
  n'importe quelle maniere, c'est votre probleme. Ce n'est pas ma faute.
  Si  vous  ne comprenez pas les risques qui decoulent de cette methode,
  ne l'utilisez pas. Si vous employez cette methode et que cela permet a
  des pirates vicieux de penetrer dans votre systeme informatique et que
  cela vous coute votre travail et a votre entreprise  des  millions  de
  dollars, ce n'est que de votre faute. Ne venez pas pleurer.

  22..  CCooppyyrriigghhtt

  Sauf contre-indication, les documents HOWTO Linux sont copyrightes par
  leurs auteurs respectifs.  Les  documents  Linux  HOWTO  peuvent  etre
  reproduits  et  diffuses  totalement ou en partie, sous n'importe quel
  support physique ou electronique du moment  ou  la  notice  legale  se
  trouve  sur  toute copie.  Les diffusions commerciales sont autorisees
  et encouragees. Toutefois, l'auteur souhaiterait etre tenu au  courant
  de telles diffusions.

  Toute  traduction,  travail  derive  contenant n'importe quel document
  HOWTO Linux doit etre convert par cette note legale.  Ainsi,  vous  ne
  pouvez  pas  creer  un  document  derive  d'un  HOWTO  et  ajouter des
  restrictions sur sa diffusion. Des exceptions  a  ces  regles  peuvent
  etre  eventuellement acceptees dans certaines conditions. Contactez le
  coordinateur des HOWTO a l'adresse qui suit.

  En  resumant,  nous  souhaitons  favoriser  la  dissemination  de  ces
  informations  _v_i_a  le  maximum de moyens de communications. Toutefois,
  nous souhaitons garder un copyright sur ces documents et souhaiterions
  etre  tenu  au  courant  de  toute  initiative  de  diffusion  de  ces
  documents.

  Si vous avez des questions, contactez Greg  Hankins,  le  coordinateur
  des  HOWTO  Linux a gregh@sunsite.unc.edu par courrier electronique ou
  par telephone au 1 404 853 9989.

  33..  IInnttrroodduuccttiioonn

  Le programme term est normalement  utilise  sur  une  ligne  serie  ou
  modem,  pour  permettre  a  plusieurs  services  machine-a-machine  de
  communiquer grace a cette simple connexion serie.  Toutefois,  il  est
  assez  utile  quelquefois  d'etablir une connexion entre deux machines
  communiquant par telnet avec term.

  L'utilisation la plus interessante reside dans la  connexion  de  deux
  machines  separees  par  des _f_i_r_e_w_a_l_l_s ou par des serveurs _s_o_c_k_s.  Les
  _f_i_r_e_w_a_l_l_s permettent l'etablissement  de  connexions  a  travers  eux-
  memes, typiquement en utilisant le protocole _s_o_c_k_s.  Ce dernier permet
  aux machines du reseau interne  de  se  connecter  a  l'exterieur,  et
  oblige  les  utilisateurs  exterieurs a se connecter en premier sur la
  machine passerelle qui leur demande un mot de  passe.   Ces  _f_i_r_e_w_a_l_l_s
  rendent  impossible,  par  exemple, la communication entre un client X
  sur  une  machine  interieure  et  un  serveur  exterieur.   Mais,  en
  configurant   une   connexion  term,  ces  restrictions  peuvent  etre
  contournees assez facilement, au niveau de l'utilisateur.

  44..  MMiissee eenn ooeeuuvvrree ggeenneerraallee

  Configurer une connexion term par-dessus une session telnet se fait en
  deux phases.

  Dans  un  premier temps, votre client habituel telnet est utilise pour
  configurer une connexion telnet et pour  se  connecter.   Ensuite,  le
  client  telnet  est  mis en sommeil, et fait en sorte que la connexion
  telnet soit transmise a term.

  55..  PPrroocceedduurree ddeettaaiilllleeee

  En detail, la marche a suivre est la suivante :

  1. A partir d'une machine a l'interieur du _f_i_r_e_w_a_l_l, se connecter  par
     telnet a l'exterieur de celui-ci et s'y loger.

  2. Sauf  si  vous  etes  sous LLiinnuuxx et que vous utilisez le systeme de
     fichiers _/_p_r_o_c (voir ci-dessous), verifiez que votre shell  est  du
     genre  sh.  C.a.d.  que votre shell par defaut soit une variante de
     csh. Appelez telnet par (setenv SHELL /bin/sh;  telnet  machine.la-
     bas.dehors).

  3. Apres s'etre loge, lancer la commande sur la machine de l'exterieur
     : term -r -n off telnet.

  Maintenant revenez  a  l'invite  telnet  sur  la  machine  locale,  en
  utilisant  le caractere d'echappement  ^]  (ou celui que vous voulez),
  puis utilisez la commande de telnet pour executer une  commande  shell
  !  pour lancer term :

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

  _E_t _v_o_i_l_a _!_!_! (Ndt : En francais dans le texte).

  (Si  vous possedez une autre version de telnet, vous risquez d'avoir a
  utiliser d'autres descripteurs de  fichiers  que  3.  C'est  facile  a
  determiner  en utilisant trace. Mais 3 semble fonctionner sur tous les
  telnet de type bsd que j'ai testes. J'ai egalement essaye sous Sun  OS
  4.x et les distributions LLiinnuuxx standard.)

  Certains  clients telnet ne possedent pas de caractere d'echapement !.
  Par exemple, client telnet diffuse  avec  la  Slackware  3.0  en  fait
  partie.    Les   sources   de   ce  client  sont  senses  provenir  de
  ftp://ftp.cdrom.com:/pub/linux/slackware-3.0/source/n/tcpip/NetKit-
  B-0.05.tar.gz,  paquetage  qui contient le caractere d'echapement. Une
  solution  assez  simple  est  de  recuperer  ces  sources  et  de  les
  recompiler.  Je n'y suis malheureusement pas arriver. De plus, si vous
  etes a l'interieur d'un firewall socks, vous devrez  avoir  un  client
  telnet  a  la  SOCKS. J'ai reussi a compiler un tel cient en utilisant
  ftp://ftp.nec.com/pub/security/socks.cstc/socks.cstc.4.2.tar.gz ou  si
  vous         etes         a         l'exterieur        des        USA,
  ftp://ftp.nec.com/pub/security/socks.cstc/export.socks.cstc.4.2.tar.gz

  Autrement,  sous  LLiinnuuxx  version  1.2.13  ou  precedentes, vous pouvez
  mettre telnet en sommeil avec  ^]^z , recuperer son pid et lancer :

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

  Cela ne fonctionne plus avec les noyaux  1.3  et  superieur,  qui  ont
  verouille  certaines  failles  de securite pour eviter les acces a des
  descripteurs  de  fichiers  n'appartenant  pas  au   proprietaire   du
  processus ou a ses fils.

  66..  SSoocckkeettss ppoouurr tteerrmm multiples

  C'est  une  bonne idee de donner un nom explicite a la socket de term.
  C'est l'argument donne a telnet dans la ligne de commande ci-dessus. A
  moins   que   vous   n'ayez  la  variable  d'environnement  TERMSERVER
  positionnee  a  telnet,  vous  pouvez  appeler  les  clients  avec  le
  parametre -t, c'est-a-dire : trsh -t telnet.

  77..  LLee ffiicchhiieerr dd''iinniittiiaalliissaattiioonn ..tteerrmm//tteerrmmrrcc..tteellnneett

  J'ai  attendu  que la ligne soit claire en utilisant un verficateur de
  ligne sur ce media. J'esperais qu'il soit totalement transparent, mais
  cela semble impossible. Toutefois, le seul caractere perturbant semble
  etre le  255.  Le  fichier   /.term/termrc.telnet  que  j'emploie  (le
  fichier .telnet est le nom de la connexion term, cf. supra) contient :

  baudrate off
  escape 255
  ignore 255
  timeout 600

  Il peut etre ameliore en trichant, j'ai un debit de  seulement  30.000
  cps  (caracteres  par  secondes) pour une connexion longue distance a-
  travers un _f_i_r_e_w_a_l_l lent.  FTP  peut  aller  jusqu'a  100.000  cps  en
  suivant le meme chemin. Une vitesse en bps (bits par seconde) realiste
  peut eviter quelques temps morts.

  88..  AAddmmiinniissttrraattiioonn

  Manifestement, si vous attaquez de l'exterieur  du  _f_i_r_e_w_a_l_l,  et  que
  vous  employez  une  carte  avec un identificateur securise ou quelque
  chose de ce genre,  vous  voudrez  surement  inverser  les  roles  des
  serveurs  de connexion et local (si vous ne comprennez pas ce que cela
  signifie, vous n'etes peut-etre pas  assez  familier  avec  term  pour
  utiliser l'astuce decrite dans ce document d'une maniere responsable).

  99..  SSeeccuurriittee

  Ce n'est rien moins qu'une  faille  que  la  possibilite  d'avoir  une
  connexion   telnet   detournee   sur  une  machine  non  securisee  de
  l'exterieur.  Le premier risque supplementaire provient des  personnes
  capables  d'utiliser  la socket term que vous avez configuree sans que
  vous soyez au courant. Donc, soyez prudents (personnellement, je  fais
  cela  sur  une  machine externe que je sais etre securisee.  Pour etre
  plus precis, un portable sous LLiinnuuxx que j'administre moi-meme  et  qui
  n'accepte aucune connexion de l'exterieur).

  Une    autre    possibilite    est    d'ajouter    socket   off   dans
  ~/.term/termrc.telnet ou ajouter -u off. Cela evide que la socket soit
  accessible  du  site  distant,  avec une perte de fonctionnalite assez
  mineure.

  1100..  MMooddee tteellnneett

  Verifiez que le demon telnetd distant n'est pas dans un  mauvais  mode
  sept  bits. Si c'est le cas, vous devez l'indiquer a term lorsque vous
  le lancez en ajoutant un -a sur la ligne  de  commande  (j'emploie  de
  temps  en  temps  un  ^]  telnet> set outbin ou un set bin ou bien, je
  lance telnet avec l'option _-_8 pour  forcer  la  connexion  en  mode  8
  bits).

  1111..  BBuuggss eett mmeess ssoouuhhaaiittss ccoonncceerraanntt tteerrmm

  Le  programme  de  verification  de ligne a de temps en temps quelques
  problemes pour controler la connexion telnet. Cela provient parfois du
  fait  qu'il  ne verifie pas le code de retour de l'appel read().  Pour
  des connexions reseau, cet appel peut retourner le  code  d'erreur  -1
  avec  _E_I_N_T_R  (interrompu)  ou _E_A_G_A_I_N (reessayer).  Manifestement, cela
  serait une bonne chose que cela soit verifie.

  Un   certain   nombre   de   caracteristiques   pourraient   faciliter
  l'utilisation  de term sur telnet. Cela provient essentiellement d'une
  hypothese qui a influence le developpement de term,  qui  est  que  la
  connexion dispose d'une largeur de bande faible, d'une latence reduite
  et qu'elle est quelque peu bruitee.

  Une connexion telnet possede  en  general  une  bande  passante  assez
  importante,  une  grande  latence  et qui contient peu d'erreurs. Cela
  signifie que la connexion pourrait etre mieux utilisee si :

  1. la taille maximale de la fenetre etait augmentee, bien  au-dela  de
     la limite imposee par la formule _N___P_A_C_K_E_T_S_/_2 _= _1_6 de term

  2. une  option  pour desactiver l'envoi et la verification du _c_h_e_c_k_s_u_m
     des paquets etait implementee

  3. de plus grands paquets etaient permis lorsque cela est approprie.

  Egalement, pour ameliorer la securite, il serait  sympathique  d'avoir
  une  option  dans term pour afficher la liste des connexions realisees
  par la socket dans un fichier ou sur stderr, ou bien  dans  les  deux.
  Cela permettrait de verifier si une connexion term a ete corrompue par
  des pirates situes du cote non securise de la machine.

  1122..  TTrruuccss qquuii sseemmbblleenntt nnee ppaass ffoonnccttiioonnnneerr

  Quelques  clients  et  serveurs  telnet  acceptent   d'encoder   leurs
  communications    pour    tromper    la   surveillance   sur   reseau.
  Malheureusement,  la  methode  employee  ci-dessus  (en  utilisant  la
  connexion  reseau que le client telnet a configure pendant que l'autre
  client est en attente) ne fonctionne pas dans  ce  cas.   Au  lieu  de
  cela,  il  doit  reellement  traverser  le client telnet, donc ne peut
  realiser l'encodage. Il semble qu'il faille modifier  que  le  client,
  pour  y  a jouter une commande qui lance un processus avec leurs stdin
  et stdout connectes au telnet en cours.  Cela serait  egalement  utile
  pour des processus de connexion automatiques, peut-etre quelqu'un l'a-
  t-il deja fait.

  1133..  SSoouurrcceess

  J'ai legerement consulte la bibliotheque Term. Les details  ainsi  que
  les  patches  a  SOCKS sont disponibles en les demandant a Steven Danz
  (danz@wv.mentorg.com).

  1144..  RReemmeerrcciieemmeenntt

  Mes remerciements a

  +o  Gary Flake (flake@scr.siemens.com)

  +o  Bill Riemers (bcr@physics.purdue.edu)

  +o  Greg Louis (glouis@dynamicro.on.ca)

  1155..  CCooppiiee ssuupppplleemmeennttaaiirree ddeess aavveerrttiisssseemmeennttss --LLiisseezz--llee !!

  Je  decline  sur  le  present  document  toute  responsabilite   d'une
  quelconque  application  de  ce  qui  a  ete expose. Si cela echoue de
  n'importe quelle maniere, c'est votre probleme. Ce n'est pas ma faute.
  Si  vous  ne comprenez pas les risques qui decoulent de cette methode,
  ne l'utilisez pas. Si l'emploi de cette methode permet a  des  pirates
  vicieux  de  penetrer dans votre systeme informatique et que cela vous
  cote votre travail et a votre entreprise des millions de  dollars,  ce
  n'est que de votre faute. Ne venez pas pleurer.

