Как открывать порты в системе Linux
Порт — это конечная точка соединения. В операционной системе порт открывается или закрывается для передачи пакетов данных определенных процессов или сетевых служб.
Обычно порты определяют конкретную присвоенную им сетевую службу. Это можно изменить вручную, настроив службу на использование другого порта, но в целом можно оставить значения по умолчанию.
Первые 1024 порта (номера портов от 0 до 1023) называются общеизвестными или системными и зарезервированы для часто используемых служб. К ним относятся SSH (порт 22), HTTP (порт 80), HTTPS (порт 443) и тому подобное.
Номера портов выше 1024 называются эфемерными портами.
- Порты с номерами от 1024 до 49151 называются зарегистрированными/пользовательскими.
- Номера портов с 49152 по 65535 называются динамическими/частными портами.
В этом мануале мы откроем эфемерный порт в Linux, поскольку общие службы используют известные порты.
Требования
Для выполнения туториала нужно уметь пользоваться терминалом.
Проверка открытых портов
Прежде чем открыть порт в Linux, нужно проверить список всех открытых портов и выбрать эфемерный порт, которого нет в этом списке.
С помощью команды netstat можно получить список всех открытых портов, включая TCP и UDP — это распространенные протоколы для передачи пакетов на сетевом уровне.
Учитывая используемые флаги, команда выводит следующее:
- все прослушиваемые сокеты (-l)
- номер порта (-n)
- TCP-порты (-t)
- UDP-порты (-u)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 ::1:5432 . * LISTEN tcp6 0 0 ::1:6379 . * LISTEN tcp6 0 0 . 22 . * LISTEN udp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
Примечание. Если в вашем дистрибутиве нет netstat, то с помощью команды ss можно вывести список открытых портов путем проверки сокетов прослушивания.
Убедитесь, что команда ss выводит согласованные выходные данные:
Получим следующий вывод:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:27017 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 128 [::1]:5432 0.0.0.0:* tcp LISTEN 0 128 [::1]:6379 0.0.0.0:* tcp LISTEN 0 128 [::]:22 0.0.0.0:*
Эта команда выводит практически те же открытые порты, что и netstat.
Открытие порта для TCP-соединений
Теперь откроем закрытый порт и настроим его на прослушивание TCP-соединений.
В этом туториале мы откроем порт 4000. Но при желании вы можете выбрать другой закрытый порт. Только убедитесь, что его номер больше 1023.
С помощью команды netstat убедитесь, что порт 4000 не используется:
netstat -na | grep :4000
То же самое можно сделать с помощью команды ss:
ss -na | grep :4000
Вывод должен быть пустым, таким образом подтверждается, что порт сейчас не используется, чтобы была возможность вручную добавить правила порта в системный брандмауэр iptables.
Ubuntu и системы на базе ufw
ufw — клиент командной строки для брандмауэра UncomplicatedFirewall.
Команда будет выглядеть следующим образом:
sudo ufw allow 4000
CentOS и системы на базе firewalld
firewall-cmd — клиент командной строки для брандмауэра firewalld.
Команды будут выглядеть так:
Для других дистрибутивов Linux
Изменить системные правила фильтрации пакетов IPv4 можно с помощью iptables.
iptables -A INPUT -p tcp —dport 4000 -j ACCEPT
Тестирование порта
После успешного открытия TCP-порта нужно его протестировать.
При отправке вывода ls любому подключенному клиенту, сначала запустите netcat (nc) и прослушивайте (-l) порт (-p) 4000:
ls | nc -l -p 4000
Теперь клиент получит вывод ls после того, как он откроет TCP-соединение на порту 4000. Пока оставьте этот сеанс.
Откройте другой терминал на той же машине.
Поскольку мы открыли TCP-порт, мы можем протестировать TCP-подключения с помощью telnet. Если у вас этой команды нет, установите ее с помощью менеджера пакетов.
Введите IP вашего сервера и номер порта (в данном случае 4000) и выполните следующую команду:
telnet localhost 4000
Эта команда пытается открыть TCP-соединение на локальном хосте через порт 4000.
Получим следующий вывод, в котором указано, что соединение с программой установлено (nc):
Trying ::1. Trying 127.0.0.1. Connected to localhost. Escape character is '^]'. while.sh
Вывод ls (в данном примере while.sh) отправлен клиенту, что указывает на успешное TCP-соединение.
С помощью nmap проверьте, открыт ли порт (-p):
nmap localhost -p 4000
Эта команда проверит открытый порт:
Starting Nmap 7.60 ( https://nmap.org ) at 2020-01-18 21:51 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.00010s latency). Other addresses for localhost (not scanned): ::1 PORT STATE SERVICE 4000/tcp open remoteanything Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
Как видите, вы успешно открыли новый порт в Linux.
Примечание: nmap выводит список только открытых портов, на которых в данный момент есть прослушивающее приложение. Если вы не используете приложение для прослушивания (например netcat), то порт 4000 будет отображаться как закрытый, поскольку в настоящее время на этом порту нет ни одного прослушивающего приложения. Аналогично не будет работать и telnet, поскольку этой команде также нужно прослушивающее приложение. Именно по этой причине nc такой полезный инструмент. Он имитирует такие среды с помощью простой команды.
Но порт открыт временно, так как изменения будут сбрасываться при каждой перезагрузке системы.
Сохранение правил брандмауэра
Способ, который мы рассмотрели в этом мануале только временно обновляет правила брандмауэра, пока система не выключится или не перезагрузится. Поэтому для повторного открытия того же порта после перезагрузки необходимо повторить эти шаги. Однако правила брандмауэра можно сохранить навсегда.
Для брандмауэра ufw
Правила ufw не сбрасываются при перезагрузке. Это происходит потому, что он интегрирован в процесс загрузки, и ядро применяет соответствующие конфигурационные файлы и сохраняет правила брандмауэра ufw.
Для firewalld
Необходимо применить флаг –permanent, чтобы правила были действительны после перезагрузки системы.
Для iptables
Чтобы сохранить правила конфигурации, рекомендуется использовать iptables-persistent.
Подводим итоги
В этом туториале мы разобрали, как открыть новый порт в Linux и настроить его для входящих соединений, а также поработали с netstat, ss, telnet, nc и nmap.
Как открыть порт на Debian ?
На убунте открывал легко
iptables -A INPUT -p tcp —dport 3306 -j ACCEPT
На debian 7 прописываю и порт закрыт
netstat показывает состояние LISTEN
но nmap с другого узла показывает состояние closed.
И ещё объясните почему нетстат показыват что порт открыт и какими утилитам лучше посмотреть открытые порты?
- Вопрос задан более трёх лет назад
- 48313 просмотров
Комментировать
Решения вопроса 1

Системный администратор
Покажите вывод команд:
netstat -ntpua | grep 3306 iptables-save
Ответ написан более трёх лет назад
Нравится 1 5 комментариев
csergey @csergey Автор вопроса
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 2648/mysqld
# Generated by iptables-save v1.4.14 on Thu Aug 28 09:08:44 2014
*filter
:INPUT ACCEPT [57:5843]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [32:1952]
-A INPUT -p tcp -m tcp —dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp —dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp —dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp —dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp —dport 3306 -j ACCEPT
COMMIT

У Вас порт открыт, только вот mysql слушает на локальной петле 127.0.0.1, которая доступна только с локолхоста.
В конфиге mysql исправьте, если есть, если нет, то допишите директиву:
bind-address = 0.0.0.0
На всякий случай еще проверьте, что у Вас закоментирована строка:
#skip-networking
После этого перезапустите mysql. И проверьте доступность
csergey @csergey Автор вопроса
точно. вот я дибил. скажите а почему bind-address = 0.0.0.0 а не айпишник интерфейса. если прописать bind-address = 192,168,1,1, то не работает?

По идее должен работать и на ip интерфейса.
0.0.0.0 означает слушать на всех доступных интерфейсах (то-есть внешний, локальная петля и т.д.).
Открыть порт на Debian 9

Ты б рассказал, что ты хочешь сделать? Так-то по-умолчанию все порты открыты.
no-such-file ★★★★★
( 06.03.21 17:07:59 MSK )
Ответ на: комментарий от anonymous 06.03.21 16:53:04 MSK

Кстати, а этот ваш ufw с nftables уже нормально дружит? (не пользовался ни разу, если что)
Gonzo ★★★★★
( 06.03.21 22:07:18 MSK )

я думаю, что это ошибка описания проблемы.
ему нужен почтовый сервис, а он считает, что в linux все уже из коробки есть и надо только открыть порт.
constin ★★★★
( 06.03.21 22:30:04 MSK )
Значит, описываю ситуацию подробнее. Есть сервер на Debian 9, на нем нужно организовать виртуал хосты\поддомены, которые будут привязаны каждый к своему IP, с которых будет идти рассылки. Делал через Postfix instances, прописывая через main.cf и master.cf. В итоге — на главном хосте все работает, а два виртуала не работают — для них закрыт порт 25 и остальные. Прописывал в iptables все что можно — полный ноль. Если пишу в главном main.cf, принудительно: smtp_bind_address = Х.Х.Х.Х smtp_helo_name = mail1.new.com myhostname = mail1.new.com То только тогда для него как-то открывается порт и идет рассылка. Но вместе они не работают, только по отдельности. Сами виртуал хосты через браузер не открываются, ERR Connection Timed Out, главные сайт сам открывается.
linksm
( 20.03.21 00:23:58 MSK ) автор топика
Ответ на: комментарий от linksm 20.03.21 00:23:58 MSK

А это не ты на той неделе весь ЛОР заспамил, случайно?
Как открыть порт iptables
Самой распространенной операцией при работе с межсетевым экраном, по моему мнению, является операция закрытия и открытия портов на сетевом интерфейсе. Порт открывается для того чтобы к нему можно было получить доступ из вне. Закрывают же порт чтобы запретить устанавливать соединение с программой на вашем устройстве, работающей по этому порту. В этой статье мы рассмотрим как открыть порт iptables на примере Debian Linux.
Порт — это, грубо говоря, номер квартиры в многоквартирном доме, за которым проживают известные (или не очень) жильцы. IP адрес — это номер многоквартирного дома, в котором множество квартир. Жилец — это программа, использующая данный номер порта. Этот пример работает в том случае, когда целью является открытие и закрытие доступа программам на том же самом компьютере, который подключен к сети Интернет.
Table of Contents
- Как открыть порт с помощью iptables
- 1. Один порт
- 2. Диапазон портов
- 3. Входящее и исходящее соединения
- 4. Состояние соединения
Как открыть порт с помощью iptables
В iptables для создания нового правила или блока правил используется команда:
sudo iptables [ -t таблица ] -A [ цепочка ] спецификации_правила
sudo iptables -t filter -A INPUT -p tcp -s 8.8.8.8 —sport 53 -d 192.168.1.1 -j ACCEPT
Рассмотрим подробно случай открытия порта с помощью iptables. Следует заметить, что понятие порт используется в протоколах tcp и udp, поэтому для разных протоколов доступны одинаковые номера портов, но при этом эти номера, говоря на языке нашего примера, означают разные квартиры в разных домах в разных микрорайонах, где за микрорайон можно принять наименование протокола.
Примечание: Существуют таблицы общепринятых номеров портов для распространённых программ и типов программ по функциональному назначению. Остальные порты являются свободно используемыми. Рассмотрение таблиц портов выходит за рамки данной статьи. Вернемся к простой задаче закрыть один порт.
Примечание: Если вы собираетесь открыть порт, убедитесь, что политика iptables по умолчанию блокировать всё соединения к портам (DROP). Если же используется политика по умолчанию ACCEPT, то ничего открывать не надо, все порты уже открыты, а вам нужно только закрыть те, которые должны быть недоступны из вне. Подробнее в статье как пользоваться iptables.
1. Один порт
Чтобы открыть порт iptables debian используется следующая команда:
sudo iptables [ -t таблица ] -A [ цепочка ] -p протокол [ —sport порт_отправителя ] [ —dport порт_назначения ] -j [ действие ]
sudo iptables -t filter -A INPUT -p tcp —dport 8081 -j ACCEPT

В данном случае мы открыли в таблице filter в цепочке INPUT протокола tcp порт назначения 8081 с помощью действия ACCEPT (принять). Таким образом для всех внешних машин, пытающихся установить соединение по данному порту, данный порт будет теперь доступен. Если мы хотим открыть порт для конкретной машины следует использовать следующую команду:
sudo iptables -t filter -A INPUT -p tcp -s 10.0.0.1/32 —dport 8080 -j ACCEPT
Мы открыли порт 8080 на нашем компьютере для внешней машины с адресом 10.0.0.1.
2. Диапазон портов
Чтобы открыть диапазон портов iptables используется команда:
sudo iptables [ -t таблица ] -A [ цепочка ] -p протокол [ —sport начальный_порт_отправителя:конечный_порт_отправителя ] [ —dport начальный_порт_назначения:конечный_порт_назначения ] -j [ действие ]
sudo iptables -t filter -A INPUT -p tcp —dport 18070:18081 -j ACCEPT
Данной командой мы открыли порты 18070-18081 для входящих пакетов, адресованных именно этому компьютеру, передаваемых по протоколу TCP.

3. Входящее и исходящее соединения
Все пакеты можно разделить на два типа: пакеты, приходящие на данный узел и пакеты, отправляемые данным узлом. В самом распространенном случае и для исходящих, и для входящих пакетов будет использоваться один и тот же сетевой интерфейс (физическое или логическое устройство, отвечающее за преобразование пакетов в сигналы и передачу сигналов в сеть).
Так вот, входящие пакеты будут создавать входящие соединения по определенным правилам для конкретных программ, и исходящие пакеты будут создавать исходящие соединения по определенным правилам для конкретных программ. При этом для каждой программы, нуждающейся в установлении связи с через сеть, чаще всего будут функционировать два соединения: входящее и исходящее, так как программе одновременно требуется в течении работы получать и отправлять данные.
Правила для входящих соединений будут в большинстве случаев расположены в цепочках PREROUTING, INPUT. Правила для исходящих соединений будут в большинстве случаев расположены в цепочках POSTROUTING, OUTPUT.
Чтобы разрешить порт iptables для входящего соединения:
sudo iptables -t filter -A INPUT -p tcp —dport 8080 -j ACCEPT
Пример для исходящего соединения:
sudo iptables -t filter -A OUTPUT -p tcp —dport 8080 -j ACCEPT
Примечание: В данном случае правила выглядят очень похоже, но смысловое значение у них будет абсолютно противоположное. В первом случае мы имеем дело с пакетом ВХОДЯЩИМ, который должен поступить на порт назначения 8080 НАШЕГО компьютера. Во втором случае мы имеем дело с пакетом ИСХОДЯЩИМ, который должен поступить на порт назначения 8080 УДАЛЕННОГО компьютера. Следует также заметить, что программа не использует на нашем компьютере и удаленном компьютере одинаковый номер порта для одной программы. Порты будут различаться.

4. Состояние соединения
Существует возможность формировать правила фильтрации пакетов по совпадению с определенными шаблонами дополнительной спецификации правил Netfilter. За это отвечают параметры -m и -j. Мы рассмотрим использование параметра -m, который может использовать множество различных шаблонов, из которых мы рассмотрим один: —state состояние. Этот шаблон может принимать следующие значения:
- NEW — пакет открыл новое соединение или иным образом связан с соединением, в рамках которого ещё не было пакетов в обоих направлениях (входящем и исходящем);
- ESTABLISHED — пакет связан с соединением, которое видело пакеты в обоих направлениях;
- RELATED — пакет открывает новое соединение, но связан с уже существующим соединением, например, передача данных FTP или ошибка протокола ICMP;
- INVALID — пакет, связанный с неизвестным соединением.
Открытие портов iptables для новых соединений:
sudo iptables -t filter -A INPUT -p tcp -s 192.168.1.0/24 —dport 445 -m state —state NEW -j ACCEPT
В этом примере в таблицу filter в цепочку INPUT для протокола tcp, от компьютера из подсети 192.168.1.0/24, на порт назначения 445 (так как цепочка входящая, то порт назначения находится на данном компьютере) для пакетов, открывающих новое соединение, применить действие ACCEPT (принять пакет).
А такая команда позволяет добавить порт iptables для уже установленных соединений:
sudo iptables -t filter -A INPUT -p tcp -s 192.168.2.0/24 —dport 445 -m state —state ESTABLISHED -j ACCEPT
В данном случае в таблицу filter в цепочку INPUT для протокола tcp, от компьютера из подсети 192.168.2.0/24, на порт назначения 445 (так как цепочка входящая, то порт назначения находится на данном компьютере) для пакетов, поступающих в рамках уже открытого соединения, применить действие ACCEPT (принять пакет).

Как закрыть порт iptables
Если вы открыли порт с помощью описанных выше правил и политика брандмауэра по умолчанию DROP, то достаточно это правило удалить. Если же у вас стоит политика по умолчанию ACCEPT, то чтобы закрыть порт надо использовать действие DROP.
sudo iptables -t filter -A INPUT -p tcp -s 192.168.3.0/24 —dport 445 -m state —state ESTABLISHED -j DROP
Эта команда в таблицу filter в цепочку INPUT запишет правило для протокола TCP, от компьютера из подсети 192.168.3.0/24, на порт назначения 445 (так как цепочка входящая, то порт назначения находится на данном компьютере) для пакетов, поступающих в рамках уже открытого соединения, применять действие DROP (отбросить пакет).

Для правил, запрещающих прием пакета, применимо всё сказанное выше для закрытия порта (одиночный порт, диапазон портов, входящие и исходящие соединения, действия для установленных соединений и новых соединений). Про закрытие портов в iptables читайте более подробно в отдельной статье.
Проверка открыт ли порт
Когда мы настроили все правила, закрывающие и открывающие порты, нам необходимо проверить корректность примененных настроек. Для этого можно использовать приложение telnet. Telnet — приложение, позволяющее установить двунаправленное соединение между двумя компьютерами с помощью протокола telnet. В рамках нашей задачи попытка установления соединения между двумя машинами в сети используется как тест правил Netfilter. Выполняем команду следующего вида:
$ telnet ip-адрес порт
telnet 192.168.1.5 443
В данной команде будет проверен 443 порт у машины с ip-адресом 192.168.1.5. Если на порту 443 на удаленной машине разрешено входящее соединение и правила на локальной машине разрешают исходящее соединение на порту 443, то получим сообщение:
Connection closed by foreign host.
Или неожиданно можем получить приглашение доступа к данной машине, если на этом порте ожидает подключения серверная часть telnet.
Если же правила запрещают входящее соединение на удаленной машине, или исходящее соединение на нашей локальной машине на порту 443, то получим сообщение:
telnet: Unable to connect to remote host: Connection timed out

Примечание: Чтобы получить результаты необходимо подождать довольно продолжительное время, чтобы telnet получил результат попытки соединения по указанному порту.
Выводы
Итак, сегодня мы рассмотрели как открыть порт 80 iptables или любой другой на локальной машине. Теперь мы знаем, как открыть (или закрыть) конкретный порт, диапазон портов, в чем разница между входящими и исходящими соединениями, как работать с новыми и уже установленными соединениями.