«А чего дома сидеть?»
Proxy server (Обратный прокси сервер)Имеется следующая вводная: локальная сеть в кторорой находятся насколько хостов с web серверами отвечающими на 443 порту по запросу https://server1.mydomain.com и https://server2.mydomain.com. Оба сервера испоьзуют приобретенные SSL сертификаты для домена mydomain.com. Есть маршрутизатор который отделяет отделяет локальную сеть от публичного интернета и который может пробросить (port-maping) 443 порт на коннкретный IP в локальной сети. Есть DNS сервер который может направлять субдомены mydomen.com на внешний ip маршрутизатора. Количество хостов с web серверами отвечающими на 443 порту в локальной сети может увеличиватся...

Задача: Внешние клиенты должны получать доступ к https://server1.mydomain.com, https://server2.mydomain.com, https://server3.mydomain.com, https://......

Решение: Для проксирования был выбран сервер Apache2 установленный на отдельном Linux хосте локальной сети. OS была выбрана Ubuntu 12.4.1 TLS server 64-bit установленная в Sphera, хотя это и не важно. Задачу может выполнить любой 1Hz Celeron с 512Mb на борту и статическим локальным IP адресом.

Далее статья написана выдержками из различных источников надерганых мною в процессе выполнения задачи и чтения логов с ошибками. Опущен процесс установки Ubuntu как тривиальный. Шаги описаны с момента чистой, обновленной из стандартных сорцов OS Ubuntu. То, что нужно делать copy/paste в командную строку Ubuntu выделено курсивом и жирным стилем. Поехали...

Все последующие команды выполняем с правами root

sudo su

вводим пароль пользователя указанного при установки Ubuntu

1. Ставим OpenSSH


Если Вы не установили OpenSSH сервер во время установки системы, Вы можете сделать это сейчас:

apt-get install ssh openssh-server

С этого момента Вы можете использовать SSH клиента, такого как PuTTY и связаться с вашим сервером на Ubuntu server 12.04 LTS и выполните остальные шаги из этой статьи.

2. Настраиваем сеть


Если при установки Ubuntu вы настроили систему на получение настроек сети через DHCP, то сейчас мы должны изменить это, что бы сервер имел статический IP-адрес. Отредактируем /etc/network/interfaces и настроим его под свои нужды (в данном примере установки я буду использовать IP-адрес 192.168.0.100) и DNS сервера 8.8.8.8 и 8.8.4.4 - начиная с Ubuntu 12.04, больше Вы не можете редактировать /etc/resolv.conf, но нужно указать ваши сервера имен в вашей сети - (см.для более подробной информации man resolvconf ). 
Мы же водим:

nano /etc/network/interfaces

И редактируем файл:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 192.168.0.100
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        dns-nameservers 8.8.8.8 8.8.4.4
   
Затем перезагрузим сеть:

/etc/init.d/networking restart

Затем отредактируйте /etc/hosts.

nano /etc/hosts

Сделаем что бы файл выглядел следующим образом:

127.0.0.1       localhost.localdomain   localhost
192.168.0.100   proxy.mydomain.com     proxy
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Теперь запустите:

echo proxy.mydomen.com > /etc/hostname

/etc/init.d/hostname restart


или

/etc/init.d/hostname.sh

И запустите:

hostname
hostname -f

Теперь они должны показать proxy.mydomain.com.

3. Синхронизация системного времени


Это хорошая идея, чтобы синхронизировать системные часы с NTP Network TIME рrotocol) сервером через Интернет. Просто запустите:

apt-get install ntp ntpdate

... и системное время всегда будут синхронизировано.

4. Обновляем систему


Запустите:

apt-get update

... и для обновления базы данных APT пакетов:

apt-get upgrade

Для установки последних обновлений (если имеются таковые). Если Вы видите, что новое ядро получило обновлений как часть установленого, Вы должны перезагрузить систему:

reboot

5. Установка и настройка сервера Apache как прокси сервера SSL


Вводим команду:

apt-get install apache2

Если Вы выполняли установку Apache2 на локальной машине, то зайдя в броузере по адресу http://localhost вы увидите надпись: It works!
Так же сервер должен быть доступен в сети по адресу http://192.168.0.100 с тем же результатом.

