CentOS & Asterisk. Часть 6. Если два сетевых интерфейса.


14.12.2018

Всем привет. Рассмотрим ситуацию, когда нам нужно чтобы астериск был установлен на реальную машину. При этом у нас 2 сетевых интерфейса и один из них смотрит в глобальную сеть, а другой в локальную. При таком раскладе наш астериск будет иметь глобальный адрес – а значит любой IP телефон в сети интернет сможет зарегистрироваться на нашем «sip». То есть сам CentOS будет иметь выход в интернет (eth0), но общаться с ним мы будем через сетевой интерфейс, который видит только локальную сеть (eth1). У обоих интерфейсов будут статические адреса – у «eth0» полноценные метрики со шлюзом и днс-серверами, а у «eth1» - только локальный IP-адрес с маской. Плюс данной конфигурации в том, что можно использовать телефоны вне нашей локальной сети, ну а с недостатками мы будем активно бороться. В рамках своего эксперимента я буду использовать виртуальную машину из предыдущих статей. То есть локальный адрес, для интерфейса «eth0», моей сети для неё будет как-бы глобальным, потому что там присутствуют полноценные метрики и есть интернет:

IPADDR=192.168.3.248
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=1.0.0.1
DNS2=1.1.1.1
DNS3=8.8.4.4

А добавленный в виртуальную машину интерфейс «eth1» будет иметь свой локальный адрес внутреннего коммутатора системы HyperV, но без шлюза и днс-серверов. То есть, чтобы вас не запутать ещё раз объясняю – по-настоящему это реальный компьютер с двумя сетевыми картами – одна карта смотрит в интернет, а другая в локальную сеть. А у меня, для эмуляции этого, у виртуальной машины вместо глобальной сети – это мост в локальную сеть хоста, а вторая сеть смотрит на внутренний виртуальный коммутатор (без моста в реальную сеть) HyperV.

Начнём с того что когда я подключил вторую сеть – её не было видно в CentOS, то есть если перейти в каталог «/etc/sysconfig/network-scripts/» и выполнить команду «ls» то мы не увидим «ifcfg-eth0»:

cd /etc/sysconfig/network-scripts
ls

Решение пришло само собой – я скопировал файл первого интерфейса «ifcfg-eth0» и назвал его «ifcfg-eth1». Но это потому что я добавил сетевую карту на уже развёрнутый CentOS. А если вы уже имели 2 сетевых карты установленных в компьютер на этапе установки «CentOS» то это делать не нужно.


cd /etc/sysconfig/network-scripts

sudo cp ifcfg-eth0 ifcfg-eth1

Затем отредактируем его

nano ifcfg-eth1


Строку «UUID=""» я конечно удалил, так как это идентификатор устройства первого интерфейса.

Теперь перезапускаем сетевую службу:

service network restart

И теперь ради эксперимента мы можем подключится к нашему серверу через интерфейс «eth1». Делаем новое соединение в PuTTY к адресу 192.168.3.200 – соглашаемся с сертификатом и подключаемся. И далее сделаем проверку наличия интернета:

ping ya.ru

Для остановки жмём «Ctrl+C»


А теперь возьмём и отключим интерфейс «eth0»:

ifconfig eth0 down

И повторим команду «ping ya.ru»:


Интернета нет! Вернём его командой "ifconfig eth0 up":


А теперь немного про безопасность. Так как у нас астериск смотрит в интернет – у нас непременно появиться масса желающих деятелей позвонить за наш счёт.

Дело в том, что на данный момент у нас в системе много дыр безопасности – вспомним хотя бы то что мы отключили firewall ещё в первой статье, а ещё у нас сервисные порты дефолтные – ой-ой а теперь мы всё-таки смотрим в интернет а интернет, в свою очередь, всматривается в нас! Ну давайте ситуацию исправлять. Начнём с того что надо установить сложные пароли для абонентов – можно воспользоваться генератором паролей – например сервисом «passgen.ru»:


Редактируем sip.conf:


Не забываем про «core reload».

Поменяли пароли у всех местных абонентов на надёжные. Но вот тут надо заметить, что IP телефон D-link DPH-150S такой длинный пароль скушать не захотел – пришлось укоротить. Далее – идём в sip.conf:

Находим раздел [general]:

Добавляем строку сразу под register провайдера:

bindport=9854

Ниже раскоментируем строку, отключим анонимные звонки:

allowguest=no

Далее раскоментируем строку, включим защиту от перебора пароля:

alwaysauthreject=yes

Добавляем запрет на международные звонки в наш контекст «localcalls» в конфиге extensions.conf:

exten => _7810X.,1,Hangup()

Но тут индивидуальный подход, всё зависит от провайдера – в данном шаблоне звонок через 7ку. Но у другого провайдера может быть по-другому.

Далее смотрим правила встроенного файервола:

iptables –L

И видим что правила разрешают абсолютно всё:

Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Это потому что мы его отключили «systemctl stop firewalld» и убрали из автозапуска «systemctl disable firewalld» службу файервола. Также об этом узнать можно было командой «systemctl status firewalld». Но ведь теперь мы смотрим в интернет и файрвол нам включить точно нужно – запускаем службу командой «systemctl start firewalld» а также не забываем вернуть её в автозапуск «systemctl enable firewalld», и правила iptables заметно изменятся:

После этого перезагрузим сервер «reboot» и наблюдаем то что не один телефон не может подключится к нашему сипу. И это вполне нормально потому что для firewalld все телефоны — это вражеские подключения. Нам надо просто сказать файроволу чтобы он пропускал наши телефоны – для этого нужно настроить правила «iptables». Но тут мы встречаемся с проблемой того что службы iptables как таковой в Centos7 нету. И чтобы её вернуть придётся всё равно отключить firewalld:


systemctl disable firewalld
systemctl stop firewalld
systemctl mask firewalld
yum -y install iptables-services
systemctl enable iptables

systemctl start iptables


nano /etc/sysconfig/iptables

И вставляем вот это содержимое:


*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [214:43782]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 9854 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 10000:20000 -j ACCEPT
-A INPUT -s 192.168.3.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


Сохранили и закрыли файл. Теперь перезапустим службу и посмотрим статус

systemctl restart iptables && systemctl status iptables

Теперь наши телефоны заработали (и из интернета тоже) и также мы можем подключаться по SSH но только из под 3й подсети.


Давайте разберём правила которые мы прописали в файле «/etc/sysconfig/iptables»:
#
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [214:43782]
#

Эти строки означают стандартное начало правил iptables


#
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#

Самым первым правилом мы разрешаем движение пакетов для уже установленных соединений.


#
-A INPUT -p icmp -j DROP
#

Запрещаем пинг сервера.


#
-A INPUT -i lo -j ACCEPT
#

Разрешаем движение пакетов с интерфейса lo.


#
-A INPUT -p udp -m state --state NEW -m udp --dport 9854 -j ACCEPT
#

Тут мы разрешаем соединение извне по порту 9854. Нужно для того чтобы мы могли регистрировать на нашем сипе аппараты из любой точки мира по сети интернет.


#
-A INPUT -p udp -m state --state NEW -m udp --dport 10000:20000 -j ACCEPT
#

Разрешаем движение пакетов голосового трафика.


#
-A INPUT -s 192.168.3.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#

Этой строкой мы разрешаем стучаться в 22й порт только из локальной сети. Подразумевается, что для того чтобы управлять нашим сервером извне нужен будет VPN.


#
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
#

Эти строки запрещают все остальные пакеты в обе стороны.


Переходим к дополнительной безопасности SSH:

Редактируем конфиг SSH службы:

nano /etc/ssh/sshd_config

