Вручную закрывая порт от командной строки

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

Есть ли какой-либо ручной параметр командной строки в Linux для закрытия порта?

Примечание: Я узнал это "только приложение, которое владеет подключенным сокетом, должен закрыть его, который произойдет, когда приложение завершится".

Я не понимаю, почему это только возможно приложением, которое открывает его... Но я все еще стремлюсь знать, существует ли какой-либо другой способ сделать это.

113
задан 10.06.2017, 13:58

4 ответа

Вы могли записать сценарий, который изменил iptables и перезапускает их. Один сценарий для добавления правила, отбрасывающего все пакеты на порте, другом сценарии для удаления упомянутого правила.

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

1
ответ дан 07.12.2019, 07:51
netstat -anp | grep 80

Это должно сказать Вам при выполнении апача, "httpd" (это - просто пример, используйте порт, который приложение использует вместо 80),

pkill -9 httpd 

или

killall -9 httpd
3
ответ дан 07.12.2019, 07:51

Вы могли альтернативно использовать iptables:

iptables -I INPUT -p tcp --dport 80 -j DROP

Это в основном выполняет то, что Вы хотите. Это отбросит весь трафик TCP для портирования 80.

6
ответ дан 07.12.2019, 07:51

Вы - вид задавания неправильного вопроса здесь. Не действительно возможно просто, "закрывают порт" снаружи приложения, которое открыло сокет, слушающий на нем. Единственный способ сделать это должно полностью уничтожить процесс, который владеет портом. Затем приблизительно через минуту или два, порт станет доступным снова для использования. Вот то, что продолжается (если Вы не заботитесь, пропустите в конец, где я показываю Вам, как уничтожить процесс, владеющий конкретным портом):

Порты являются ресурсами, выделенными ОС различным процессам. Это подобно выяснению у ОС для указателя файла. Однако в отличие от указателей файла, ТОЛЬКО ОДИН процесс за один раз может владеть портом. Через интерфейс сокета BSD процессы могут выполнить запрос для слушания на порте, который затем предоставит ОС. ОС также удостоверится, что никакой другой процесс не получает тот же порт. В любой точке процесс может выпустить порт путем закрытия сокета. ОС затем исправит порт. С другой стороны, если концы процесса, не выпуская порт, ОС в конечном счете исправит порт (хотя этого сразу не произойдет: потребуется несколько минут).

Теперь, что Вы хотите сделать (просто закрывают порт от командной строки), не возможно по двум причинам. Во-первых, если бы это было возможно, то это означало бы, что один процесс мог бы просто ускользать ресурс другого процесса (порт). Это было бы плохой политикой, если не ограничено привилегированными процессами. Вторая причина - это, неясно, что произошло бы с процессом, который владел портом, если мы позволяем ему продолжить работать. Код процесса написан, предположив, что он владеет этим ресурсом. Если бы мы просто устранили его, то это закончило бы тем, что отказало на своем собственном, таким образом, ОС не позволяет Вам сделать это, даже если Вы - привилегированный процесс. Вместо этого необходимо просто уничтожить их.

Так или иначе вот то, как уничтожить процесс, который владеет конкретным портом:

sudo netstat -ap | grep :<port_number>

Это произведет строку, соответствующую порту содержания процесса, например:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

В этом случае procHoldingPort является названием процесса, который открыл порт, 4683 его pid, и 8000 (обратите внимание, что это - TCP), номер порта, который это содержит.

Затем посмотрите в последнем столбце, Вы будете видеть/. Затем выполните это:

kill  <pid>

Если это не работает (можно проверить повторное выполнение команды netstat). Сделайте это:

kill -9 <pid>

В целом лучше постараться не отправлять SIGKILL, если Вы можете. Поэтому я говорю Вам пробовать kill прежде kill -9. Просто использование kill отправляет более нежный SIGTERM.

Как я сказал, все еще потребуется несколько минут для порта, чтобы вновь открыться, если Вы сделаете это. Я не знаю способ ускорить это. Если кто-то еще делает, я хотел бы услышать его.

76
ответ дан 07.12.2019, 07:51

Теги

Похожие вопросы