Мы планируем использовать несколько хостов по 443 порту, поэтому есть такой нюанс: в файл /etc/apache2/apache2.conf надо добавить такую строку (например, в самый конец):

nano /etc/apache2/apache2.conf

.............
NameVirtualHost *:443

Иначе можете встретить такую примерно ругань от Apache: [warn] _default_ VirtualHost overlap on port 443, the first has precedence

На этом установка завершена. Поговорим о настройках.

По умолчанию в Ubuntu 12 файлы apache2 находятся в /etc/apache2. Из всех файлов нам интересны файлы содержащие настройки виртуальных хостов. Они лежат в /etc/apache2/sites-available/. По умолчанию мы видим здесь два файла — default и default-ssl. Первый для доступа к сайту через стандартный порт 80 и второй для доступа к сайту по SSL протоколу через порт 443. Нас интересует второй конфигурационный файл. Копируем его в файл с именем нашего первого хоста для проксирования:

cd /etc/apache2/sites-available/
cp default-ssl server1.mydomain.com


Далее мы будем работать с файлом server1.mydomain.com

В Ubuntu манипулирование апачем происходит с помощью глобальных команд: включение/выключение виртуал хостов - a2ensite / a2dissite с одним аргументом - пути к конфигу, в котором прописан виртуал хост. Включение/выключение модов или расширений происводится командами a2enmod / a2dismod.

Далее алгоритм работы такой:

1) Нужно включить необходимые модули апача. Устанавливаем:

sudo apt-get install libapache2-mod-proxy-html libapache2-mod-gnutls

2) Кладем имеющиеся сертификаты для дальнейшего использования и выставляем права. Также переназначаем корневой каталог для сайна на 80 порту для удобства:

mkdir /var/www/ssl

Кладем в папку /var/www/ssl наш сертификат и ключ.

Меняем права:

chmod 700 /var/www/ssl
сhmod 600 /var/www/ssl/server1.crt
chmod 600 /var/www/ssl/server1.key


Изменяем директорию для http дефолтого сайта (не обязательно, но желательно):

mkdir /var/www/www
cp /var/www/www/index.html /var/www/www/index.html
cd /etc/apache2/sites-available/
nano default


Меняем строку на
.....
DocumentRoot /var/www/www

Перечитываем конфиг:

a2ensite default

3) Переписываем конфиг виртуал хоста (по 1му файлу на 1 хост!)  в /etc/apache2/sites-available/

Проверяем где мы:

cd /etc/apache2/sites-available/
nano server1.mydomain.com


Видим много всего. Если пониманте что делать - можете редактировать файл, если нет
- удаляйте все командами nano и вставляйте текст из примера:

---------------------------------------------------------------------------------------------------
DocumentRoot /var/www/www
ServerName proxy.mydomain.com
ServerAlias server1.mydomain.com

ServerAdmin Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
ErrorLog ${APACHE_LOG_DIR}/server1-ssl-error.log
LogLevel warn
TransferLog ${APACHE_LOG_DIR}/server1-ssl-transfer.log
CustomLog ${APACHE_LOG_DIR}/server1-ssl-access.log combined

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /var/www/ssl/mydomain.com.crt
SSLCertificateKeyFile /var/www/ssl/mydomain.com.key

SSLProxyEngine on
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / https://server1.mydomain.com

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

Затем командой

a2ensite server1.mydomain.com

активируем наш виртуал хост. После этого нужно перечитать Apache конфиги:

/etc/init.d/apache2 reload

Разрешаем:

a2enmod proxy && a2enmod ssl && a2enmod cache && a2enmod proxy_connect && a2enmod proxy_html && a2enmod rewrite && a2enmod cache && a2enmod disk_cache

Перезапускаем Apache:

sudo /etc/init.d/apache2 restart


Усё, будет проксировать на server1.mydomain.com

Для проксирования на другие хосты server2.mydomain.com, server3.mydomain.com и т.д. создаем для них новые файлы в /etc/apache2/sites-available/ с именами server2.mydomain.com, server3.mydomain.com и редактируем их в части названия доменов. Сертификат можно использовать один для всех доменов зоны mydomain.com.