тут мы находим строку «#Port 22» убираем решётку и ставим свой порт – например «9853»

Теперь нам нужно иметь ввиду что подключится через SSH мы сможем не по 22му порту а только по 9853му. А это значит надо менять правила iptables:

nano /etc/sysconfig/iptables

И вставляем вот это содержимое:


*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [214:43782]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 9854 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 10000:20000 -j ACCEPT
-A INPUT -s 192.168.3.0/24 -p tcp -m state --state NEW -m tcp --dport 9853 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


Кстати напомню, что по SSH протоколу работает не только PuTTY, но и WINSCP! И если вы теперь надумаете делать соединение через что-либо по SSH – указывайте новый порт.

Перезапуск SSH службы:

service sshd restart

И кстати теперь не доступна статистика звонков через web интерфейс и что бы это исправить мы схитрим чутка.

Для начала меняем стандартный порт http «80» на свой «9852»

nano /etc/httpd/conf/httpd.conf

Находим там строку

Listen 80
И меняем на 9852


И теперь это изменение нам надо отразить в правилах «iptables»:

nano /etc/sysconfig/iptables

и приводим к такому виду:


*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [214:43782]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 9854 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 10000:20000 -j ACCEPT
-A INPUT -s 192.168.3.0/24 -p tcp -m state --state NEW -m tcp --dport 9853 -j ACCEPT
-A INPUT -s 192.168.3.0/24 -p tcp -m state --state NEW -m tcp --dport 9852 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT



Мы добавили строку:

-A INPUT -s 192.168.3.0/24 -p tcp -m state --state NEW -m tcp --dport 9852 -j ACCEPT

Где – мы разрешили ломится на порт 9852 только из локальной сети (в моём случае сеть 192.168.3.0).

Перезапускаем службы:

service httpd restart && service iptables restart

Далее я пишу в браузере адрес http://192.168.3.248:9852/ и смотрю на статистику. При этом извне – даже если злоумышленники угадают порт – ничего не видно.

И всё-таки – надо убрать возможность подключение от пользователя «root» по SSH. Ведь нужный порт злоумышленники всё-таки вычислить смогут – и зная логин «root» остаётся только перебором подобрать пароль. Для себя мы сделаем нового пользователя и от него сможем подключаться. Делаем:

Добавим нового пользователя «xadm»:

useradd xadm

Назначим хороший пароль, не забываем про спец символы:

passwd xadm

Снова редактируем «sshd_config»

nano /etc/ssh/sshd_config

Уходим в конец конфига и добавляем вот эти строки:

AllowUsers xadm
PermitRootLogin no



Сохраняем – выходим и перезагружаем сервер. Или просто перезапустите службу:

service sshd restart

И видим, что под «root» мы уже зайти не можем. НО! Зайдя под «xadm» вводим команду:

su root

И мы снова работаем через «root»



Все ссылки для данного проекта:

Пакет русских сервисных сообщений (asterisk-core-sounds-ru-alaw-current) asterisk-core-sounds-ru-alaw-current drive.google.com
Asterisk CDR Viewer https://github.com/g613/asterisk-cdr-viewer drive.google.com
Ease Audio Converter http://audiotool.net/EaseAudioConverter/index.htm
Adobe Audition https://www.adobe.com/ru/products/audition.html
WinSCP https://winscp.net/eng/download.php
CentOS-7-x86_64-Minimal-1804.iso https://www.centos.org/download drive.google.com
Исходник asterisk-15.6.2 https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15.6.2.tar.gz drive.google.com
Исходник dahdi-linux: https://downloads.asterisk.org/pub/telephony/dahdi-linux/dahdi-linux-current.tar.gz drive.google.com
Исходник libpri-current: https://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz drive.google.com
X-lite: https://www.counterpath.com/x-lite-download/ drive.google.com
Официальная wiki https://wiki.asterisk.org/wiki/display/AST/Home


Навигация: