Руководство: Как создать домашнюю компьютерную сеть ИНТРАНЕТ

Автор: Sarma Seetamraju
электронный адрес: ([email protected])
Перевод: Станислав Рогин, SWSoft Pte Ltd.
Дата: Август 1997

Место: убивая время в поезде "Amtrack & Path", по дороге в пригород Манхэттен.
На компьютере: ноутбук Magnavox 1991 года 386 SX 16МГц, работающем с linux.
(Если после этого вы только заикнетесь, что вот именно на ВАШЕМ компьютере
не работает Linux, то я запихаю вам ваш компьютер, угадайте куда .... )

Перенесено в HTML для: Всех ненормальных людей, которые не могут читать обычный текст.

ВНИМАНИЕ: SOCKS - СВОБОДНО распространяемый комплект под UNIX-системы. Я очень сомневаюсь, что он существует для ДРУГИХ платформ. Если вы хотите, чтобы NETSCAPE продолжал поддерживать SOCKS, то присылайте мне убедительные аргументы в их пользу (с примерами того, как вы использовали SOCKS).


Этот документ описывает необходимые процедуры для создания сети ИНТРАНЕТ у вас дома. Далее мы настроим эту сеть так, что на любых компьютерах в ней для доступа в интернет можно будет использовать обозреватель NETSCAPE.

Сеть, которую мы будем создавать, представляет из себя следующее:

К единственному компьютеру с linux мы будем обращаться как к "СИСТЕМЕ LINUX", а остальные компьютеры будем называть "ДРУГИЕ МАШИНЫ" или "КЛИЕНТЫ". Компьютер с linux будет также иногда называться "СЕРВЕРОМ".
Если вы не понимаете содержание следующего параграфа, то вам надлежит обратиться к разделу ДЛЯ НОВИЧКОВ В ОБЛАСТИ КОМПЬЮТЕРНЫХ СЕТЕЙ. А затем возвращайтесь обратно...

Все последующее описание предполагает, что интерфейсу eth0 сервера назначен адрес IP (с помощью "ifconfig").

Также данное руководство нисколько не ограничивает вас в применении только протокола PPP (вы свободно можете использовать SLIP, PPTP и т.д.). Адрес IP "ppp0"-порта абсолютно несущественен. Это описание лишь требует, чтоб хотя бы один такой порт был и нормально работал.


ПОЧЕМУ МЫ ИСПОЛЬЗУЕМ ТАКУЮ КОНФИГУРАЦИЮ?
Мне НЕ хотелось тратить много денег на ПК с linux, который не будет работать в качестве Х-сервер (и вообще запускать какие-либо Х-приложения). Поэтому я приобрел 486Dx/4 100 МГц с шиной PCI (мне не хочется возиться с ISA), за видеокарту SVGA я уплатил 20$, еще 20$ за NE2000-совместимую сетевую карту, и еще 20$ на кабели, терминаторы и т.п. (ибо я не знаю, как можно в организуемой нами сейчас сети использовать концентраторы Ethernet).

90$ стоила оперативная память (по средней цене 60$ за 16 Мб), и в итоге мы имеем прекрасно работающую linux-систему всего за 270$. Конечно, не стоит перегружать нашу систему компьютерами с NT или другими операционными системами, требующими много ресурсов памяти-винчестеров-процессоров. Конечно, мой клиентский ПК - Pentium-100 с 32 Мб памяти и двумя винчестерами (один из которых впоследствии был использован для linux-машины), работает под Win95.

Машина с linux удобно расположилась на коробке из-под пиццы. Мне неохота было тратить еще 50$ на корпус, тем более, что один из моих друзей одолжил мне блок питания для ПК.


В качестве клиента я выбрал NETSCAPE, так как фактически уже вручную использовать FTP не имеет смысла - это не нужно. Любая уважающая себя компания имеет WWW-сайт, который позволяет использовать навигатор Netscape для доступа к ftp-ресурсам. Конечно, регулярно бывает необходимо попользовать telnet, но можно пережить начальный заход telnet-ом с машин win95/winNT4.0 на ПК с linux... Далее, я завязан на использовании QuickTime и всяких прочих сетевых аудио-сайтов. А версий подобных вещей для LINUX пока не существует. Поэтому приходится запускать все эти программы под Netscape на windows-системах. Также LINUX-машина обрабатывает электронную почту при помощи"sendmail" (помните, что у нас фиксированный адрес IP. Такой постоянный адрес IP хорош ТОЛЬКО для вещей подобных обработке электронной почты. Никакой особой выгоды при серфинге в интернет, работы с telnet и т.п....)

Наконец, мы точно никогда не увидим "Microsoft Internet Explorer" для linux - поэтому я даже и не думаю об использовании Explorer в нашей сети. Также, что-то внутри мне подсказывает, что настроить Explorer было бы очень НЕПРОСТО, по сравнению с настройкой NETSCAPE на машинах-клиентах (то есть других машинах).


ПРОКСИ-сервер

Я не даю указаний по установке ПРОКСИ-сервера. Главное - установить пакет "socks" под машину с LINUX, с помощью которого NETSCAPE на остальных машинах сможет использовать интернет. NETSCAPE (насколько я знаю) сейчас ЕДИНСТВЕННАЯ программа для НЕ-UNIX машин, которая поддерживает SOCKS.


Адреса ИНТЕРНЕТ

Если у вас уже есть сеть на TCP/IP, то уже ДОЛЖНЫ быть ПО МЕНЬШЕЙ МЕРЕ два IP-адреса для компьютеров (один для LINUX-машины и другой для машины-клиента, или даже еще больше IP-адресов - если у вас более чем одна клиентская машина).

О том, как назначить IP-адреса в TCP/IP сети ВСЕМ вашим компьютерам, читайте в других Руководствах. (ОСОБЕННО, ЕСЛИ У ВАС НЕТ зарегистрированного ИНТЕРНЕТ-домена).

Я создал сеть с адресами 10.0.1.x для одной машины LINUX и одной машины с Win95. Им соответственно были назначены адреса 10.0.1.1 и 10.0.1.2. Адрес 10.0.1.1 - это IP-адрес порта ETHERNET (eth0) на LINUX-машине. Порт ppp0 имеет другой адрес IP (который [как мне повезло] имеет фиксированный адрес IP). ЭТОТ IP несущественен в данном описании, а также не упоминается, в целях безопасности.

На другом конце моего PPP-соединения стоит университетский сервер с фиксированным доменным именем.

На машине с linux стоит модем и с помощью CRONTAB - он автоматически подключается к интернет в определенное время. Также (при необходимости) я могу подключиться к интернет вручную.

Если вы подключаетесь к интернет через системы ON-LINE, то смотрите следующий раздел...


Системы ON-LINE

Если вы подключаетесь к интернет через ON-LINE системы, такие как AOL, Compuserve, Sprynet, Netcom и т.д..., то тогда у вас может и НЕ БЫТЬ фиксированного IP-адреса. Это доставит немного неудобств, но, тем не менее, ваша интрАнет-сеть будет связана с внешним миром. Если вы мне не верите, то прошу - дочитайте руководство до конца... и поверьте....


Несколько отступлений

(Для тех, кто по природе таков, как я, и кому интересно, что же тут происходит...). Остальные могут пропустить этот раздел....

  1. ... так как у нас имеется ТОЛЬКО одна сеть ethernet, вам НЕТ необходимости обеспечивать маршрутизацию внутри сети. Возможно, вы уже вручную назначили IP-адреса ВСЕМ вашим компьютерам ( 10.0.1.1, 10.0.1.2 ) в /etc/hosts. Если вы это сделали, то вы, наверняка, очень умный человек. Так делать в домашней сети из двух или трех компьютеров - все равно, что использовать бульдозер, вместо обеденной ложки...
  2. В идеальном случае, желательно, чтобы ВСЕ IP-пакеты с клиентских машин шли на LINUX, который затем их бы правильно перенаправлял. Тут проблема может быть только в том, что такой компьютер легко подвергается хакерским атакам, ибо, если LINUX-машина обеспечивает маршрутизацию, то у вас НЕТ "firewall" или "proxy" или еще чего-то подобного. Следуя данному руководству, мы непреднамеренно! создаем "firewall", во время попытки дать навигатору NETSCAPE доступ в интернет с клиентских машин.

    Единственная проблема с такой "маршрутизацией" с linux-машины состоит в том, что клиенты ДОЛЖНЫ в действительности ПОСЫЛАТЬ ВСЕ пакеты на linux, неважно, на какой адрес эти пакеты идут. В таком случае с Win95 и WinNT можно использовать ТОЛЬКО "proxy сервер" ("Руководство" о работе с ним мне еще предстоит написать).

  3. ЕСЛИ вы свободно работаете с разнообразными утилитами, то вы наверняка слышали о пакете "term". Он был разработан для простого конфигурирования сетей, будучи "простым" пользователем, а НЕ администратором (ROOT/ADMIN) - и на сервере, и на клиентских машинах. Подобную логику действий можно распространить и на использование NETSCAPE на клиентских машинах. Ведь, в принципе, легко всего лишь ДАТЬ навигатору доступ в интернет, а остальные возможности (FTP, TELNET) не реализовывать.
  4. Если вы считаете, что ДОСТАТОЧНО дать доступ навигатору Netscape в интернет и НЕ разрешать использовать telnet / ftp с машин-клиентов, то вы сущий динозавр. Проснитесь, мистер-мисс Rip Van Winkle.
  5. (ТЕХНИЧЕСКОЕ) Использование возможности вручную назначать ("поименованно") IP-адреса, которая должна было быть незадействована (как упоминалось выше) будет использоваться для поддержки NETSCAPE (так, чтобы адреса типа http:/www.sex.org могли быть нормально доступны с машин-клиентов).
  6. (ТЕХНИЧЕСКОЕ) Вам придется ПЕРЕСОБРАТЬ ядро LINUX для отключения пересылки IP-пакетов (IP forwarding). Позже я попробую пересобрать у себя ядро с включенной данной опцией, и пакеты "socks" будут работать (а я полагаю, что так и будет). Если все будет нормально, то тогда вы точно увидите новую версию данного документа. (Что это означает - то, что тогда вы сможете использовать основную версию своего ядра, установленную программой инсталляции).
  7. Вам будет необходим доступ АДМИНИСТРАТОРА (ROOT) к linux-машине :-) так как будет необходимо скачать пакет "socks" и ОТКОМПИЛИРОВАТЬ его. Он НЕ будет сразу нормально компилироваться, ибо MAKE-файл в пакете поставки поврежден.
  8. (ТЕХНИЧЕСКОЕ) Будьте готовы подредактировать файл socks.c, для закомментирования ВСЕГО двух строк, которые помещают в файл журналов (/var/adm) информацию о каждой пересылке данных через socks. Например: простая страничка на WWW.CNN.COM имеет по меньшей мере 10 картинок и около 5 отдельных текстовых объектов. Для каждого из них вы получите строку в файле журнала. Лично мой файл журналов переполняется. И мне это совсем НЕ нравится. Хотя, возможно, вы об этом и не думаете.
  9. Пакет "sockd" необходим ТОЛЬКО для машин-КЛИЕНТОВ. ВСЕ приложения на LINUX-машине НЕ НУЖДАЮТСЯ в этом пакете, или еще в чем-то для доступа в интернет, ибо наша LINUX-машина подключается к интернет напрямую, используя PPP.

ПОДГОТАВЛИВАЕМ LINUX-КОМПЬЮТЕР

Читайте "Руководство по использованию Сети" на /usr/doc/faq/howto на вашей linux-машине (если у вас стоит slakware-версия), или отправляйтесь на www.linux.org и там читайте это же руководство (NET-HOW-TO) там...

Теперь вам необходимо скачать и скомпилировать пакет socks. Перед этим НЕОБХОДИМО ПРОЧИТАТЬ инструкции по установке и настройке домашней сети. Но, в принципе, можно читать и ЭТО описание :-) .

В сопроводительном документе к пакету будет много написано о том, как настроить UNIX-клиенты. Особенно для "rlogin" "telnet" "ftp" и т.п.... Если у вас нет UNIX-клиентов, то после компиляции пакета SOCKS прочтите ДАННОЕ руководство сначала, так как необходимо будет использовать SOCKS немного не так, как написано в руководстве к пакету.

Я поместил tar-архив в каталог /usr/local/ProxyServer, распаковал, создав каталог "sockd4.2b", внутри которого и лежит файл для компиляции ("Makefile"). Как уже упоминалось выше, необходимо немного помучиться, чтобы успешно скомпилировать данный MAKEFILE.


Для вашего удобства в КОНЦЕ данного руководства приведен мой MAKEFILE.

Надо надеяться, что вам придется поменять в нем только строку #9.


Итак, затем я переместил содержимое нового "sockd"-каталога на один уровень вверх, поменял содержание строки # 9 и запустил компиляцию по новой -- на этот раз успешно. На этом "починку" нашего MAKEFILE считаем оконченной.

Настройка sockd

В каталоге sockd вы найдете исполняемый файл "sockd".

Как только вы закончите компиляцию, СКОПИРУЙТЕ следующие файлы в  /usr/local/etc
(Они ДОЛЖНЫ быть в том же каталоге sockd)
        sockd                   (Исполняемый файл, т.н. демон)
        sockd.conf              (файл конфигурации)
        sockd.route             (файл конфигурации)
        socks.conf              (файл конфигурации)

# ### создайте сслыку с названием "socks", которая указывает на "sockd" в том-же каталоге.
# cd /usr/local/etc
# ln -s sockd socks
Далее отредактируйте эти три файла конфигурации так, чтобы их содержимое соответствовало нижеприведенным примерам (это мои настройки для сети из двух компьютеров, состоящей из LINUX-"сервера" и Win95/WinNT машины-клиента).

Мой файл sockd.conf


permit  10.0.1.2    0.0.0.0
deny    0.0.0.0 0.0.0.0 : /usr/ucb/finger @%A | /usr/ucb/mail -s 'SOCKD: rejected -- from %u@%A to host %Z (service %S)' root
#BAD_ID: /usr/ucb/finger @%A | /usr/ucb/mail -s '%U pretends to be %u on host %A' root@%A root
#NO_IDENTD: /usr/ucb/mail -s 'Please run identd on %A' %u@%A root@%A
#[EOF]

ПРИМЕЧАНИЕ: 10.0.1.2 - это IP-адрес моей Win95/WinNT-машины-клиента. Этот файл sockd.conf ДОЛЖЕН присутствовать на сервере LINUX (в моем случае, порту ethernet сервера LINUX был назначен IP-адрес = 10.0.1.1)

ПРИМЕЧАНИЕ: Пакет "sockd" необходим ТОЛЬКО для машин-КЛИЕНТОВ. ВСЕ приложения на LINUX-машине НЕ НУЖДАЮТСЯ в этом пакете, либо еще в чем-то, для доступа в интернет, ибо наша LINUX-машина подключается к интернет напрямую, используя PPP.


Мой файл sockd.route

#! NoShell
10.0.1.1        10.0.1.0        255.255.255.0
#[EOF]
ПРИМЕЧАНИЕ: Первый IP-адрес - это адрес ПОРТА eth0 сервера LINUX. Второй номер - это НЕ АДРЕС IP -- это адрес СЕТИ (для простоты, последний из четырех номеров IP-адреса должен быть НУЛЕМ).

Мой файл socks.conf

direct  127.0.0.1       255.255.255.255
direct  10.0.1.1        255.255.255.255
direct  10.0.1.2        255.255.255.255
sockd   @=199.99.99.99  10.0.1.1 0.0.0.0



Настройка LINUX-компьютера


Файл /etc/host.conf

ВСЕ программы, запускаемые на компьютере с LINUX БУДУТ (и вы не сможете помешать этому) использовать resolver, настройки которого находятся в файле /etc/host.conf

Вы должны быть уверены, что НИ ОДНА из этих программ никогда не получит доступа к демону "named" на ЭТОЙ САМОЙ машине с linux. Для этого мы определим для сервиса имен (то есть программ, преобразующих www.cnn.com в числовой IP-адрес), что они ДОЛЖНЫ проверять сначала файл /etc/hosts, и только затем проверять сервера DNS, указанные в файле /etc/resolv.conf

Как это сделать? Просто! Проверьте, что содержимое в файла /etc/host.conf написано следующее:

                order hosts, bind
                multi on
Если там что-то другое, удалите все (конечно, если вы ОЧЕНЬ много знаете о DNS и "named", то тогда вы сделаете по своему).

Причина, по которой я настаиваю на недопуске программ LINUX-машины к собственному "named"-серверу, состоит в том, что это просто не нужно. А по моему опыту подобные "ненужности", выглядящие технически и программно безопасными, могут рано или поздно причинить много неприятностей...

Сервер linux отлично делает свою работу по подсоединению к internet через PPP (или тот тип связи, что присутствует у вас) Мы дополнительно устанавливаем пакет "sockd" и "named"-демон для машин-клиентов. И давайте больше не будем напрягать LINUX-систему.


Вам НЕ НАДО менять файлы "/etc/gateways" или "/etc/hosts" или "hosts.allow" или "hosts.deny" для того, чтобы заставить работать socks.

Не меняйте никакие файлы до тех пор, пока кто-либо не предложит что-то поменять...

Я также полагаю, что вы корректно настроили "resolv.conf", чтобы ваш LINUX-сервер имел доступ к internet и DNS (на "другом конце" соединения PPP). Мой пример файла resolv.conf вы можете увидеть в самом конце данного руководства.


                ************************************************
                                ПРЕДУПРЕЖДЕНИЕ
                ************************************************
                 Для вашей собственной безопасности, я предлагаю
                менять настройки вашей системы linux только через
                системную программу конфигурации (т.е., например,
                во время установки linux на ваш компьютер)
                *************************************************

Мой файл named.boot

        ;    загрузочный файл для сервера имен
        forwarders 128.112.129.111
        directory /etc
        cache      .       root.cache
        primary    1.0.10.in-addr.arpa   named_DNS_for_inTi_xwk
                                         ^^^^^^^^^^^^^^^^^^^^^^
ПРИМЕЧАНИЕ: строка # 2 содержит IP-адрес сервера DNS сети, к которой подключается ваша LINUX-машина, используя PPP (или ему подобную связь).

*** КАК найти этот IP-адрес ****

ЛЕГКО! в командной строке наберите "nslookup". В выданном ответе БУДЕТ указан этот адрес IP. (После того, как вы запишете IP-адрес сервера DNS, выйдите из "nslookup", нажав клавиши <CTL-D>).

ПРИМЕЧАНИЕ: ПОСЛЕДНЯЯ строка содержит имя файла, называемого "named_DNS_for_inTi_xwk', который ДОЛЖЕН быть в каталоге "/etc". Содержание этого файла приводится ниже (вообще-то, вы можете придумать ему более интересное название :-) )


Мой файл "named_DNS_for_inTi_xwk"

@               IN      SOA     10.0.1.0 hostmaster.10.0.1.0 (
                                1       ; Серийный
                                28800   ; Обновление
                                7200    ; Повтор
                                604800  ; Окончание
                                86400)  ; Минимальное TTL
                        NS      10.0.1.1
1                       PTR     MyLinuxMachine
ПРИМЕЧАНИЕ: Последняя строка (начинающая с 1) содержит имя "MyLinuxMachine". Замените его строкой из /etc/HOSTNAME. ПРИМЕЧАНИЕ: Также, если вы уж зашли настолько далеко, то поменяйте "10.0.1.1" на адрес порта eth0 вашей LINUX-машины, и замените "10.0.1.0" на сетевой адрес этого порта. 
ПРИМЕЧАНИЕ
: Лично я до сих пор не понимаю всех вещей из вышеописанных файлов. Для удовлетворения вашего любопытства вам придется изучить много документации по демону NAMED.

Мой файл root.cache

Для создания этого файла внимательно читайте руководство по настройке сетей (NET-HOW-TO) и сопровождающую документацию к пакету socks.

Эти инструкции ОЧЕНЬ просты...

Все, что мне надо было сделать, это запустить команду, указанную там, а полученную информацию перенаправить в файл и назвать его "/etc/root.cache"

; <<>> DiG 2.1 <<>> ns
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6
;; flags: qr rd ra; Ques: 1, Ans: 9, Auth: 0, Addit: 9
;; QUESTIONS:
;;      ., type = NS, class = IN

;; ANSWERS:
.       137030  NS      C.ROOT-SERVERS.NET.
.       137030  NS      D.ROOT-SERVERS.NET.
.       137030  NS      E.ROOT-SERVERS.NET.
.       137030  NS      I.ROOT-SERVERS.NET.
.       137030  NS      F.ROOT-SERVERS.NET.
.       137030  NS      G.ROOT-SERVERS.NET.
.       137030  NS      A.ROOT-SERVERS.NET.
.       137030  NS      H.ROOT-SERVERS.NET.
.       137030  NS      B.ROOT-SERVERS.NET.