Если будут замечания - пишите комментарии, я поправлю.

Комментарии  

# Иван Королевский 02.04.2016 14:05
cat ~/.ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
# Иван Королевский 21.02.2014 16:54
openssl rsa -in ssl.key -out ssl.key
# Иван 18.06.2013 15:45
apt-get install iftop
iftop --help
# Иван Королевский 16.04.2013 21:52
Cмотрим хедер и проводим поиск проблемы.
exim -bp | grep frozen
exim -Mvh uid

Смотрим тело
exim -Mvb uid | more

Удаляем старше 10 дней
exiqgrep -o 864000 -i | xargs exim -Mrm

Удаляем все замержшие (frozen) письма
exipick -zi | xargs exim -Mrm
# Иван Королевский 14.04.2013 16:28
Вы могли загрузить или переместить файл из одного места в другое и полностью забыть, куда вы переместили или загрузили его. Со мной это происходит достаточно часто! Но есть команда find, которая помогает найти файлы и директории в Linux-системах. Команда find очень полезна, когда нужно найти потерявшиеся файлы и папки. Вот простой синтаксис команды find

find где_искать критерий что_делать

Запомните, все аргументы необязательны. Вы можете просто выполнить команду find, и вы увидите список всех файлов в вашей системе.

Искать файл по имени по всей системе:

find / -name имя_файла

Эта команда ищет "имя_файла" по всей системе. "/" говорит консоли о том, что нужно искать файл по всей системе. Вы должны выполнить эту команду как root. Если вы хотите искать файл в текущей директории, используйте:

find . -name имя_файла

Я поискал файл "hello" в текущей директории, и вот что я получил.

Если вы используете "/", то файлы будут искаться по всей системе, начиная с папки пользователя root, и поэтому команду нужно выполнить как root. Использование "." приведёт к поиску по текущей рабочей папке.
Поиск файлов определённого расширения:

find . -name "*.txt"

Эта команда найдёт все файлы, имеющие расширение .txt.
Поиск, основанный на времени изменения:

"-mtime" используется, чтобы искать файлы, основываясь на времени изменения. Для примера, давайте возьмём один день.

find . -mtime 1(находит все файлы, изменённые точно один день нназад)

find . -mtime -1(находит все файлы, изменённые менее чем день нназад)

find . -mtime +1(находит все файлы, изменённые более чем день нназад)


Поиск файлов по строке (используя grep):

Команда Find может использоваться вместе с командой grep, чтобы находить файлы с определёнными словами. Команда grep используется для поиска слов и строк в файлах. Это очень полезно. "xargs" используется для модификации команды find. Вот пример использования команды grep и find:

find . -name ".*txt" -print | xargs grep "hello"
# Иван Королевский 02.02.2013 16:06
Чтобы узнать размер свободного места на дисках необходимо воспользоваться командой:
df -h
# Иван Королевский 04.12.2012 13:29
du -sh * - посмотреть размеры папок и файлов в директории
# Иван Королевский 30.09.2012 23:59
Команды для просмотра журналов в UNIX
Для просмотра журналов (логов) различных процессов в UNIX системах я пользуюсь следующим набором команд:

# more log.log - позволяет просматривать журнал постранично с начала файла. Переход на следующую страницу по нажатии клавиш "Пробел" или "F". Переход на страницу назад - клавиша "B". Можно просматривать построчно вперед - клавиша "Enter". Выход из просмотра лога - "Q".
# tail -n log.log - просмотреть последние "n" строк журнала. Если количество необходимых строк больше размера страницы, то удобно использовать так: # tail -n log.log | more. Клавиши управления - такие же, как у команды more.
# tail -f log.log - выводить строки журнала по мере их появления в реальном времени. Эта команда очень помогает, когда необходимо мониторить процесс загрузки/установки и так далее. Или держать такой экранчик в фоне, чтобы всегда быть в курсе событий. Выход - "Ctrl + C".
# Иван Королевский 24.09.2012 10:18
iptraf - текущие значения загрузки интерфейсов в linux; ntop - подробная статистика с отчетами через web-интерфейс.