\chapter{Връзка към Internet}

FIXME: В \hlink{Debian GNU/Linux Internet
  Server}{http://documents.made-it.com/Debian\_Internet\_Server/Debian\_Internet\_Server.html}
в лаконичен стил е описано конфигурирането на Интернет сървър.  В
\hlink{Guide to IP Layer Network Administration with
  Linux}{http://linux-ip.net/} ще намерите добро описание на
маршрутизиращите способности на Linux, както и на употребата на
\deb{iproute}.  В \hlink{Traffic Control
  HOWTO}{http://linux-ip.net/articles/Traffic-Control-HOWTO/} се
намира много добра документация за управление на трафика под Linux.

\section{PPP връзка към Internet}
\subsection{\textit{pppconfig}}


Ако нямате инсталиран \man{pppconfig}{8}, то поставете CDROM диска и
го добавете с:

\begin{verbatim}
# apt-cdrom add
\end{verbatim}


Инсталирайте пакета \deb{pppconfig}.

\begin{verbatim}
# apt-get update && apt-get install pppconfig
\end{verbatim}


Като root изпълнете командата:
\begin{verbatim}
# pppconfig
\end{verbatim}


Ако не сте root в момента, можете да използвате командата:
\begin{verbatim}
$ su
\end{verbatim}
и след това да въведете паролата на суперпотребителя. Забележете, че така
нареченият \textit{prompt} се променя от
\begin{verbatim}
$
\end{verbatim}
за обикновения потребител (най-често използваният символ, но може да се срещнат и
други), на
\begin{verbatim}
#
\end{verbatim}
за root.


След изпълняването на pppconfig се зарежда главното меню:


\begin{center}
Main Menu\\
bla bla bla bla bla\\
bla bla bla bla bla\\
\begin{tabular}{|c|c|}
\hline Create & Create a connection\\
\hline Change & Change a connection\\
\hline Delete & Delete a connection\\
\hline Quit   & Exit this utility\\
\hline
\end{tabular}
\end{center}


Избираме \textbf{Create}, за да създадеме нова връзка към някой доставчик на
Интернет.


\textbf{\textit{1.Provider name}}

Тук се въвежда името на доставчика, който ще бъде използван. По подразбиране това
име е \textit{provider} (това ще използваме и в този пример). Може да бъде
използвано и друго име, и свързването към този доставчик ще се осъществява с
командата:
\begin{verbatim}
#  pon име_на_конекцията
\end{verbatim}
Затова е препоръчително конекцията (или връзката - connection), която ще използвате
най-често, да се казва provider, за да може свързването да се осъществи само с
командата pon. (!името на конекцията не трябва да съдържа интервали!)


\textbf{\textit{2.Configure Nameservers (DNS)}}

Изберете \textbf{Dynamic} (върши работа в повечето случаи) --- маркирайте с клавиша
за интервал (Space) и след това чрез клавиша Tab отидете на \textbf{<Ok>} и
потвърдете с Enter. (!за повече информация четете текста под заглавието на
менютата!)


\textbf{\textit{3.Authentication Method for provider}}

Най-често това е \textbf{PAP}. Ако знаете със сигурност кой метод използва Вашият
доставчик, изберете го.


\textbf{\textit{4.User name}}

Изтрийте примерния текст и въведете Вашето потребителско име (user name).


\textbf{\textit{5.Password}}

Изтрийте примерния текст и въведете Вашата парола (password).


\textbf{\textit{6.Speed}}

Няма проблем да оставите вече указаната стоиност (115200). В някои случаи даже е
по-добре.


\textbf{\textit{7.Pulse or Tone}}

Тук се указва вида на набиране - пулсово или тоново. Повечето телефони използват
тоново, така че ако не сте сигурни, че Вашият използва пулсово, маркирайте с
помощта на клавиша Space опцията \textbf{Tone}. След това чрез Tab маркирайте
\textbf{<Ok>} и Enter.


\textbf{\textit{8.Phone Number}}

Изтрийте примерния текст и на негово място въведете номера на Вашия доставчик (!без
тирета, например, 823746).


\textbf{\textit{9.Choose Modem Config Method}}

Тук се указва на кой порт е свързан модема Ви. Под Windows наименованията са COM1,
COM2{\ldots} , а съответсващите им под Linux са ttyS0, ttyS1 (!имайте предвид, че 
Debian прави разлика между главни и малки букви, тоест между ttyS1 и ttys1!). Ако под
Windows модема Ви е закачен за COM1, то под Linux можете да го намерите на
/dev/ttyS0. Сега да зададем към кой порт е свързан модемът. Ако отговорите на това
меню с \textbf{<Yes>}, ще бъде направена автоматична проверка, тоест Debian ще опита
сам да открие модема Ви. Ако отговорите с \textbf{<No>}, ще имате възможност ръчно
да зададете порта.


В този пример ще изберем \textbf{<Yes>}. След няколко секунди се появява следното
на екрана:

\begin{center}
Select Modem Port\\
(  ) /dev/ttyS0\\
(*) /dev/ttyS1\\
(  ) Manual\\
\end{center}


Debian е открил модема на /dev/ttyS1 (или COM2), което в нашия пример е правилният
порт ;-) Чрез Tab отидете на \textbf{<Ok>} и натиснете Enter, за да преминете
нататък.


Няма да разглеждаме случайте, когато към компютъра е свързан някои от "измислените"
вътрешни модеми, за които е нужно да се инсталира допълнително софтуер, за да могат
да работят. Ако притежавате такъв модем, по-добре спестете малко пари и си купете
един нормален външен модем (ще си спестите и доста неприятности).


\textbf{\textit{10.Properties of provider}}

След преминаване през гореизброените стъпки се стига до това меню. Тук са показани
въведените за конекцията данни. Ако желаете да промените нещо от въведенета
информация, просто го селектираите и Enter. Така можете да модифицирате тези данни.


Ако изберете \textbf{Advanced Options}, ще имате достъп до някои по-интересни опции,
като например опцията \textbf{Add-User - Add a ppp user}. Тук можете да добавите
някой потребител, който по този начин ще добие правото да набира или спира
конекциите към доставчиците на Интернет. По този начин не е нужно да сте root, за
да наберете някоя конекция. За да добавите потребител, изберете опцията
\textbf{Add-User} и въведете потребителското име, което желаете.


След като е добавен потребителя, със стрелката слезте надолу към опцията
\textbf{Previous - Return to previous menu} и Enter. Върнахме се в
\textbf{Properties of provider} и от там изберете \textbf{Finished - Write files
and return to main menu}, за да бъде записана новонаправената конекция.


След натискането на Enter се озоваваме обратно в \textbf{Main Menu}. Ако желаете да
създадете нова конекция, изберете \textbf{Create}. За модифициране на съществуваща
конекция --- \textbf{Change}, за премахване на конекция --- \textbf{Delete} и за.
изход от pppconfig --- \textbf{Quit}. И сега, за да се свържете към Интернет трябва
да изпълните командата:
\begin{verbatim}
# pon    (за конекцията provider)
\end{verbatim}
или
\begin{verbatim}
# pon    име_на_конекцията
\end{verbatim}
като потребител root, или добавения чрез \textbf{Advanced Options} потребител.

\subsection{wvdial}


Друга много добра програма за \texttt{dial-up} е \deb{wvdial}. Инсталирайте го от
CDROM диска, както \deb{pppconfig}. В този пакет има самата изпълнима програма
\man{wvdial}{1}, програмата \man{wvdialconf}{1} за получаване на конфигурационния
файл и самия конфигурационен файл \man{wvdial.conf}{5}. Ето един кратък
конфигурационен файл - \textbf{/etc/wvdial.conf}:

\begin{verbatim}
[Dialer Defaults]

# Серийният порт, на който се намира модема
Modem = /dev/ttyS1

# Скоростта на връзката, имайте предвид, че 
# трябва да е равна на тази в /etc/ppp/options
Baud = 38400

# Инициализиращият стринг за модема; зависи от модела на
# модема, така че е добре да погледнете в документацията му
Init1 = ATX3

# Ако сте е pppd > 2.4.0
New PPPD = yes

# Телефонният номер, към който ще dial-up-вате
Phone = 9300904

# Вашето потребителско име
Username = YourUserName

# Вашата парола
Password = YourPassword

# При прекъсване автоматично ще опитаме отново
Auto Redial = yes

# ATDT за тонално, ATDP за пулсово набиране
Dial Command = ATDT

\end{verbatim}


Не забравайте да проверите дали в \texttt{/etc/resolv.conf} сте добавили ключовата дума
\texttt{nameserver} и след нея \texttt{IP} на работещ \texttt{DNS} сървър. 


Изпълнявате като root:

\begin{verbatim}
# wvdial 
\end{verbatim}

\subsection{kppp}


За разлика от \deb{pppconfig} и \deb{wvdial}, които са конзолни програми,
\deb{kppp} е програма с графичен интерфейс и е доста лесна и интуитивна за
настройване на Вашата \texttt{dial-up} връзка към \texttt{ISP}. Тук просто я
споменаваме като представител на графичните аналози, а Вие със сигурност ще се
справите с нея сами. Ако не можете да я намерите в менютата на графичната среда,
която сте стартирали под \textbf{XFree86}, то
стартирайте някой терминален емулатор, като \deb{xterm}, \deb{konsole},
\deb{gnome-terminal} и т.н. и изпълнете:

\begin{verbatim}
# kppp
\end{verbatim}


Не забравайте да проверите дали в \texttt{/etc/resolv.conf} сте добавили ключовата дума
\texttt{nameserver} и след нея \texttt{IP} на работещ \texttt{DNS} сървър. 

\section{Ethernet връзка към Internet}


За да можете да осъществите връзка по Ethernet, добре би било да имате
основни познания по \texttt{TCP/IP}. За целта можете да прочетете
например \hlink{\textbf{The Linux Network Administrator's Guide, Second
Edition}}{http://www.tldp.org/LDP/nag2/index.html} (FIXME: link към pdf-а на
български, пуснат от softpress)
съсредоточите основно върху главите, които дават добра начална
информация и представа за мрежовата инфраструктура на GNU/Linux.


От Debian GNU/Linux 2.2 Potato насам мрежовите настройки се пазят
изключително в \texttt{/etc/network}, а самото пускане и спиране на
мрежовата свързаност става с \texttt{/etc/init.d/networking}.
Изключение правят само \textbf{PCMCIA (PC-Card} базираните мрежови
карти. Нека първо обърнем внимание на \texttt{/etc/network/interfaces},
където става същинското конфигуриране на интерфейсите. Тук
конфигурираме eth0 с IP адрес 192.168.1.120, мрежова маска
255.255.255.0 и шлюз по подразбиране 192.168.1.1; същевременно
подсигуряваме автоматичното му вдигане с директивата \texttt{auto}:

\begin{verbatim}
auto eth0
iface eth0 inet static
        address 192.168.1.120
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
\end{verbatim}


Понякога се налага да се изпълнят допълнителни команди преди вдигането 
на интерфейс с цел неговата по-специална конфигурация. Поради това 
\texttt{iface} частта поддържа клаузите \texttt{pre-up} и \texttt{post-down}.
Както \man{interfaces}{5} обяснява, ролята на тези клаузи е следната:

Клаузата \texttt{pre-up} изпълнява командите, намиращи се непосредствено след 
нея преди даденият интерфейс да бъде вдигнат. Това е изключително удобно, 
ако например ви се налага да смените хардуерният (още наричан MAC) 
адрес на вашата мрежова карта. Това може да стане преди вдигането на 
съответният интерфейс, и се осъществява от следната команда (поставена някъде
в \texttt{iface} блока - например непосредствено след редът 
\texttt{iface eth0 inet static} от примерът по-горе):
\begin{verbatim}
        pre-up ifconfig eth0 hw ether AB:CD:EF:AB:CD:EF
\end{verbatim}
Така написана тази команда сменя хардуерният адрес на адаптерът, асоцииран с \texttt{eth0} на 
\texttt{AB:CD:EF:AB:CD:EF}. Това е изключително удобно, ако например ви се 
е наложило да смените мрежовата си карта, но ЛАН доставчикът контролира 
достъпът на машината по MAC адрес.

\emph{ВНИМАНИЕ!} Смяната на MAC адрес, макар и в повечето случаи безобидна, 
може да доведе до сериозни мрежови проблеми в случай, че дублира 
вече съществуващ такъв адрес.

Клаузата \texttt{post-down} е подобна като действие на \texttt{pre-up} с разликата, 
че командите след нея се изпълняват след свалянето на даденият интерфейс.

И двете клаузи могат да се появят повече от един път за всеки интерфейс 
и изискват командите, които изпълняват, да завършат успешно. 
За повече информация вижте \man{interfaces}{5}.


Ако вашият Интернет доставчик разполага с \textbf{DHCP} сървър, който
автоматично снася на клиентите мрежови настройки, то в
\texttt{/etc/network/interfaces} можете да напишете:

\begin{verbatim}
auto eth0
iface eth0 inet dhcp
\end{verbatim}


За конфигурирането на IP свързаност съществуват и други методи за
конфигуриране на интерфейси, сред които bootp, ppp и wvdial, но за тях
няма да говорим тук. За по-подробна информация относно възможностите за
конфигуриране на \textbf{/etc/network/interfaces} може да погледнете в
\man{interfaces}{5}, а също \man{ifup}{8} и \man{ifdown}{8}.


Във файла \texttt{/etc/network/options} също има някои интересни
настройки. Например така се определя дали да се активира прехвърлянето
на пакети между интерфейсите, като се установи във включено положение
\texttt{/proc/sys/net/ipv4/ip\_forward}:

\begin{verbatim}
ip_forward=yes 
\end{verbatim}


Така се установява т.нар ``филтър на обратния път'', чрез който се
проверява дали изходния адрес на пакетите съответства с нашата
маршрутизираща таблица и се подсигурява пакетите с точно този изходен
адрес да получат отговор през мрежовия интерфейс, от който са влезли.

\begin{verbatim}
spoofprotect=no
\end{verbatim}


С последната опция се установява защита срещу една доста популярна в
миналото атака, наречена \texttt{syn flooding}. За целта трябва да
имате необходимата поддръжка в ядрото.

\begin{verbatim}
syncookies=no
\end{verbatim}


Разбира се, за да можете да достъпвате уеб, пощенски и всякакви други
сървъри по техните имена, например \texttt{www.yahoo.com}, а не по
адреси от вида \texttt{216.109.117.205}, ще е необходимо да редактирате
файла \texttt{/etc/resolv.conf}:

\begin{verbatim}
search <домейн-име на вашия доставчик>

nameserver <IP на сървър за имена 1>
nameserver <IP на сървър за имена 2>
\end{verbatim}

\section{\textit{iptables}: GNU/Linux като маршрутизатор}

Една от честите употреби на GNU/Linux е да замести маршрутизатор Cisco
или друг специализиран хардуер с евтино старо PC от класа на 486 или
(по-добре) Pentium.  Това в никакъв случай не значи по-малко
възможности, а напротив --- GNU/Linux като маршрутизатор е способен
на почти всичко, което може да се появи в практиката.

Системата в ядрото, която се грижи за всички тези неща, се нарича
\hlink{Netfilter}{http://www.netfilter.org/}.  Тя се управлява чрез
командата \man{iptables}{8} от пакета \deb{iptables}.  Повече
информация може да намерите в сайта на Netfilter.

След като конфигурирате Netfilter с нужните ви правила, остава
въпросът как те да се възстановяват при рестартиране на компютъра.  За
целта използвайте следната команда:

\begin{verbatim}
# /etc/init.d/iptables save active
\end{verbatim}

FIXME: Това няма да работи под Sarge.  В
\texttt{/usr/share/doc/iptables/README.Debian.gz} има повече
информация.

\subsection{Примерни правила за филтриране на пакети}

Следните прости правила са \hlink{взети от
  SecurityFocus}{http://www.securityfocus.com/infocus/unix?topic=fwrules}.
Те са само "`скелет"' с възможност да допълвате с още правила.
Дадени са и две примерни правила.

\begin{verbatim}
INTIF=eth0                      # Вътрешна мрежа
EXTIF=eth1                      # Интернет
TCP_SERVICES="22,80"            # Разрешени услуги

# Изтриване на всички таблици
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING

### Таблица INPUT ##########################################

# Подразбираща се политика.
iptables -P INPUT DROP

# Пакети от активни TCP връзки се разрешават.  Пакети-отговори също се
# разрешават, например отговор на DNS заявка (по UDP) или отговор на
# ping request (по ICMP).
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Всеки от вътрешната мрежа, както и от локалния интерфейс, може да
# започне нова връзка.
iptables -A INPUT -i $INTIF -m state --state NEW -j ACCEPT
iptables -A INPUT -i lo -m state --state NEW -j ACCEPT

# Тук е мястото за още правила.

# Пример: Разрешава нови TCP връзки от Интернет към някой от
# $TCP_SERVICES на който и да е компютър от вътрешната мрежа.
iptables -A INPUT -i $EXTIF -m state --state NEW \
        -p tcp -m multiport --dport $TCP_SERVICES -j ACCEPT

# Хроникиране на отказаните пакети.
iptables -A INPUT -j LOG --log-prefix "FW_INPUT  "

### Таблица FORWARD ########################################

# Подразбираща се политика.
iptables -P FORWARD DROP

# Пакет от вътрешната мрежа, отиващ към Интернет.
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT

# За да се върне пакетът, обаче, трябва да е част от някоя активна
# TCP връзка.
iptables -A FORWARD -i $EXTIF \
        -m state --state ESTABLISHED,RELATED -j ACCEPT

# Тук е мястото за още правила.

# Хроникиране на отказаните пакети.
iptables -A FORWARD -j LOG --log-prefix "FW_FORWARD  "

### Таблица OUTPUT #########################################

# Подразбираща се политика
iptables -P OUTPUT ACCEPT

### Таблица POSTROUTING ####################################

# Пример: Маскарадинг за отиващите към Интернет пакети.
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
\end{verbatim}