;; ADDITIONAL RECORDS:
C.ROOT-SERVERS.NET.     410161  A       192.33.4.12
D.ROOT-SERVERS.NET.     410161  A       128.8.10.90
E.ROOT-SERVERS.NET.     410161  A       192.203.230.10
I.ROOT-SERVERS.NET.     167767  A       192.36.148.17
F.ROOT-SERVERS.NET.     410161  A       192.5.5.241
G.ROOT-SERVERS.NET.     410161  A       192.112.36.4
A.ROOT-SERVERS.NET.     410161  A       198.41.0.4
B.ROOT-SERVERS.NET.     410161  A       128.9.0.107
H.ROOT-SERVERS.NET.     410161  A       128.63.2.53

;; Total query time: 334 msec
;; FROM: svathyam to SERVER: default -- 128.112.129.111
;; WHEN: Sat Sep 28 21:38:04 1996
;; MSG SIZE  sent: 17  rcvd: 312

Добавьте это в /etc/services

(добавьте единственную строку начинающуюся с "socks"...)

# services      This file describes the various services that are
#               available from the TCP/IP subsystem.  It should be
#               consulted instead of using the numbers in the ARPA
#               include files, or, worse, just guessing them.
# Version:      @(#)/etc/services       3.02    02/21/93
# Author:       Fred N. van Kempen, 

... &LT;lines delete&GT;

socks           1080/tcp                        # sarma: Sep.15.96: Получено из файла ~sockd/include/socks.h

... &LT;lines delete&GT;

# End of services.
ПРИМЕЧАНИЕ: по-моему, эта строка считывается ТОЛЬКО демоном "inetd". Она указывает inetd включить программу "socks" для всех tcp-соединений к порту # 1080.

Добавьте это в файл /etc/inetd.conf

        # Я всего-лишь следую инструкциям из руководства к ~sockd/doc/sockd.1 ...
        socks   stream  tcp     nowait  root    /usr/local/etc/socks



НУ ЧТО, НАЧНЕМ РАБОТУ!

Теперь перезагрузим вашу систему (если вы знаете как, то можете просто послать "HUP" демонам). Ваш LINUX-сервер готов к работе.

Исполните "tail -f /var/adm/messages" и одновременно "tail -f /var/adm/syslog" и попытайтесь присоединиться к интернет навигатором NETSCAPE с машины-клиента.

Теперь давайте настроим навигатор Netscape на машинах-клиентах...


Настройка клиента NETSCAPE 3.0

Это ДОЛЖНО быть сделано ТОЛЬКО на машинах-клиентах!
НЕ НАДО пытаться делать все это на сервере LINUX.

        --------- --------------------------              --------
        | socks | |                        |              | 1080 |
        --------- --------------------------              --------
Это указывает на то, что netscape уже знает о наличии socks. Все, что вам необходимо сделать, это указать NETSCAPE, где именно запускается демон socks.

Введите IP-адрес порта eth0 сервера linux в среднее поле, показанное выше...

Сохраните эти настройки и продолжайте работу... !!




ДЛЯ НОВИЧКОВ В ОБЛАСТИ КОМПЬЮТЕРНЫХ СЕТЕЙ

Если вы уже использовали компьютеры с Win95 или WinNT для соединения к интернет через PPP, то этот документ НИЧЕМ вам не поможет. Зачем загружать вас использованием linux для соединения с интернет, когда вы и так уже сделали это через PPP-соединение на машине-клиенте?

Если вы НЕ можете соединиться с интернет через сервер LINUX, то прекратите чтение этого руководства и ищите другие руководства по настройке LINUX-машин для PPP-соединения к интернет.

Я надеюсь, что вы знаете концепцию IP-адресации. Вкратце, все IP-адреса имеют "мнемоническое" название (типа www.cnn.com) и числовое, типа "198.20.186.4". Если вы указываете адрес вида "www.cnn.com", то кто-то должен ПОМОЧЬ вашему компьютеру конвертировать эту строку в числовой формат.

Почему числовой формат? Потому, что числовой формат гораздо эффективнее - он сообщает каждому компьютеру, КАК переслать информационный пакет другому компьютеру, с которым ОН ХОЧЕТ УСТАНОВИТЬ СВЯЗЬ.

Поэтому, когда вы пишете "www.cnn.com" в окне адреса NETSCAPE-навигатора, UNIX-компьютер вызывает "DNS-сервер", который преобразует эту строку (название) в числа, понятные вашему компьютеру. Далее ваш ПК использует эту числовую версию IP-адреса для СОЕДИНЕНИЯ с www.cnn.com и покажет вам их последние новости.

В итоге, дела обстоят так: для использования интернет вам нужен DNS-сервер. Данный документ содержит инструкции о том, как заставить ваш компьютер СВЯЗАТЬСЯ с соседним DNS-сервером.

Ваш LINUX-сервер ДОЛЖЕН иметь все нижеперечисленное:

  1. Модем, через который вы можете *** НАПРЯМУЮ *** подключаться к ИНТЕРНЕТ
  2. Сетевую ethernet-карту, к которой подключен сетевой кабель (к которому подключены машины-клиенты...)
  3. Работающее PPP соединение.
  4. ПРАВИЛЬНУЮ информацию о DNS сервере (используйте nslookup --- если эта программа выдает ерунду, то прекратите читать это руководство. Вы НЕ МОЖЕТЕ нормально продолжать работу...)
  5. Навигатор Netscape 2.0 или более поздние версии на ваших машинах-клиентах.
