пятница, 3 октября 2008 г.

Linux. Раздаем интернет в локальную сеть

У меня такая ситуация, что через один и тот же кабель интернет приходит, и через него же надо раздавать интернет в локальную сеть. Вещь абсолютно небезопасная, ну да сейчас не об этом =)

Смысл в том, что Мандрива 2006 позволяла мне такие извращения, а после перехода на 2008 - начала писать, что мол надо иметь 2 сетевых карты. В общем через графический интерфейс (GUI) сделать не получилось. А раздать как-то было надо. Единственным путем решения было использование консоли.

Сейчас я приведу решение, которое совершенно не предназначено только для использования на одной сетевой карты, но под него заточено. Вы легко можете изменить его и сделать так, как вам нужно. Суть от этого не меняется - раздача интернета без использования GUI.

Кроме того, этот код показывает как организовать порт-форвардинг, т.е. перенаправление пришедшего трафика на нужный компьютер внутри сети. В данном случае на внутрисетевом компьютере стоит DC++ Hub (Windows), который не будет работать, если на сервере не организовать перенаправления.

К сожалению я не полностью в этом еще разобрался, но практически все важные строки с моими комментариями. И если вам это интересно - можете полностью вникнуть в суть дела сами.

Итак, достаточно создать текстовый файл, например "inet". Скопировать в него код, который приведен ниже, отредактировать под себя и выполнить его в консоли командой "sh ./inet" (при этом вы должны находиться в папке, где он лежит; т.е. "./" означает, что исполняемый командой "sh" файл лежит в текущей папке)

Скрипт успешно запустился и работал на системах Mandriva 2008.0 и Xubuntu 7.04 (ru).
Если у вас он не запускается - вероятней всего либо:
а) iptables у вас в системе лежат в другой папке; тогда уберите /sbin/ в каждой строке "/sbin/iptables"
б) у вас соединение не ppp0, а dsl0; тогда надо везде ppp0 заменить на dsl0

Для того, чтобы этот код выполнялся каждый раз при включении компьютера сам, и не приходилось делать это руками - его надо добавить в автозагрузку.
Я прописал его в "/etc/rc.d/rc.local" (в OpenSUSE это "/etc/init.d/boot.local"), добавив в конец этого файла строки:
#My script
/home/diman/inet

Пояснения к коду:
ppp0 - PPPoE (инет)
ppp+ - PPPoE (инет), любой - ppp0, ppp1, ppp2 ...
eth0 - локальная сеть
eth+ - локальная сеть, любая - eth0, eth1, eth2, eth3 ...
192.168.23.1 - компьютер в локальной сети (не мой; мой 23.2)

PS (добавлено спустя много месяцев):
Не буду трогать всё то, что написано выше - просто я вернулся сюда подправить код, ну а в итоге всё удалил и привёл свой новый фаервол ^_^
Но сути дела это не меняет.

Так же, набравшись немного опыта, хочу посоветовать вам держать файл в папке /etc, а не в домашней, выставив при этом ему и пользователя и группу root, а всем остальным разрешить только читать его, но не записывать\выполнять. Так безопасней :)

----- ----- ----- ----- -----

#!/bin/sh

# Clear rules
# Чистим правила
iptables -F
iptables -X

# Clear rules additional
# Чистим правила - чтобы уж наверняка
iptables -t nat -F
iptables -t mangle -F

#
# INPFOR
#
# Это наша личная цепочка с именем INPFOR
# Разрешает входящие и forwarding-пакеты, если они относятся к уже установленным соединениям
# Т.е. вашим запущенным приложениям, установившим соединение
#
iptables -N inpfor
iptables -A inpfor -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A inpfor -m state --state NEW ! -i ppp+ -j ACCEPT

# PREROUTING
#
# Прероутинг перенаправляет все входящие пакеты по любому протоколу ppp с dport на to-port
# Если вы, к примеру, хотите запустить web-сервер на 8080 порту и перенаправлять на него с 80 порта - это то, что надо
#
# Второе правило перенаправляет входящие пакеты на другой компьютер. Например, это нужно, если ТАМ на этих портах открыт Torrent\DC-клиент
#
iptables -A PREROUTING -t nat -i ppp+ -p tcp --dport 80 -j REDIRECT --to-port 63080

iptables -A PREROUTING -t nat -p tcp -i ppp0 --dport 1234 -j DNAT --to-destination 192.168.23.1:4321

#
# INPUT
#
# Входящие пакеты.
# По-умолчанию все отбрасываются (iptables -P INPUT DROP)
# Показано как открывать tcp\udp порты\диапазон для ВАШЕГО torrent-клиента
#
# Первые 2 правила запрещают пакетам из вне маскироваться под вашу внутреннюю сеть
# Третье заставляет пройти нашу цепочку правил inpfor
# Четвёртое разрешает входящие с loopback-интерфейса
# Пятое разрешает ICMP-пакеты (ping и прочие сервисы)
#
iptables -I INPUT 1 -i ppp+ -s 127.0.0.0/24 -j REJECT
iptables -I INPUT 1 -i ppp+ -s 192.168.23.0/24 -j REJECT
iptables -A INPUT -j inpfor
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

# Ваш Torrent-client
iptables -A INPUT -i ppp+ -p tcp --dport 12345:12356 -j ACCEPT
iptables -A INPUT -i ppp+ -p udp --dport 12345 -j ACCEPT

# Чтобы перенаправить пакеты на другой компьютер, их сначала надо разрешить (см. пример в PREROUTING)
iptables -A INPUT -i ppp+ -p tcp --dport 1234 -j ACCEPT

iptables -P INPUT DROP

#
# FORWARD
#
# Форвардинг пакеты. По-умолчанию откидываются.
# Первое правило для перенаправления пакетов на другой комп (см. комментарии в PREROUTING и INPUT)
# Третье правило разрешает перенаправлять с любой сети ppp на eth0
# Пятое - собственно разрешает перенаправление
#
iptables -I FORWARD -p tcp -d 192.168.23.1 --dport 1234 -j ACCEPT
iptables -A FORWARD -j inpfor
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -P FORWARD DROP
echo 1 > /proc/sys/net/ipv4/ip_forward

#
# OUTPUT
#
# Исходящие. Разрешаем всё :)
#
iptables -P OUTPUT ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE

----- ----- ----- ----- -----

Если вам помогла эта статья - оставьте комментарий! Они доступны даже не зарегистрированным пользователям.

За помощь в вопросе огромное спасибо GrayCat.

Комментариев нет: