Nginx: setup SSL reverse proxy (load balanced SSL proxy)

776px-Nginx-battleship.svgA reverse proxy is a proxy server that is installed in a server network. Typically, reverse proxies are used in front of Web servers such as Apache, IIS, and Lighttpd. How do I setup nginx web server as SSL reverse proxy?

When you’ve multiple backend web servers, encryption / SSL acceleration can be done by a reverse proxy. Nginx can act as SSL acceleration software. It provided the following benefits:

  • Easy of use : Nginx is easy to setup and upgrade.
  • Security : Nginx provide an additional layer of defense as Apache is behind the proxy. It can protect against common web-based attacks too.
  • Load Distribution : nginx use very little memory and can distribute the load to several Apache servers. It can even rewrite urls on fly.
  • Caching : Nginx act as a reverse proxy which offload the Web servers by caching static content, such as images, css, js, static html pages and much more.
  • Compression : Nginx can optimize and compress the content to speed up the load time.

Our Sample Setup

  • lb0 — Linux box directly connected to the Internet via eth1. This is master SSL load balancer.
  • lb1 — Linux box directly connected to the Internet via eth1. This is backup SSL load balancer. This will become active if master networking failed.
  • A virtual IP address that moves between lb0 and lb1. It is managed by keepalived.
  • nginx — It is installed on lb0 and lb1.
  • SSL Certificate — You need to install ssl certificates on lb0 and lb1.

For demonstration purpose I’m going to use Self-signed SSL certificate, but you can use real SSL certificate signed by CAs.

  • You’ve the SSL connection between client and Nginx.
  • Then Nginx act as proxy server and makes unencrypted connection to Apache at port 80.
  • Nginx can cache all static file and other files.

Generating Self-signed Certificate
First, create required directories:

To create a private key, enter:

Sample outputs:


Fig.01: OpenSSL — Create a Private Key
To create a CSR (Certificate Signing Request):

Sample outputs:

Fig.02: OpenSSL — Create a CSR (Certificate Signing Request)
Please enter your domain name that you want to associate with the certificate. For example, for the Command Name I entered as I’m going to use

How Do I Remove The Passphrase? (Optional)

You can remove the passphrase so nginx can start on boot without entering the passphrase. Type the following commands

Finally, you should see three files as follows (note I’ve created all files as vivek user and than moved lb0 and lb1 server /usr/local/ngnix/conf/ssl/ directory):

Sample outputs:


Fig.03: All the files in ssl directory

Sample outputs:


Fig.04: Generating The Actual Self-signed SSL Certificate

How Do I Copy SSL Certificates Files To lb1?

You need to copy those files to lb1, enter:

Configure Nginx As SSL Reverse Proxy (lb0 and lb1)

Edit nginx.conf, enter (you need to edit files on both lb0 and lb1):

Edit / append as follows:

Save and close the file. Reload nginx:

Verify port is opened:

How Do I Test And Debug SSL Certificates From The Shell Prompt?
Use the openssl command as follows:

Or better use the following command:

How Do I Cache Common Files?
Edit nginx.conf and add as follows to cache common files:

Save and close the file. Reload nginx:

Test Internet Connection Speed From Console Over SSH Command Line

aptestI have recently rented a dedicated server for my hobby projects and learning CentOS Linux server. I was informed that I am connected to the 100M/s port. How do I test my Internet connection download speed from the console over the ssh session without using HTML5 or Adobe flash/Java applets based websites? How do I test my upload speed from the console?

I recommend that you use lftp command to test Internet upload and download speed from console. You can run lftp using the ssh client:

[a] wget — Retrieves files from the web (download speed test).

[b] wput — A tiny wget-like ftp-client for uploading files (upload speed test).

[c] axel — Another light download accelerator.

[d] iperf — Perform network throughput tests.


You can use the following yum command to install lftp and iperf under RHEL / CentOS / Fedora Linux:

OR use the following apt-get command under Debian or Ubuntu Linux:

Step #1: Find out download url

You need a large size file to test download speed. For example, you can visit the home page of«Argonne National Laboratory Public Software Mirror» to grab Centos Linux ISO file.

Step #2: Use lftp command to test download speed

The syntax is:

Sample outputs:

Fig.01: lftp testing internet speed
You will also get the report as follows:

A note about wget command

You can use the wget command as follows for testing download speed:

Sample outputs:

Fig.02: wget command in action

Step #3: Use lftp command to test upload speed
The sytnax is as follows:

In this example, I am uploading a file to my private ftp server:


Sample outputs:

Fig.03: lftp upload speed test in action

How do I test network throughput rate between two Linux or Unix servers?
Consider the following setup:

Iperf is a tool to measure maximum TCP bandwidth, allowing the tuning of various parameters and UDP characteristics. Iperf reports bandwidth, delay jitter, datagram loss. On server A start iperf as follows:

On server B type the same command as follows:

Sample outputs:

Fig.04: iperf client in action

  1. -s : Run in server mode.
  2. -B IP : Bind to IP, an interface or multicast address.
  3. -c IP : Run in client mode, connecting to IP.
  4. -d : Do a bidirectional test simultaneously.
  5. -t 60 : Time in seconds to transmit for (default 10).
  6. -i 10 : Pause n seconds between periodic bandwidth reports.

See the following man pages for information:

SSH — беспарольная аутентификация с помощью ssh-agent

Генерируем приватный и публичный ключи для сервера с паролем:

Запустим ssh-agent:

Проверим, какие ключи хранит в себе ssh-agent:

Ключей пока нет.

Добавляем приватный ключ:

Пробуем соединиться с хостом. Хост запрашивает пароль, потому что ключа пока нет.

