Автор Тема: Web-сервер на Fedora 8, локальная сеть и iptables.  (Прочитано 15118 раз)

Оффлайн Slax User

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 244
  • Карма: +2/-0
    • Просмотр профиля
Итак, что мы имеем?

Ноутбук (192.168.0.1), подключен к интернету по ppp0, IP при этом, динамический. OS Fedora 13.
Сервер (192.168.0.2), соединён в локальную сеть с Ноутбуком и выходит в интернет через Ноутбук. OS Fedora 8.
На Ноутбуке работает вот такой rc.firewall, собственно он Сервер в интернеты и выпускает.

На Сервере крутится Apache+MySQL+PHP, работает один сайт. Мне нужно, что бы на этот сайт смогли попасть люди из сети. Для этого, я так понимаю, мну нужно:

1) Поднять доменное имя и днсы для Ноутбука на dyndns.com. (Сделано.)
2) Разрешить в фаерволе доступ к Ноутбуку из интернета.
3) Перебросить траф при помощи iptables с Ноутбука, на Сервер, т. е. на 192.168.0.2.

Доменное имя и днсы я получил, при отключенном iptables на Ноутбуке, по адресу http://seeerver.dyndns.org/ открывается апач, запущенный на Ноутбуке.

Вопрос номер один:
Что и как нужно прописать в rc.firewall, что бы Ноутбук начал пропускать входящий из сети трафик по 80 порту. Как это сделать наиболее безопасно? Если не ошибаюсь, то в iptables нужно загнать правила:
# iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
# iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
Но не знаю как грамотно прописать их в рамках моего rc.firewall.

Вопрос номер два:
Что и как нужно прописать в rc.firewall, что бы с Ноутбука трафик перенаправился на Сервер (192.168.0.2), дабы пользователи попадали на сайт? Как это сделать наиболее безопасно? Стоит ли поднимать второй фаервол на Сервере? В поисках решения этой задачи получил подсказку, что в iptables нужно прописать правила:

# iptables -t nat -A PREROUTING -p tcp -d $EXT_R_IP --dport 80 -j DNAT --to-destination 192.168.0.2:80
# iptables -A FORWARD -i eth0 -d 192.168.0.2 -p tcp --dport 80 -j ACCEPT

$EXT_R_IP - мой динамический IP.

Опять же, я не знаю как грамотно прописать эти правила в рамках моего rc.firewall. Я даже готов $EXT_R_IP при каждой перезагрузке сам менять, но подозреваю что и тут есть автоматизированное решение.

Прямых рекомендаций не жду, хотя бы в какую сторону копать? Спасибо.

Оффлайн Slax User

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 244
  • Карма: +2/-0
    • Просмотр профиля
Re: Web-сервер на Fedora 8, локальная сеть и iptables.
« Ответ #1 : 24 Сентябрь 2010, 15:45:39 »
Итак, цель: Запустить веб-сервер, на железяке, которая находится в локальносй сети. При этом, сам веб-сервер должен быть доступен из вне, для других пользователей сети.

Задачи, дабы было проще достигать цели:
1) Поднимаем сам веб-сервер;
2) Позволяем железяке выходить в интернет через ноутбук, который к интернету подключен.
3) Так как IP у нас динамический, нам потребуется поднятие доменного имени и динамических DNS.
4) Так как наш сервер покдючен к сети через другой компьютер, на это компьютере нам нужно настроить перенаправление трафика на сервер.

Окружение:
* Интернет - USB модем от SkyLink.
* Компьютер, который подключен к интернету и локальной сети. OS Fedora 13.
* Сервер, который подкючен к Компьютеру по локальной сети. OS Fedora 8.

1) Поднимаем веб-сервер.
Сложного здесь ничего, так как затеяли мы всё это just for fun, то не заморачиваясь мы поставим всё из репозиториев. Но перед тем, как мы начнём всё устанавливать, я предлагаю выключить на второй машине фаервол. Ведь трафик будет фильтроаться у нас ещё на компьютере, с которого будет на наш веб-сервер перенаправляться, а значит на второй железяке iptables можно выключить. Управляем этим сервисом при помощи команд:

/sbin/service iptables stop
/sbin/service iptables start
/sbin/service iptables restart

а) Ставим апач:
yum install httpdВ дальнейшем, апачем управляем при помощи команд:
/sbin/service httpd start
/sbin/service httpd stop
/sbin/service httpd restart
Если хотим поставить апач в автозапуск, то выполняем команду:
/sbin/chkconfig httpd on
б) Ставим мускуль:
yum install mysql mysql-serverОпять же, в дальнейшем, запуском\перезапуском\остановкой mysql управляем при помощи команд:
/sbin/service mysqld start
/sbin/service mysqld stop
/sbin/service mysqld restart
Если требуется, для добавления мускуля в автозапуск выполняем команду:
/sbin/chkconfig  mysqld on
в) Поставим, пожалуй, ещё и PHPMyAdmin для управления нашими базами.
yum install phpmyadmin
г) Ставим поддержку PHP, Python и Perl.
yum install php php-mysqlyum install mod_python MySQL-pythonyum install perl mod_perl perl-DBD-mysqlПосле установки каждого компонента, не помешает перезапускать апач.
/sbin/service httpd restart
Собственно, для начала хватит. Будем считать что "веб-сервер на коленке" для запуска одного сайта готов.

2) Позволяем железяке выходить в интернет через ноутбук, который к интернету подключен.
По другому эту главу можно назвать "Расшариваем интернет в локальную сеть при помощи iptables". Звучит страшно, на деле - проще простого. Нам нужно настроить Маскарад в iptables. Пользоваться, кстати, будем гуем, ибо до написания своих скриптов и грамотного описания правил для iptables автор пока что не дорос.

