- Как запустить свой сервер с белым ip из локальной домашней сети
- Вступление
- Что мы имеем?
- Какая цель?
- Установка постоянного локального адреса на сервер
- Рассказываем роутеру про сервер
- Защита сервера
- SSH
- Firewall
- Fail2ban
- Теперь сделаем проверку более сложного уровня
- Источники
- Настройка домашнего сервера на базе Debian
- Настройка
- Настройка screen + rtorrent
- Настройка apache, ftp, nfs
- Настройка клиентских машин
- Настройка mpd + relaxxplayer + icecast
- Заключение
Как запустить свой сервер с белым ip из локальной домашней сети
Я не являюсь сетевым инженером, я просто студент, который решил записать свои действия, чтобы поделиться со знакомыми и не забыть, что я вообще делал. Буду очень рад если меня поправят в комментариях. Этот конспект написан по другим статьям с различных ресурсов, прошу поддержать авторов тех гайдов, у них некоторые моменты расписаны более подробно и возможно вам подойдет именно их статья.
Буду стараться писать очень подробно, чтобы человек, знающий столько сколько я в начале своего пути, все понял.
Вступление
Мне очень давно хотелось поднять видимый извне сервер в своей домашней локальной сети, чтобы использовать его для pet проектов или же возможно для сайта-визитки.
Возникает вопрос: почему не использовать для этого самую простую VPS и не тратить мощности своего компьютера? Ответ очень прост: статический белый ip у меня уже был и давно, а в качестве сервера я решил использовать не основной пк а старый ноутбук. Поэтому дополнительных затрат не предвиделось.
Что мы имеем?
Для справки, на момент написания публикации (2021) стоимость минимальной VPS на доверенном ресурсе — 400 руб. , стоимость белого ip у моего провайдера — 179 руб.
- Ноутбук (intel core i5 M 560 2,67 GHz, 4/60Gb) с установленной Ubuntu Server 20.04.3 (для создания установочной флешки советую использовать rufus (win) или balenaEtcher (os x)
- роутер провайдера с подключенным пакетом «статический ip адрес»
- второй компьютер для тестов (все что делается через браузер можно, конечно, сделать и на телефоне, вопрос удобства)
- хорошая музыка чтобы процесс не был скучным
Какая цель?
Сделать python3 flask (взял для простоты) сервер доступный из вне.
Установка постоянного локального адреса на сервер
Приступим. Во-первых установим постоянный ip для нашего сервера в локальной сети. По идее изначально используется DHCP (протокол, по которому каждое устройство в сети получает относительно случайный ip адрес, а нам нужен постоянный для сервера, чтобы роутер всегда знал куда отправлять внешние запросы)
- Смотрим интерфейс, который мы используем, с помощью ifconfig
- В зависимости от того какой тип соединения мы используем (кабель или wi-fi) выбираем файл в катологе /etc/netplan И настраиваем его примерно так:
network: ethernets: ethx: dhcp4: no dhcp6: no addresses: [192.168.1.200/24, ] gateway4: 192.168.1.1 nameservers: addresses: [192.168.1.1, ] version: 2
- addresses (6) — адрес нашего сервера в локальной сети, как раз то что мы делаем постоянным /24 означает маску сети (255.255.255.0), в данной ситуации первые 3 числа должны совпадать с локальным адресом роутера, а последнее число произольно. Я выбрал адрес 192.168.1.200
- gateway4 — шлюз нашей сети, то есть роутер. Его адрес 192.168.1.1, обычно он общий для всех роутеров одного провайдера, так что погуглите (иногда его адрес указывается там же где и пароль от wi-fi)
- в строке nameservers: addresses (9) указываем тот же адрес что и в gateway4 (простите, но я беспонятия что это)
- dhcp4: no и dhcp6: no указывают, что мы не будем использовать протокол DHCP
На этом этапе возможно потребуется проверка:
- На сервере: sudo tcpdump -i ethx icmp and icmp[icmptype]=icmp-echo Чтобы следить за тем кто нас пингует.
- И пингуем его с другого пк внутри локальной сети по адресу 192.168.1.200 .
Также строит проверить есть ли доступ к интернету у нашего ноутбука-сервера: используем команду ping с доменом google.com .
Все это подробно описано в этой статье для Ubuntu, для других дистрибутивов гуглите «Установка статического ip «.
Рассказываем роутеру про сервер
Теперь наш сервер знает, что мы имеем дело с постоянным ip и не используем протокол DHCP. Самое время рассказать роутеру, что внешние запросы нужно отправлять на сервер. Чтобы получить доступ к настройкам роутера вбиваем в поисковую строку его ip адрес.
- Установить DMZ зону внутри настроек роутера и указать туда локальный адрес нашего сервера. Этим действием мы делаем наш сервер публичным и теперь любой может попробовать подключиться к нему.
- Пробросить порты нужных нам ресурсов через роутер на сервер (перенаправление портов). Не забудьте порт SSH (22) и flask (5000) Попробуйте пингануть его из внешней сети.
Все норм? Теперь наш сервер виден из вне, самое время подумать о безопасности.
Защита сервера
Я буду настраивать SSH , Firewall и fail2ban по вот этому очень хорошему гайду. (еще раз, моя цель не скопипастить все что я нашел, а собрать все в одно место, чтобы не забыть) Я делаю все для Ubuntu Server, но в том гайде есть для CentOS и Red Hat.
Во-первых сделаем еще одного пользователя помимо root (1), зададим ему пароль (2) и разрешим использовать root привелегии через sudo (3):
useradd [options] passwd usermod -aG sudo
SSH
Настраивайте по инструкции в статье упомянутой выше. Там мне совсем нечего добавить, кроме подроностей о public и private ключах:
- ssh-keygen -t rsa генерирует 2 ключа открытый (тот что имеет . pub ) и приватный который (не имеет такого расширения)
- Открытый ключ отправляется на сервер в файл authorized_keys в папке /.ssh в домашней директории пользователя ( /home/username/.shh/authorized_key ) Для этого можно использовать команду:
cat ~/.ssh/id_rsa.pub | ssh root@ip-адрес-сервера 'cat >> ~/.ssh/authorized_keys'
- Закрытый ключ используется для аутентификации, скопируйте его куда-нибудь чтобы не потерять Использовать ключ для входа можно командой:
Важно отключить аутентификацию по паролю иначе мы все это делали зря.
Firewall
Используя проброс портов мы разрешаем доступ к нашему серверу лишь посредством подключений к определенным портам, но DMZ зона допускает почти все типы запросов. Используя DMZ зону нам строит поднять FireWall на сервере, который как раз и ограничит количество портов которые могут принимать внешние запросы.
Разрешим использование SSH (1) и порта 5000 (2) в ufw (Firewall), и запустим Firewall (3):
sudo ufw allow ssh sudo ufw allow 5000/tcp sudo ufw enable
Подняв FireWall важно не забыть разрешить доступ к порту SSH (22) и порту Flask (5000) (ну или другого ПО, которое мы собираемся использовать). Я забыл и долго не понимал, почему мой сервер не отвечает.
На сайте хорошо разобраны команды для управления Firewall-ом.
Fail2ban
Fail2ban ограничивает количество попыток подключения, это сильно усложнит подбор аутентификационных данных SSH.
Для начала установим его (1) и запустим (2, 3):
sudo apt install fail2ban systemctl start fail2ban systemctl enable fail2ban
Теперь можем настроить его, используя эти конфигурационные файлы: /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf . Во втором находятся ограничения на количество подключений за определенный промежуток времени и время бана.
Теперь сделаем проверку более сложного уровня
sudo apt install python3 sudo apt install pip pip install flask
from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello, World!
"
export FLASK_APP=server.py flask run -h -p 5000
Сервер запущен и теперь мы можем попробовать подключиться к нему с внешнего устройства прямо через строку в браузере, вводя внешний адрес нашего роутера, к примеру:
Источники
Настройка домашнего сервера на базе Debian
Хочу рассказать вам о том, как я реализовал дома серверное решение 🙂
Прошу строго не судить, т.к. это первая моя публикация на хабрахабр, и русский — не родной мне язык.
Так что все исправления приветствуются.
Речь пойдет о:
Старом компьютере на базе VIA Ezra с 256 мегабайт оперативной памяти, работающем на базе Debian Etch, выполняющем функции музыкального плеера, торрент-клиента, web+ftp+nfs сервера.
Дополнительное оборудование: 2 ноутбука (Dell, Asus) на базе Ubuntu, Fedora и Wi-Fi рутер/DSL-модем D-link DSL-2640u.
Один мой друг на Новый Год подарил мне сие творение инженеров прошлого века:
Было решено, что тазик простаивать зря не должен. Debian потому, что дистрибутив стабильный и простой в настройке/использовании.
Процесс установки ОС описывать не буду — задача понятная, да и в интернете достаточно помощи по этому делу. Сразу перейду к настройке.
Настройка
Т.к. ноутбуки у меня подключены через wi-fi, а сервер я подключил через витую пару — все компьютеры находятся в локальной сети.
Первым делом я установил ssh и отключил монитор, разместив машину в укромном месте, чтоб не мешалось.
Необходимо на рутере пробросить порты для доступа к серверу извне.
Я сделал DHCP-резервацию по MAC-адресам, и мой сервер всегда будет иметь локальный адрес 192.168.1.2
Скриншот из админки рутера:
Вы видите, что я открыл порты для web, ftp, shoutcast и ssh.
Тут важно знать, что внешние адреса для некоторых (и моей в часности) моделей рутеров не будут работать из локальной сети.
Т.е. если я наберу на ноутбуке мой_внешний_айпи_адрес:21 — то я ничего не увижу.
Теперь сервер виден из сети.
Подключимся по ssh и проведем настройку.
По умолчанию Debian использует Gnome как оконный менеджер, но он кушает оперативную память, поэтому мы его отключим.
Делается это очень легко:
Вариант от gribozavr
apt-get install sysv-rc-conf
sysv-rc-conf
UPD: либо так, предложил Greignar
update-rc.d -f gdm remove
Сохраняем, перезагружаемся.
Вуаля! Gnome отключен.
Таким образом можно поотключать ненужные нам сервисы.
Так получилось, что мой домашний провайдер не предоставляет мне статического айпи-адреса, поэтому пришлось искать решение.
Я остановился на dyndns.com. Сервис, который бесплатно предоставляет домен третьего уровня + возможность серверным софтом обновлять айпи для данного домена, при изменении оного.
Регистрируемся, добавляем новый аккаунт, качаем inadyn, ставим в автозагрузку с помощью update-rc.d
update-rc.d inadyn defaults
Теперь мы имеем домен, который всегда будет привязан к нашему серверу!
Настройка screen + rtorrent
Решение пало на эту связку, т.к. rtorrent — не демонической природы, а нужно, чтоб он работал в фоне.
Если вы еще не знаете, что такое screen, зайдите на сайт GNU Project.
Установим нужные нам пакеты:
apt-get install screen rtorrent
Я создал скрипт автозагрузки:
#!/bin/sh
screen -d -m rtorrent
echo «Started. »
И добавил его, опять же, через update-rc.d
Поясню: при загрузке сервера в фоновом режиме запускается screen с запущенным внутри rtorrent.
directory = /data/downloads/
schedule = watch_directory,5,5,load_start=/data/torrents/*.torrent
Теперь наш торрент-клиент складывает закачки в папку /data/downloads/, и каждые 5 секунд проверяет папку /data/torrents/ на наличие новых torrent-файлов.
Настройка apache, ftp, nfs
Для работы с веб-клиентами mpd нужен веб-сервер. Я выбираю apache. Для работы с веб-клиентами плеера нам еще потребуется php.
Также, nfs для монтирования сетевых дисков, и ftp для просто доступа к файлам.
Тут все очень просто:
apt-get install apache2 libapache2-mod-php5 php5-cli php5-common php5-cgi proftpd nfs-kernel-server
Отлично, все пакеты установлены, демоны запускаются автоматически.
В конфиге proftpd нужно добавить одну строчку для того, чтобы пользователи локальной системы могли логиниться как ftp-пользователи:
При логине на ftp-сервер пользователь попадает в домашнюю директорию.
Для nfs-сервера я расшарил одну папку /data:
Это говорит о том, что пользователи локальной сети имеют право на чтение и запись папки /data на сервере.
Перезагружаем демоны:
/etc/init.d/proftpd restart
/etc/init.d/nfs-kernel-server restart
Все, NetFileSystem и FTP готовы к работе.
Настройка клиентских машин
Для удобной работы с nfs я сделал запись в fstab:
192.168.1.2:/data /server/data nfs rw,hard,intr 0 0
После достаточно написать
sudo mkdir /server/data
sudo mount /server/data
И мы увидим папку из файловой системы сервера!
Настройка mpd + relaxxplayer + icecast
Mpd — отличный плеер-демон, для которого есть множество gui. Как и Qt, GTK+, так и web-based.
Остановимся на веб-интерфейсе, т.к. мне это показалось наилучшим вариантом.
apt-get install mpd icecast2
Для установки клиента для плеера нужно скачать исходники с домашнего сайта и распаковать их в /var/www
Apache у нас уже запущен, поэтому набрав адрес 192.168.1.2 мы увидим собственно плеер.
Немного из настройки mpd:
Я указываю плееру, что мои музыкальные файлы лежат в директории /mnt сервера.
А теперь самое интересное!
Я решил пойти путем монтирования на сервере nfs-директории лептопа, в которой содержится музыка.
Установив на ноутбуке nfs-kernel-server и расшарив папку /home/romantik/music я подмонтировал ее на сервере в директорию /mnt/music
Теперь, обновив базу даных mpd
мы увидим в ней музыку с лептопа 🙂
При воспроизведении байты данных риал-тайм несутся по локальной сети.
Удобнее и не придумаешь, теперь я практически независим от проводов 🙂
В настройках mpd раскомментировав блок shoutcast мы получаем вещание в сеть стрим-потока прямо из плеера.
Доступно оно по адресу 192.168.1.2:8000
Заключение
Для меня это было серьезным шагом в мир полнофункциональной консоли. Скажу вам, испытываю только удобство от проделанных процедур 🙂
А что посоветуете реализовать на сервере вы?