Под "модемом" здесь и далее имеется ввиду обращение к порту "ppp0". Под словом "порт" тут подразумевается нечто, похожее на "Морской Порт". Наш модем (или PPP порт) позволяет вам "исследовать мир" (отправиться в "путешествие" от будничных берегов) :-)

Сетевая "ethernet карта" - это ваш "eth0" порт. Этот ethernet-"порт" позволяет вам исследовать сеть ethernet, к которой он присоединен.

Ваша машина-клиент подсоединена к LINUX-серверу через сетевой кабель, то есть ВСЕ, что ваша машина-клиент пошлет серверу, достигнет linux ТОЛЬКО ЧЕРЕЗ порт "eth0". ВСЕ, что внешний мир присылает вашему LINUX-серверу, придет на него ТОЛЬКО через порт ppp0. ПОЭТОМУ очень важно, чтобы эти два порта имели "РАЗНЫЕ АДРЕСА".

Проще говоря, если вы УЖЕ успешно соединились с внешним миром через PPP, то вы уже НЕПРЕДНАМЕРЕННО (или намеренно 8-) ) назначили числовой IP-адрес PPP-порту вашей linux-машины.


MAKEFILE для компиляции sockd

        SHELL=/bin/bash
        #SOCKS=-DSOCKS
        # или
        SOCKS=-Dconnect=Rconnect -Dgetsockname=Rgetsockname -Dlisten=Rlisten -Daccept=Raccept -Drcmd=Rrcmd -Dbind=Rbind -Dselect=Rselect
        CFLAGS="$(SOCKS)"

        # Если ваша система не имеет отпределенных PWD, то определите их тут:
        PWD="/usr/local/ProxyServer/socks42b"
        # Это должна быть данный (текущий) каталог.

        # Если ваша система уже имеет getcwd(), но не имеет getwd(), то раскомментируйте следующую строку:
        #GETCWD=-DGETCWD

        # Определите FASCIST, если вы хотите, чтобы ftp (rftp) отслеживала в файле логов все переданные файлы
        #FASCIST=-DFASCIST

        # Определите RCMD и SUPPORT_RCMD, если вы хотите поддерживать Rrcmd, что необходимо
        # для SOCKSified rlogin, rsh, и rcp.
        RCMD=Rrcmd.o
        SUPPORT_RCMD=-DSUPPORT_RCMD

        # Определите FOR_PS, если ваша система не SYSV а вы хотите, чтобы команда
        # 'ps' показывала некоторую информацию об активности sockd.
        FOR_PS=-DFOR_PS

        # Определите SHORTENED_RBIND для того, чтобы Rbind() брал точно такие-же
        # параметры, как и простой bind(), т.е. без дополнительного параметра 'remhost'
        SHORTENED_RBIND=-DSHORTENED_RBIND

        # флаги оптимизации для cc
        #OPTIMIZE=-g
        OPTIMIZE=-O6 -fomit-frame-pointer -pipe -m486
        # Будьте аккуратны с флагами OPTIMIZE. Например, известно, что SC2.0.1 от SunPro,
        # выдает некорректный код если используестя флаг -O.

        # Каталог, в который устанавливаются руководства
        MAN_DEST_DIR = /usr/local/man

        # Каталог, в который устанавливается пакет сервера SOCKS
        SERVER_BIN_DIR = /usr/local/ProxyServer
        ## По умолчанию здесь было /usr/local/etc

        # Каталог, в который устанавливается программа-клиент
        CLIENTS_BIN_DIR = /usr/local/ProxyServer
        ## По умолчанию здесь было /usr/local/bin

        # LINUX должен использовать
        CC=gcc
        RANLIB=ranlib
        RESOLV_LIB=
        #OTHER_CFLAGS=-traditional -DLINUX  $(GETCWD) $(FASCIST) $(SHORTENED_RBIND) -DCOMPAT
        OTHER_CFLAGS=-DLINUX  $(GETCWD) $(FASCIST) $(SHORTENED_RBIND) -DCOMPAT
        OS=linux
        INSTALL=install
        GETPASS=getpass.o

        # Не забудьте включить -Dindex=strchr -Drindex=strrchr в OTHER_CFLAGS, если
        # вы не имеете index() и rindex() (Sys-V camp)

        # <<<----------------

        # Сервер Internet Whois ; в данном случае nic.ddn.mil.
        WHOIS_SERVER= WHOIS_SERVER=-DWHOIS_SERVER\'=\"rs.internic.net\"\'

        SOCKS_LIB=$(PWD)/lib/libsocks.a
        IDENT_LIB=$(PWD)/libident/libident.a

        all: LIB LIBIDENT server clients

        server: LIB LIBIDENT
                (cd sockd; $(MAKE) CC="$(CC)" RESOLV_LIB="$(RESOLV_LIB)" \
                        OPTIMIZE="$(OPTIMIZE)" \
                        SOCKS_LIB="$(SOCKS_LIB)" SUPPORT_RCMD="$(SUPPORT_RCMD)" \
                        IDENT_LIB="$(IDENT_LIB)" \
                        OTHER_CFLAGS="$(OTHER_CFLAGS) $(FOR_PS)")

        clients: RFINGER RFTP RTELNET

        LIB:
                (cd lib; $(MAKE) CC="$(CC)" GETPASS="$(GETPASS)" \
                        OPTIMIZE="$(OPTIMIZE)" \
                        RCMD="$(RCMD)" SUPPORT_RCMD="$(SUPPORT_RCMD)" \
                        OTHER_CFLAGS="$(OTHER_CFLAGS) " RANLIB="$(RANLIB)")

        LIBIDENT:
                (cd libident; $(MAKE) CC="$(CC)" OTHER_CFLAGS="$(OTHER_CFLAGS)" \
                        OPTIMIZE="$(OPTIMIZE)" RANLIB="$(RANLIB)")

        RFINGER: LIB
        # This also build rwhois
                (cd rfinger; $(MAKE) CC="$(CC)" $(WHOIS_SERVER) \
                        OPTIMIZE="$(OPTIMIZE)" SOCKS="$(SOCKS)" \
                        RESOLV_LIB="$(RESOLV_LIB)" SOCKS_LIB="$(SOCKS_LIB)" \
                        OTHER_CFLAGS="$(OTHER_CFLAGS) ")

        RTELNET: LIB
                (cd rtelnet; $(MAKE) CC="$(CC)" OS="$(OS)" SOCKS_LIB="$(SOCKS_LIB)" \
                        OPTIMIZE="$(OPTIMIZE)" SOCKS="$(SOCKS)" \
                        RESOLV_LIB="$(RESOLV_LIB)" OTHER_CFLAGS="$(OTHER_CFLAGS)")

        RFTP: LIB
                (cd rftp; $(MAKE) CC="$(CC)" SOCKS_LIB="$(SOCKS_LIB)" \
                        OPTIMIZE="$(OPTIMIZE)" SOCKS="$(SOCKS)" \
                        RESOLV_LIB="$(RESOLV_LIB)" OTHER_CFLAGS="$(OTHER_CFLAGS)")

        install.server:
                (cd sockd; $(MAKE) INSTALL="$(INSTALL)" MAN_DEST_DIR="$(MAN_DEST_DIR)" \
                        SERVER_BIN_DIR="$(SERVER_BIN_DIR)" install install.man)

        install.clients: install.man
                for i in rfinger rftp rtelnet; do \
                        (cd $$i ; $(MAKE) INSTALL="$(INSTALL)" \
                                CLIENTS_BIN_DIR="$(CLIENTS_BIN_DIR)" \
                                install) done
        install.man:
                (cd doc; $(MAKE) INSTALL="$(INSTALL)" MAN_DEST_DIR="$(MAN_DEST_DIR)" \
                        install)

        clean:
                for i in lib libident sockd rfinger rftp rtelnet ; do \
                        ( cd $$i ; $(MAKE) clean) done