Заливаем на хост наш ключ. В процессе заливки ключа, хост запросит пользовательский пароль хоста:

Ключ на хосте. Пробуем соединиться по SSH:

Отлично. Аутентификация прошла без запроса пароля, но при этом сам ключ запаролен. 🙂

Cisco ASA — Enable SSH

Включение SSH на Cisco ASA 5510

Once you are done with the basic configuration of Cisco ASA 5510, the next step is to enable SSH access from remote computers internally or externally, Steps involved in configuring SSH is as follows

[cc lang=»text»]
Firewall_5510# config t
Firewall_5510(config)# enable password xxxxx(your password)

Enable password is necessary to enable ssh access

[cc lang=»text»]
Firewall_5510(config)# username test password test123

User name and password for connecting using ssh

[cc lang=»text»]
Firewall_5510(config)# aaa authentication ssh console LOCAL

Different authentication can be  configured, like RADIUS, TACACS+, etc.., here we specified Local authentication with user name and password mentioned above

[cc lang=»text»]
Firewall_5510(config)# ssh 192.168.x.x 255.255.255.o inside

Permit ssh access to firewall from specified ip or subnet, inside

[cc lang=»text»]
Firewall_5510(config)# domain-name TEST.ORG

Domain name of your company. RSA key is generated using domain name + firewall name combination

[cc lang=»text»]
Firewall_5510(config)# crypto key generate rsa modulus 1024

Generate RSA key

You are done !!!!!!!!!!!!!!!!!!!!!!

now the firewall can be accessed from inside network……………………

Переподключение к сеансу SSH

В настройках SSH поставил «не завершать сеанс при разрыве». После переподключения не знаю как присовокупиться к висящему сеансу.

В инете рекомендуют использовать screen, который позволяет использовать несколько псевдотерминалов и подключаться к ним по мере необходимости.

Попробую использовать его вместо bash, как оболочку по умолчанию для ssh-сеансов.

Как настроить автоматический запуск screen при входе по ssh

Достало постоянно вводить screen -dR при входе на удалённую машину. Погуглив нашёл простое решение. В конце ~/.bashrc дописать:

У меня чуть более продвинутый вариант 🙂

В конец .bashrc надо добавить

и создать файл ~/SCREEN/choose:

При логине будет предлагаться меню со списком имеющихся сессий screen, можно выбрать нужную либо создать новую. Если запущенных screen’ов нет, автоматически запустится новая сессия.

Единственная (вроде бы) зависимость — нужно поставить dialog.


Авторизация SSH по RSA ключу

Для начала создадим алиасы устройств — вместо длинной записи ssh -l user будем использовать, например, ssh router. Красиво и эстетично! Для организации такой красоты достаточно создать конфигурационный файл SSH (если у вас его еще нет).

Примерно такого содержания

Немного поясню:

  • Host — наш алиас к устройству, по которому будем вызывать
  • HostName — имя или IP адрес устройства
  • User — имя пользователя для подключения к устройству
  • Port — номер порта SSH, если переопределено

Каждый алиас необходимо прописать соответствующим блоком, например, можно создать алиасы к одному устройству с разными именами пользователей. Теперь можно вызывать ssh router. Параметры для подключения к устройству router считаются из конфигурационного файла, который мы только что создали. Замечательно! Далее настроим, чтоб при подключении удаленное устройство не спрашивало пароль. Для таких целей достаточно создать пару RSA ключей и один из них поместить на удаленное устройство. Перед генерацией ключа проверим необходимые параметры в настройках системы на стороне клиента/etc/ssh/ssh_config.

Ищем нужный нам параметр, должно быть так

Подготовку сделали, можно генерировать пару RSA ключей

Отвечаем на несколько вопросов — нажимаем Enter 😉

Пара RSA ключей готова, теперь публичный ключ необходимо передать на удаленное устройство. Но перед этой операцией проверим настройки на удаленном устройстве /etc/ssh/ssh_config.

Ищем нужный нам параметр, должно быть так

Параметр AuthorizedKeysFile предписывает, что принятые ключи будут храниться для каждого пользователя отдельно. Можно еще добавить следующие опции, хуже от этого не будет:

  • PermitRootLogin no — разрешается ли пользователю root логиниться по SSH. Лучше запретить, при необходимости права себе можно повысить, например, sudo.
  • PermitEmptyPasswords no — разрешить использовать пустые пароли. Даже не знаю для чего такую опцию оставили, если только для лабораторных отладок.
  • AllowUsers — указывает список пользователей, под которыми можно входить по SSH. Очень полезная опция! Если таковой нет в вашем конфиге — создайте ее. Формат AllowUsers user1 user2. В качестве логинов можно указывать (или user1@, позволит логиниться пользователю user1 только с адреса и
  • Port — указывает прослушиваемый демоном SSHD порт. По-умолчанию  — 22, для повышения безопасности лучше сменить его на что-то выходящее за пределы 1024 или еще лучше, за пределы 10000. К примеру поставить 55555, легко запоминается, а вот nmap’ом не просканишь.

Все готово. Передаем ключ на удаленное устройство.

После успешного прохождения аутентификации ключ будет передан на удаленное устройство

Пробуем подключится

Подключение успешно. Теперь подключаться к настроенным удаленным устройствам одно удовольствие. Вводим одну короткую команду и вуаля — вы уже управляете удаленным устройством. Надо заметить, что при подключении с другого устройства вам необходимо ввести все параметры подключения и пароль, но никто не запрещает вам повторить выше описанную процедуру и с этим устройством. Если, конечно, это необходимо. Приятной работы.