а) На компьютере, который соединён с интернетом, настраиваем подключение по локальной сети:
Сетевой адрес: 192.168.0.1
Маска подсети:  255.255.255.0
Каким образом будут сделаны эти настройки - не важно, кто-то привык изменять всё консолью, а кто-то networkmanager'ом.

б) На этом же компьютере, открываем межсетевой кран (у меня в гноме это Система - Администрирование - Межсетевой экран), вводим рут пароль, если потребуется. В открывшемся окне выбираем пункт Маскарад и выбираем нужный нам интерфейс, тот что мы хотим расшарить по локальной сети. В моём случае это ppp0. После внесения изменений нажимаем кнопку Применить.

в) На сервере - том компьютере, для которого мы расшариваем доступ настраиваем подключение по локальной сети следующим образом:
Сетевой адрес: 192.168.0.2
Маска подсети:  255.255.255.0
Шлюз: 192.168.0.1

Сохраняем изменения. Активируем сетевые подключения на обоих железяках. Если всё сделано правильно, то обе железяки теперь могут выходить в интернет, одна напрямую, вторая через первую. (О как сказал.)

3) Так как IP у нас динамический, нам потребуется поднятие доменного имени и динамических DNS.
Динамический IP, не помеха для организации доступа на наш сервер из вне. Как выяснилось, фокус очень прост.

а) Для начала, зарегистрируемся вот на этом сервисе. Активируем учётную запись, логинимся и переходим вот по этой ссылке.
Hostname - вводим доменное имя, его сервис предоставляет нам бесплатно.
Service Type - Host with IP address.
IP Address - вводим тот IP адрес, который провайдер выдал нам сейчас. По идее, система сама определит его и предложит ввести.
Mail Routing - перенаправление почты. Я не включал, оно мне не нужно, потому я не ставил эту галку.
What do you want to use this host for? - Тут поставим web page. Ибо размещать хотим веб-страничку.
Жмём кнопку Add to cart. На следующей странице нам предложат добавить какие-либо платные услуги, нам оно не надо, поэтому мы сразу тыкнем Next. На открывшейся странице жмём Activate Service.

б) Переходим к компьютеру, который подключен к интернету напрямую. Открываем консоль и ставим клиент для dyndns:
yum install ddclientnano /etc/ddclient.confОткрываем файл ddclient.conf и вносим нужные нам изменения. Я без зазарения совести выкинул из этого файла всё, кроме:
daemon=300 # check every 300 seconds
syslog=yes # log update msgs to syslog
mail=root # mail all msgs to root
mail-failure=root # mail failed update msgs to root
pid=/var/run/ddclient.pid # record PID in file.

server=members.dyndns.org
protocol=dyndns2
use=web,web=dyndns
wildcard=yes
login=LOGIN # тут пишем логин на dyndns.com
password=PASSW # тут пишем пароль на dyndns.com
seeerver.dyndns.org # тут пишем домен, который мы зарегистрировали на dyndns.com, домен не обязательно *.dyndns.org
Сохраняем внесённые изменения и запускаем dyndns клиент.
/usr/sbin/ddclient start
Если всё сделано верно, то пинги, до выбранного нами домена будут доходить, при этом, в качестве IP адреса домена будет отображаться тот адрес, который мы получили в момент подключения к интернету.

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

а) Для этого, откроем наш редактор межсетевого экрана (у меня в гноме это Система - Администрирование - Межсетевой экран), там в разделе Доверенные службы, выберем WWW (HTTP), если нужно, Безопасный WWW (HTTPS), если такой используется и SSH, если хотим иметь удалённый ssh доступ на наш сервер. Жмём кнопку применить.

б) Для осуществления перенаправления, в уже открытом редакторе межсетевого экрана, переходим в раздел Перенаправление портов, жмём кнопку Добавить. Источником у нас будет интерфейс подключения к интернету (у меня это ppp0), протокол - tcp, порт - 80.

В качестве Цели для перенаправления, выбираем Направление другому порту (ставим галку), в поле Адрес IP, вбиваем адрес подключенного к локальной сети сервера, в поле Порт выбираем 80. Жмём ОК.

80 - для HTTP, для HTTPS, SSH и т. д. нужно будет настраивать перенаправления отдельно, но сама по себе настройка проходит так же.
Итак, если всё сделано верно, если на второй машине (сервере) отключен iptables, правильно указаны перенаправления, правильно настроен dyndns, на сервере запущен апач и залит сайт, то при обращении по адресу (заведённому после регистрации на dyndns.com) у нас этот самый сайт должен открыться.

Сервер поднят, сайт работает и доступен для пользователей из интернета. Всем спасибо за внимание.

P. S. Я не ручаюсь за то что, то что сработало у меня, так же сработает и у вас.
P. P. S. Я мог что-то забыть, если подобное выяснится, пост будет дополнен.
« Последнее редактирование: 24 Сентябрь 2010, 15:51:29 от Artpsiholog »

Оффлайн Slax User

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 244
  • Карма: +2/-0
    • Просмотр профиля
Re: Web-сервер на Fedora 8, локальная сеть и iptables.
« Ответ #2 : 24 Сентябрь 2010, 16:04:17 »
К слову, если кто-то в комментах объяснит, как заменить гуишные действия iptables на действия в консоли - буду благодарен. Сразу скажу, простое подсматривание правил при включенном гуи и последующее их повторение - не помогают.

В качесвте дополнительной информации:

[root@localhost ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -o ppp+ -j ACCEPT
-A FORWARD -d 192.168.0.2/32 -i ppp+ -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
[root@localhost ~]#


[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     tcp  --  anywhere             seeerver.dyndns.org state NEW tcp dpt:http
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@localhost ~]#