Скрипт установления PPP-соединения

ПРИМЕЧАНИЕ: Этот скрипт приведен здесь только как пример. Если вы будете использовать этот файл, то вам не гарантировано успешное соединение с интернет.
        #!/bin/csh
        #
        #       ppp-on
        #
        #       Установка соединения PPP

        set LOCKDIR=/var/spool/uucp
        set DEVICE=cua3

        set OUR_IP_ADDR=128.000.111.222

        if ( -f $LOCKDIR/LCK..$DEVICE ) then
            echo 'PPP device is locked'
            exit 1
        endif

        route del default
        # Только для случая, если внутренняя сеть (etherNetwork) работает....
        #       если она НЕАКТИВНА, то вышеуказанные команды абсолютно безопасны...
        route ## Чтобы показать, что исполнение команд прошло успешно...

        /usr/lib/ppp/fix-cua $DEVICE

            unalias pushd
            unalias popd
            pushd /usr/lib/ppp
            # stty 19200 -tostop

            # Ниже закомментированы строки программы по умолчанию ...
            # if chat -l LCK..$DEVICE ABORT "NO CARRIER" ABORT BUSY "" ATZ OK ATs50=255s111=0DT$PHONE CONNECT "" ogin: $USER ssword: \\q$PASSWORD
            echo $cwd
            ls -l ./comserv.dip
            dip ./comserv.dip       ## I removed the -v (DEBUG&VERBOSE) option to 'dip'.
            set dip_status=$status
            # echo the return value of dip is $dip_status
            # echo значение переменной dip есть $dip_status

            if $dip_status == '0' then
                # Now please wait for 10 seconds, while the link is being auto-verified by dip.
                echo 'About to fork-off pppd (after a delay of 10 secs)...'
                echo 'Запуск в параллельном режиме pppd (после задержки в 10 секунд)...'
                date
                echo 'If you see any error msgs below, then we are having SERIOUS problems...'
                echo 'Если вы увидите далее какие-либо сообщения об ошибках, то у нас СЕРЬЕЗНЫЕ проблемы...'
                sleep 10
                pppd -detach crtscts defaultroute domain remote.princeton.edu mru 1005 mtu 1005 $OUR_IP_ADDR{}: /dev/$DEVICE 38400 &
                ###### нам не нужно исполнять ЭТО (есть предыдущие строки...)    < /dev/$DEVICE > /dev/$DEVICE ) &
                #    Демон pppd запущен в параллельном режиме.  Видите "&" в КОНЦЕ предыдущей строки...
                # Использую опцию "locl", мы требуем чтобы каталог /var/spool/uucp был тем самым
                #    каталогом, в котором создавались LOCKS...
                echo 'Now wait another 10 seconds, before I auto-verify internet connection.'
                echo 'Ждем 10 секунд перед проверкой соединения с интернет.'
                sleep 10
                cat ~root/@utils/.line
                ping -v -c 5 genius.eng.wayne.edu
                cat ~root/@utils/.line
                traceroute physics.iisc.ernet.in >&! /tmp/$$
                                                cat  /tmp/$$
                                                \rm -f /tmp/$$
                cat ~root/@utils/.line
                exit 0
            else
                echo 'PPP setup failed'
                exit 1
            endif
            popd
        # [EoF]

Скрипт comserv.dip установления PPP-соединения

ПРИМЕЧАНИЕ: Этот скрипт приведен здесь только как пример. Если вы будете использовать этот файл, то вам не гарантировано успешное соединение с интернет. Данный сценарий вызывается из "Скрипта PPP-подключения", приведенном выше...

        #******************************** comserv.dip ********************************
        #
        # Скрипт соединения SLIP ........
        # коды ВОЗВРАТА этого скрипта при запуске "dip":
        #  0 - все нормально.
        #  1 - небольшие ошибки при инициализации модема.
        #  2 - ошибка при исполнении команды "dial".
        #  3 - Хоть команда DIAL и выполнена успешно, этот скрипт не смог распознать
        #      САМЫЙ ПЕРВЫЙ ответ от другого модема. То есть было попытка связаться
        #      заново, хоть ничего ошибочного для скрипта не произошло.
        #  4 - Модемы прекрасно могут установить соединение.  Но удаленный сервер
        #      ПОМЕНЯЛ синтакс или последовательности при обмене данными,
        #      т.е. исходящие от удаленного сервера строки приходят
        #      частично. Возможно, поменялось программное обеспечение на сервере, тогда
        #      и может произойти такая ошибка. РЕШЕНИЕ!!! Соединитесь вручную и запишите
        #      себе строки, показываемые при соединении, содержащие &
        #      Затем перепишите данный скрипт.
        # 10 - хотя и дозвон, и обмен данными между модемами прошли успешно,
        #      установить PPP-соединение не удалось
        ############################################################################
        main:
        redial:
          # Установка серийного порта и скорости.
          port cua3
          speed 38400
          # term
          get $mtu 1005
          # Сброс модема и линии.
          reset
          # Без исполнения предыдущего сброса, НИЧЕГО дальше работать не будет!
          # Инициализация модема и дозвон на comserv.
          # send ATQ0V1E1X4L1S0 0 \r
          # wait OK 5
          send ATZ\r
          wait OK 5
          if $errlvl != 0 goto error
          # send ATTQ0V1E1X4S0=0&C1\r
          # wait OK 5
          # if $errlvl != 0 goto error
          ## For Dial Tone use :- send AT&D2\r
          send AT&DP\r
          wait OK 5
          if $errlvl != 0 goto error
          # send ATS10=1\r
          # wait OK 5
          # if $errlvl != 0 goto error
          print if the line is busy, the dial command will realize that after 30 secs ONLY.
          print если линия занята, то команда dial определит это ТОЛЬКО через 30 секунд.
          dial 258-0000   30
          print Return value of DIAL is $errlvl
          print Значение переменной DIAL есть $errlvl
          if $errlvl == 1 goto Continue1
          if $errlvl == 3 goto busy
          print unknown error with DIAL command in "dip" script.
          print неизвестная ошибка с командой DIAL в скрипте "dip".
          quit 2 # ошибка при исполнении команды "dial"...
        busy:
          print telephone number is busy... Continue (1) or terminate (2)?
          print телефонная линия занята... Продолжить (1) или отменить (2)?
          get $input ask
          if $input == 1 goto redial
          print You have requested to cancel PPP.  Quitting...
          print Вы решили отменить PPP.  Завершаем работу...
          quit 10 # конец работы...
        Continue1:
          # wait V32 30
          # wait CONNECT 10
          # if $errlvl != 0 print Couldn't detect a CONNECT
          # if $errlvl != 0 goto connect_fail
          # print CONNECT was detected...
          # print определен CONNECT...
          # Мы соединились.  Начинаем входить в систему.
        login:
          sleep 3
          # send \r\r
          wait Username: 20
          if $errlvl != 0 goto error2
          send USERID\r
          wait Password: 5
          if $errlvl != 0 goto error2
          send __Password+_::\r\r
          wait comserv> 15
          # print Reached Comserv prompt...
          # print Достигли Comserv...
          if $errlvl != 0 goto error2
        slipon:
          send ppp\r
          wait PPP_STARTED 25
          if $errlvl != 0 goto error2
          print CONNECTION completed...
          print Завершен сеанс СВЯЗИ...
          mode ppp
          exit 0
        error:
          print Total failure to interact with MODEM!!!
          print Глобальная ошибка при обращении к МОДЕМУ!!!
          quit 1 # ошибки при инициализации модема и т.п....
        connect_fail:
          print Couldnt detect a "CONNECT 14400" kind of string after dial in...
          print Не могу найти строку типа "CONNECT 14400" после дозвона...
          quit 3
        error2:
          print Modems could nicely link up.  But remote server HAS CHANGED syntax/ interaction sequence...
          print Модемы прекрасно могут установить соединение.  Но удаленный сервер ПОМЕНЯЛ синтакс или последовательность при обмене данными...
          quit 4 # ошибки при инициализации модема и т.п....
        #=================================== EOF ===================================

Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

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

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу