HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
SSH (ч.3): Как подключиться к SSH. Настройка клиента OpenSSH
Оглавление
Для подключения к SSH серверу нужен клиент SSH. Подключиться можно из любой операционной системы и даже с мобильного телефона.
Подключение к SSH из Linux
Вам нужно установить пакет ssh (содержит клиент и сервер SSH). На Debian и производных имеется отдельный пакет с клиентом ssh-client — достаточно установить только его или также пакет ssh.
Подключение к SSH из Windows
Для Windows имеются клиенты SSH, например PuTTY. Но это только клиент, без дополнительных возможностей — например, с PuTTY не получится создать ключи для входа на SSH без пароля. По этой причине я сам предпочитаю и рекомендую Cygwin (смотрите «Как начать знакомство с командами Linux: Cygwin»).
Эта программа содержит полнофункциональную версию SSH, в том числе вы без проблем сможете создавать ключи и выполнять другие типичные для SSH действия. По своей сути Cygwin реализует многие возможности командной строки Linux.
Подключение по SSH с мобильного телефона
Имеется большое количество бесплатных программ для подключения к SSH — поищите в магазине приложений «ssh client». Они различаются возможностями: поддержкой работы с ключами, возможность переходить в ландшафтный режим, удобство доступа к специальным клавишам и т. д. — просто выберите любой из них, который вам больше нравится.
На этом скриншоте я с телефона подключился к настольному компьютеру по SSH и запустил программу мониторинга Wi-Fi сетей. То есть я могу управлять системой Linux и наблюдать за результатами работы программ с телефона.
Как подключиться к SSH
Клиент SSH на Linux — это утилита командной строки, поэтому для ввода команд нужно открыть консоль. А пользователям Windows команды для подключения к SSH серверу нужно вводить в Cygwin.
Команда для подключения имеет следующий вид:
Всё, что помещено в квадратные скобки, является необязательным. То есть в самом простом варианте команда для подключения может быть такой:
В качестве АДРЕСАТа нужно указать IP к которому нужно подключиться или имя хоста. Поскольку пользователь не указан, то клиент SSH в качестве имени пользователя подставит имя пользователя в текущей сессии.
Типичная команда для подключения выглядит так:
В качестве ПОЛЬЗОВАТЕЛя нужно указать имя пользователя на удалённой системе, к которой выполняется подключение. В процессе подключения для этого пользователя нужно будет подтвердить свою личность — с помощью пароля или ключа.
Если КОМАНДА не указана, то будет открыт обычный интерактивный шелл к удалённой системе. Если КОМАНДА указана, то при успешном подключении она будет выполнена, а интерактивный шелл открыт не будет, ssh завершит свою работу после выполнения команды.
Также можно указать URI следующего формата:
Обратите внимание, что в предыдущей записи после двоеточия можно указать порт, для команды вида:
нельзя указать порт после двоеточия — для этого используется опция -p.
При первом подключении SSH выведет информацию с запросом:
Первая строка сообщает нам, что программа не может установить соединение с этим хостом — но не надо спешить расстраиваться.
Во второй строке нам показывают уникальный отпечаток удалённого хоста и спрашивают, хотим ли мы к нему подключиться?
Набираем: yes
Далее появляется сообщение, что хост добавлен в список известных хостов:
При последующих подключениях это сообщение показываться не будет.
Данная процедура — предупреждение о подключении к новым хостам — является надёжной защитой от спуфинга (подмены) IP адресов при подключении: если вы подключаетесь к одному и тому же хосту, то это сообщение больше не должно появляться. Если это сообщение появилось вновь, то это означает, что происходит подключение к какому-то другому хосту!
Чтобы закончить сессию (отключиться), наберите:
Или нажмите Ctrl+D.
Подключение к SSH по имени хоста
У меня есть VPS, у которой IP адрес 185.117.153.79, чтобы подключиться к ней я выполняю команду:
Но всё время держать в уме IP адрес неудобно, особенно если серверов несколько. Было бы удобнее, подключаться к хосту по легко запоминаемому имени. Это IP адрес сервера SuIP, поэтому в качестве короткого имени я выберу suip, а в качестве ещё более короткого псевдонима просто букву s.
Чтобы операционная система начала узнавать эти имена, нужно настроить файл hosts. В Windows этот файл размещён по пути C:\Windows\System32\drivers\etc\hosts, а в операционной системе Linux это файл /etc/hosts. Кстати, ещё больше подробностей об этом файле вы найдёте в статье «Как настроить локальный DNS используя файл /etc/hosts в Linux».
Итак, нужно добавить записи вида:
Для своего примера я добавляю такую строку:
Сохраняю и закрываю файл hosts. Теперь я могу подключиться к данному хосту набрав следующую команду:
Или даже в таком виде подключение также пройдёт успешно:
Ещё один вариант, как добиться этого же эффекта без редактирования системного файла hosts, будет чуть ниже.
Подключение по SSH к хосту в VPN
VPN, то есть виртуальная частная сеть, состоит из подключённых к ней хостов, которые могут быть разбросаны по всему миру, но которые благодаря VPN объеденены в одну локальную сеть, внутри которой каждый узел может связываться с другим по локальному IP адресу. Причём соединения надёжно зашифрованы и сторонние лица не смогут узнать, какой именно трафик передаётся внутри VPN.
Предположим, я хочу подключиться по SSH к компьютеру, который находится в VPN к которой я также подключён. В этом случае я могу подключиться указав IP интересующего меня компьютера в VPN сети, например:
Некоторую дополнительную информацию смотрите здесь.
Выполнение команд на удалённом сервере без создания сессии шелла
Кроме открытия сессии шелла на удалённой системе, ssh также позволяет выполнять отдельные команды на удалённой системе.
Например, для выполнения команды tree на удалённом хосте с IP адресом 192.168.1.36 и отображением результатов на локальной системе, нужно сделать так:
Используя эту технику, можно делать интересные вещи, вроде такой, как выполнение команды ls на удалённой системе и перенаправление вывода в файл на локальной системе:
Обратите внимание на одиночные кавычки в вышеприведённой команде. Это сделано потому, что мы не хотим, чтобы раскрытие пути было выполнено на локальной машине; поскольку нам нужно это выполнение на удалённой системе. Также если мы хотим стандартный вывод перенаправить в файл на удалённой машине, мы можем поместить оператор редиректа и имя файла внутри одиночных кавычек:
Передача стандартного вывода с локальной машины на удалённую по ssh
Не менее интересный вариант выполнения команд будет приведён немного ниже:
Команда cat построчно считывает и отображает содержимое файла .ssh/id_rsa.pub, расположенного на локальной машине.
| (труба) передаёт то, что должно было бы появиться в стандартном выводе, другой команде.
Вместо команды, которая должна была бы обрабатывать передаваемые ей строки, происходит соединение к удалённой системе (ssh mial@192.168.1.36).
На удалённую систему приходят строки, для которых предусмотрена команда cat >> .ssh/authorized_keys. Т.е. содержимое стандартного вывода построчно записывается в файл .ssh/authorized_keys, находящийся на удалённой машине.
Опции командной строки клиента SSH
У клиента SSH много опций командной строки, но они в большей части предназначены для перенаправления трафика и продвинутых случаев использования SSH. В этой части рассмотрим только некоторые из самых часто востребованных опций.
-p ПОРТ
Устанавливает порт, к которому нужно подключиться на удалённом сервере SSH. Портом по умолчанию является 22. Эту настройку можно установить в конфигурационном файле персонально для каждого хоста.
-E log_file
Добавляет отладочные логи к файлу log_file вместо стандартного вывода ошибок.
-F configfile
Определяет альтернативный файл конфигурации на уровне каждого пользователя. Если в командной строке указан файл конфигурации, системный файл конфигурации (/etc/ssh/ssh_config) будет проигнорирован. По умолчанию для файла конфигурации на уровне пользователя используется
Конфигурационные файлы клиента SSH
/etc/ssh/ssh_config
Общесистемный файл конфигурации клиента SSH.
/etc/ssh/ssh_known_hosts
Общесистемный список ключей известных хостов. Этот файл должен быть подготовлен системным администратором, чтобы он содержал открытые ключи хостов всех компьютеров в организации. Этот файл должен быть читаемым для всех.
Эта директива является стандартным расположением для хранилища конфигураций и информации для аутентификаций специфичных для пользователей. Нет требования хранить всё содержимое этой директории в секрете, но рекомендуется настроить разрешения на чтение/запись/выполнения так, чтобы они были у пользователя, но не были у других.
Это конфигурационный файл с настройками каждого пользователя. Из-за возможного злоупотребления этот файл должен иметь строгие разрешения: чтение/запись для пользователя и недоступность для записи другими.
Содержит список ключей хостов в которые входил пользователь, но которые отсутствуют в общесистемном списке ключей известных хостов.
Конфигурационные директивы файлов /etc/ssh/ssh_config и
Конфигурационные данные обрабатываются в следующем порядке и имеют следующий приоритет:
1. Опции командной строки
2. Файл со специфичными для пользователя настройками
3. Файл с общесистемными настройками /etc/ssh/ssh_config
Все значения конфигурации меняются только при первой их установке. Таким образом, специальные настройки хоста должны быть в начале, а значения по умолчанию в конце.
Конфигурационный файл клиента SSH поддерживает множество директив, но их настройка требуется для продвинутого использования SSH и для большинства случаев использования какие-либо настройки не требуются.
Необходимо отметить на специальные директивы Host и Match, которые разбивают файл на блоки.
Директива Host устанавливает имя хоста, к котором применяются все последующие настройки, пока не будет встречена другая директива Host или Match.
Если в качестве хоста указать ‘*’, то это позволяет задать глобальные настройки значений по умолчанию, применимые ко всем хостам.
Шаблон может иметь противоположное значение, если перед ним поставить восклицательный знак (‘!’). Если запись с отрицанием соответствует, то тогда пункт Host игнорируется, если не произойдёт совпадение с другими шаблонами. Следовательно, совпадения с отрицаниями полезны для обеспечения исключений из совпадений по подстановочным символам.
Далее показан небольшой фрагмент конфигурации, в которой для хоста 10.6.0.1 устанавливается порт подключения 55455, для хоста 192.0.100.8 в качестве порта подключения будет использован 2222, а для всех остальных хостов будет выполнено подключение к 22 порту:
Эти конфигурационные файлы содержат пары «ключевое слово — аргумент», одна пара на одной строке. Опционально аргументы можно заключить в двойные кавычки ("), чтобы передать аргументы, содержащие пробелы.
Ключевые слова не чувствительны к регистру, а аргументы чувствительны к регистру.
Многие директивы закомментированы, но они указывают на значение по умолчанию, которое всё равно используется. Если вас устраивает значение по умолчанию, то не нужно ничего менять. Если же вы хотите другое значение, то нужно раскомментировать строку с соответствующей директивой (убрать символ #) и внести изменения.
Параметры конфигурации могут быть разделены пробелами или необязательными пробелами и ровно одним ‘=’; последний формат полезен, чтобы избежать необходимости заключать значения с пробелами в кавычки при указании параметров конфигурации с использованием параметров ssh, scp и sftp -o.
Поскольку для каждого параметра используется первое полученное значение, в начале файла должны быть приведены более специфичные для хоста объявления, а в конце общие значения по умолчанию.
Выше уже рассмотрен пример подключения к удалённому SSH серверу по лаконичному имени вместо IP адреса. Это общесистемная настройка преобразования имени в IP адрес, в результате теперь имена suip и s можно использовать с любой программой — хоть в веб-браузере, хоть с утилитами, например с ping:
Но у ssh клиента есть свая собственная функциональность задать удобное (хорошо запоминающееся) имя хоста. Причём они позволяют сразу указать и порт, что с предыдущем методом сделать невозможно.
К примеру, IP адрес моего SSH сервера 185.117.153.79, его порт 54321 и я хочу добавить возможность подключаться к нему по имени Host, тогда в файл
/.ssh/config мне достаточно добавить следующее:
Как видим, используется директива HostName — она устанавливает настоящее имя хоста, в том числе можно указывать IP адрес.
Директива Port устанавливает порт, который должен использоваться для данного хоста.
В результате, теперь можно подключаться по обычной команде:
Либо применять её полный эквивалент:
С полным списком директив, которые можно использовать в конфигурационном файле, можно ознакомиться командой:
Для получения информации об опциях командной строки выполните:
Как указать файл ключа для подключения
По умолчанию приватный ключ для подключения к SSH берётся из файла
/.ssh/id_rsa. Если нужно подключиться к SSH серверу с другим ключом, то используйте опцию -i, после которой укажите путь до нужного файла с приватным ключом:
Как подключиться по SSH
SSH — это основной протокол для удаленного управления серверами на базе операционной системы Linux. Все действия при подключении к SSH выполняются в командной строке, но при достаточном уровне знаний и привилегий в системе там можно сделать практически все что угодно, в отличие от того же FTP где можно только передавать и редактировать файлы.
Если вы покупаете VPS сервер или продвинутый хостинг, обычно в письме вместе с другими данными авторизации есть данные доступа по SSH. В этой статье мы рассмотрим как подключиться по SSH к серверу из Linux или Windows.
Что такое SSH?
Поскольку эта статья рассчитана именно на новичков, то перед тем, как перейти дальше давайте подробнее разберемся что из себя представляет SSH. Исторически так сложилось что на большинстве серверов используется операционная система Linux, во многом этому посодействовала ее бесплатность. Графический интерфейс на серверах Linux не используется для экономии ресурсов, поэтому единственным способом администрирования сервера остается командная строка.
Но это не является недостатком, потому что в командной строке Linux можно сделать больше чем графическом интерфейсе. Протокол SSH позволяет вам выполнять команды в удаленной системе так, как будто вы это делаете в своей системе. Вам доступен буфер обмена, вы вводите команды и можете использовать их вывод. Недоступны разве что файлы из вашей файловой системы. Например, когда вы подключитесь к серверу по SSH из Ubuntu, то все будет выглядеть так, как будто вы открыли терминал в своей системе.
Как подключиться по SSH
Для подключения по SSH нам необходимо знать такие данные:
- ip адрес сервера, к которому мы собираемся подключится;
- порт, на котором ожидает подключения SSH сервер, по умолчанию используется 22, но в целях безопасности порт подключения ssh часто изменяют;
- имя и пароль пользователя на удаленном сервере.
Больше ничего не нужно, обычно эти данные присылают в письме вместе с описанием VPS. Теперь перейдем к практике.
1. Подключение через SSH в Linux
В Linux подключение по SSH выполняется с помощью утилиты ssh. Мы более подробно рассматривали работу с ней в статье как пользоваться ssh. Для подключения к удаленному компьютеру ее синтаксис будет выглядеть следующим образом:
$ ssh имя_пользователя @ айпи_адрес
Это самый простой вариант, если вам также нужно задать порт, используйте опцию -p:
$ ssh имя_пользователя @ айпи_адрес -p порт
Чтобы выполнить подключение по SSH Linux нажмите Ctrl+Alt+T для открытия терминала и наберите команду, заменив нужные значения:
Или, с нестандартным портом:
ssh sergiy@192.168.1.2 -p 2223
Если ip_адрес и порт правильные, то на следующем шаге программа попросит у вас ввести пароль:

Если пытаетесь подключится через SSH к этому серверу первый раз, то утилита также попросит подтвердить добавление нового устройства в свой список известных устройств, здесь нужно набрать yes и нажать Enter:

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

Если же произошла ошибка и IP адрес или порт введены неверно, то вы получите ошибку Connection Refused:

Просто убедитесь что порт введен верно. Если это ваш сервер, то, возможно на нем еще нужно разрешить подключение SSH в брандмауэре. В Ubuntu/Debian для этого на удаленном сервере выполните:
sudo ufw allow 22/tcp
А в CentOS/Fedora:
firewall-cmd —permanent —zone=public —add-port=22/tcp
Если вы используете другой порт для SSH, то замените 22 на свой порт. Для удобства подключения по SSH в дальнейшем можно настроить авторизацию по ключу ssh, чтобы не вводить каждый раз пароль.
Теперь вы знаете как подключиться по ssh linux и решить проблемы с подключением. А теперь перейдем к Windows.
2. Подключение через SSH в Windows
Раньше подключение по SSH из Windows выполнялось только с помощью сторонних утилит, например PuTTY. Но в Windows 10 был добавлен встроенный OpenSSH клиент и работает он точно так же, как и в Linux. По умолчанию этот компонент не активирован. Для его установки откройте Параметры -> Приложения:


Затем выберите Управление дополнительными компонентами:

Здесь нажмите добавить новый компонент и в открывлемся меню выберите OpenSSH Client и нажмите Устанвоить:

Дальше вернитесь назад и дождитесь завершения установки. После того, как SSH клиент будет установлен нужно обязательно перезагрузить компьютер.

После перезагрузки нажмите Win+R чтобы открыть окно запуска команд и наберите в нем cmd:

Далее нажмите Enter. Перед вами откроется командная строка Windows. Здесь можно использовать утилиту ssh. Синтаксис у нее абсолютно такой же, как и для Linux:
ssh имя_пользователя @ айпи_адрес -p порт
Например, такой командой можно подключится по SSH к Raspberry Pi, который находится в вашей локальной сети по адресу 192.168.1.5:
Утилита предложит добавить устройство в список известных:

Затем предложит ввести пароль:

Все следующие команды будут выполняться уже на Raspberry Pi или другой удаленной машине, к которой вы подключились.

Теперь подключиться к серверу по ssh из этой операционной системы также просто как и из Linux.
Выводы
В этой статье мы рассмотрели как выполняется подключение к серверу по SSH из Linux или Windows. Как видите, это очень просто. А дальше, для работы с удаленным сервером вам понадобятся команды терминала Linux.
Русские Блоги
Начало работы с Linux 044 — Подключение хоста Linux к сети TCP / IP

Получив общее и общее представление о сети TCP / IP, давайте подключим хост Linux к сети.
Я представлю свою сетевую среду и процесс доступа для всех, и представлю некоторые знания, которые мы не покрыли по мере необходимости.
1、Разберитесь в топологии вашей сети
Рисуя отношения соединения между каждым терминалом и каждым сетевым устройством, мы можем получить топологию сети. Давайте сначала разберемся, как компьютеры в нашем доме подключены к публичной сети. Возьмем в качестве примера следующую топологию:

Это очень маленькая сеть. Я считаю, что топология в вашем доме ничем не отличается от нее. В доме есть беспроводной маршрутизатор. Когда домашние электронные устройства подключены к беспроводному маршрутизатору через проводную или беспроводную сеть, им назначается адрес частной сети (также в сегменте сети 192.168.0.0/24). Беспроводной маршрутизатор получает IP-адрес общедоступной сети через коммутируемый доступ в Интернет. Хотя все домашние устройства являются частными адресами, при доступе к Интернету через модем они преобразуются в общедоступный сетевой адрес, так что данные могут передаваться в общедоступной сети.
У некоторых людей могут возникнуть вопросы, так какие же коммутаторы и маршрутизаторы, которые мы представили ранее, не используются? Конечно нет. В домашней сети очень мало устройств, которые должны быть подключены к Интернету, и в то же время для упрощения расчетов с оператором используется большинство этих топологий. Фактически, домашняя сеть находится на краю сети. В этой топологии выход из модема представляет собой не что иное, как какое-то оборудование для передачи данных для маршрутизации и коммутации. Конечно, в сети также работают брандмауэры, балансировщики нагрузки, оборудование для аутентификации и учета.
На самом деле, сети вне домашней сети намного сложнее, чем мы думаем. Сетевое оборудование и соединения в топологии столь же сложны, как сети пауков. На следующем рисунке показана сильно сжатая корпоративная сеть. Если вы расширите ее для прорисовки каждого соединения между каждым устройством и устройством, возможно, мне потребуется Баскетбольная площадка.

К счастью, нам не нужно знать всю картину сети. Строительство и реконструкция сети в основном выполняются сетевыми инженерами или сетевыми администраторами. Чаще всего нам просто нужно подключить наш клиент или сервер к существующей сети, чтобы мы могли сами получить доступ к сетевым ресурсам или быть доступными для других. Например, что нам делать, если мы хотим, чтобы виртуальная машина Linux на ноутбуке выходила в интернет? Оглядываясь назад на первую топологию, мы можем, вероятно, назначить адрес 192.168.0.0/24 для linux, затем подключить его к беспроводному маршрутизатору и позволить беспроводному маршрутизатору пересылать пакеты данных, отправленные или полученные хостом linux. Но программа виртуальной машины — это просто программный процесс, выполняющийся на хост-машине. Как подключиться к реальному устройству? Что нам делать?
2、Режим сетевого подключения виртуальной машины
Не просто думайте, что это домашнее знание, которое вам нужно знать только для экспериментов на собственном компьютере. Фактически, в производственной среде число виртуальных машин часто превышает физические машины, и зачастую физические машины просто становятся черным ящиком, который предоставляет вычислительные ресурсы для виртуальных машин, и только виртуальные машины действительно обслуживаются извне. Существует несколько способов доступа программных виртуальных машин к физической сети.
Сначала мы выключим виртуальную машину, а затем отредактируем настройки виртуальной машины.


Как показано выше, мы видим несколько режимов, перечисленных на панели сетевого подключения. Мы ориентируемся на: Тип сети виртуальной машины: Bridged (Преодоление), NAT 、 Host-only (Только хост) Эти три сети.
После установки рабочей станции vmware на компьютере появятся еще две сетевые карты: vmnet8 и vmnet1.
В режиме NAT сетевая карта виртуальной машины подключена к сетевой карте VMnet8 хоста. В это время хост VMware NAT Service Служба действует как маршрутизатор, отправляя виртуальные машины VMnet8 Пакеты отправляются в реальную сеть после преобразования адреса, а затем пакеты, возвращенные в фактическую сеть, преобразуются по адресу VMnet8 Отправьте на виртуальную машину. VMware DHCP Service Отвечает за распределение виртуальных машин IP Адрес. В режиме nat виртуальная машина может получить доступ к внешней сети через доступ хоста к Интернету, но внешняя сеть не может получить к ней доступ, поскольку в режиме nat виртуальная машина невидима для внешнего мира, а пакеты данных, отправляемые виртуальной машиной, появляются во внешнем мире. Это пакет данных, отправленный хост-машиной, и только хост-машина может различить, какая является его собственной, а какая — виртуальной машиной, и затем перенаправить ее на виртуальную машину.

в Bridged В этом режиме виртуальная машина, созданная устройством компьютера, похожа на реальный компьютер, она будет напрямую
При подключении к реальной сети логическое соединение с хост-компьютером (компьютерным оборудованием) отсутствует.

в Host-only В этом режиме сетевая карта виртуальной машины подключена к хосту VMnet1 Но хост-система не
Предоставляет любую службу маршрутизации для виртуальной машины, поэтому виртуальная машина может взаимодействовать только с хост-машиной и не может подключаться к реальной сети.
У меня нет доступа к Интернету.

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

Кроме того, нам нужно указать, какая физическая сетевая карта подключена к хосту, а моя сторона подключена к беспроводной сетевой карте.


3、Конфигурация NIC для виртуальных машин
Обычно для интернет-терминалов есть два способа получения IP: DHCP и статическое обозначение.
Много раз мы не можем требовать от непрофессионалов понимания сетевых знаний. Люди, которые используют электронное оборудование, часто являются ИТ-белыми и хотят подключиться к Интернету, чтобы выйти в интернет. В настоящее время, если вам все еще требуется, чтобы они знали, как вручную настраивать IP-адрес, это кажется немного нецелесообразным, и в сценарии, когда большое количество людей должно выходить в интернет, очевидно, невозможно вручную настроить каждый терминал или мобильный телефон. В это время можно использовать протокол DHCP, а сетевое устройство может выступать в качестве сервера DHCP. Если устройство, подключенное к сети, настроено на автоматическое получение IP-адреса (обычно это режим по умолчанию для всех устройств), оно может получать доступный IP-адрес с сервера DHCP.
Мы расскажем, как настроить DHCP-сервер на втором этапе. Узнайте это здесь.
Однако для некоторых хостов, которым необходимо предоставлять внешние сервисы, использование dhcp явно ненаучно. Поскольку адрес, полученный через dhcp, не всегда один и тот же, а сервер dhcp настроен неправильно, это также может повлиять на доступность сети сервера. Поэтому IP-адрес сервера часто назначается статически.
Существует много способов настройки адресов, наиболее распространенными из которых являются:
3. Инструменты GUI (среда рабочего стола)
4, инструменты TUI (текстовый графический интерфейс)
5, отредактируйте файл конфигурации
Как правило, мы хотим изменить IP навсегда, мы будем использовать метод файла конфигурации GUI / TUI / edit. Изменение IP с помощью команды вступает в силу только в памяти.После перезапуска процесса или системы оно стареет, но нам просто удобно выполнять некоторые тестовые операции, поэтому иногда оно используется. В этом разделе описывается, как изменить IP с помощью инструмента TUI. Семейство команд ifconfig и семейство ip будут подробно описаны позже.
TUI изменить IP-адрес сетевой карты
На самом деле это очень просто: если это система centos7, используйте команду nmtui, а centos6 — команду setup, которая ничем не отличается от графического интерфейса.


ens33 это имя сетевой карты
Выберите, заполните соответствующую информацию вверх, вниз, влево, вправо и введите пробелы

Обратите внимание на флажок Автоматически подключаться, иначе сетевая карта не будет включена по умолчанию.
После ОК программа автоматически изменит файл конфигурации

Просто перезапустите сетевую службу, как показано ниже, и вы увидите, что сетевая карта ens33 имеет IP-адрес: 192.168.0.110

Если centos6 использует перезапуск сервисной сети, centos6 и centos7 используют разные механизмы управления сервисами, но centos7 совместим с centos 6. Они будут подробно описаны при обсуждении сервисов и процессов.
Все больше людей привыкли постоянно изменять IP, изменяя файл конфигурации.
Все в Linux это файл. Каждый сетевой интерфейс имеет соответствующий файл конфигурации. Файл сетевой карты находится в каталоге / etc / sysconfig / network-scripts / и начинается с ifcfg-
]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# ls
ifcfg-ens33 ifdown-isdn ifdown-tunnel ifup-isdn ifup-Team
ifcfg-lo ifdown-post ifup ifup-plip ifup-TeamPort
ifdown ifdown-ppp ifup-aliases ifup-plusb ifup-tunnel
ifdown-bnep ifdown-routes ifup-bnep ifup-post ifup-wireless
ifdown-eth ifdown-sit ifup-eth ifup-ppp init.ipv6-global
ifdown-ippp ifdown-Team ifup-ippp ifup-routes network-functions
ifdown-ipv6 ifdown-TeamPort ifup-ipv6 ifup-sit network-functions-ipv6
[[email protected] network-scripts]#
Ifcfg-ensxxxxx — это имя файла сетевой карты, например, здесь ifcfg-ens33. В centos6 они могут выглядеть как ifcfg-eth0, но это не мешает вам их узнавать.
Вы можете проверить содержимое файла. В нем много параметров, которые могут вас ослепить. Некоторые из них не нужны, а некоторые критичны. Более важные параметры:
TYPE = Ethernet указывает, что тип устройства является Ethernet
BOOTPROTO = нет Протокол конфигурации при запуске этого устройства, который может быть статическим, нет, вручную, dhcp и т. Д.
IPV6INIT = нет Инициализировать протокол IPV6. Это выбирается по требованию. Если IPv6-адрес не настроен, введите no.
NAME = ens33 Имя сетевой карты, которое должно совпадать с именем суффикса файла.
UUID = c0a6c4fd-309a-4c9f-8cae-0e5cbdaef313 UUID устройства
DEVICE = ens33 Изменить устройство, связанное с конфигурацией
ONBOOT = да, запускаться ли автоматически при загрузке
IPADDR = 192.168.0.110 IPV4-адрес
PREFIX = 24 Маска
Шлюз = 192.168.0.1 шлюз
DNS1 = 114.114.114.114 Может быть несколько адресов DNS, например, напишите еще одну строку DNS2 = .
Когда есть много вариантов, это выглядит очень грязно. Некоторые параметры внутри могут быть удалены, или нам не нужно беспокоиться об этом. Я использую редактор vi, чтобы упростить настройку следующим образом:
TYPE=Ethernet
IPV6INIT=no
NAME=ens33
BOOTPROTO=none
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.0.110
PREFIX=24
GATEWAY=192.168.0.1
DNS1=114.114.114.114
Затем перезапустите сетевой сервис
Обратите внимание, что вам следует соблюдать осторожность при перезапуске сетевой службы: с одной стороны, перезапуск сетевой службы неизбежно приведет к прерыванию работы сети, а с другой стороны, вы должны подумать, можно ли подключиться к узлу Linux после перезапуска сетевой службы. Поскольку большая часть ежедневной работы использует протокол удаленного подключения для подключения к серверу.
4、Используйте инструменты для удаленного подключения к хосту Linux
Теперь мы можем наконец избавиться от неуклюжего терминала linux и подключиться к виртуальной машине с помощью инструмента удаленного подключения.
Вы можете попытаться войти в систему, используя secureCRT или xshell.


Использование этих инструментов может упростить нам удаленное подключение, копирование и вставку текста командной строки, передачу данных, изменение внешнего вида терминала, журналов аудита и т. Д.
Использование этих двух программных инструментов довольно просто, вы можете выбрать один и тот же для изучения.
centos7 включит службу ssh по умолчанию. Нам нужно только ввести IP-адрес и имя пользователя и пароль в терминале для подключения.

Если соединение не удалось, подумайте, что пошло не так.
Сначала проверьте, может ли виртуальная машина взаимодействовать с хостом. Мы можем использовать команду ping для проверки соединения между хостами. Параметр после ping — это ip хоста. На следующем рисунке показано, что связь нормальная. Если связь невозможна, выход не будет. Нажмите ctl + c, чтобы завершить действие ping. Проверьте, нет ли проблем с настройкой моста NIC.

Если виртуальная машина может пропинговать хост, хост не может пропинговать виртуальную машину. Учитывая, что брандмауэр linux работает, мы можем временно отключить брандмауэр здесь. Раздел управления системой подробно расскажет о брандмауэре iptables.
Пожалуйста, отключите сетевой брандмауэр Linux.
]# systemctl disable firewalld.service
service iptables stop
chkconfig iptables off
Независимо от Centos 6 или 7, вы можете использовать iptables -F для временной очистки правил брандмауэра (только для целей тестирования, правила будут восстановлены после перезапуска процесса брандмауэра)
На этом этапе, если хост может пропинговать виртуальную машину, вы можете попробовать ssh-соединение.
Если соединение ssh по-прежнему не удается, проверьте, нормально ли работает процесс ssh на виртуальной машине Linux:
]# systemctl status sshd
Если он не запущен, включите службу ssh вручную.
]# systemctl start sshd
Сегодняшняя статья немного длинная, отрезать ее невозможно. Было бы слишком тривиально дать немного знаний о разделе, пожалуйста, позаботьтесь об этом.
Как вы все в течение Национального дня? После празднования Родины мы должны посвятить наш энтузиазм строить Родину с полным энтузиазмом!
Перейти на утку
Следите за этой общедоступной учетной записью для получения последних обновлений
Протокол TCP
Одним из наиболее распространенных протоколов взаимодействия в сети является протокол TCP (Transmission Control Protocol). Этот протокол гарантирует доставку сообщений и широко используется в различных существующих на сегодняшний день программах. Для работы с протоколом TCP в .NET предназначены классы TcpClient и TcpListener . Эти классы строятся поверх класса System.Net.Sockets.Socket . TcpClient и TcpListener упрощают создание клиента и сервера, которые реализуют протокол TCP. Если же функциональности этих классов недостаточно, то для более продвинутных и изощренных сценариев можно использовать тот же класс Socket. В данной главе мы рассмотрим различные подходы к построению tcp-клиента и tcp-сервера, как с помощью TcpClient и TcpListener, так и с помощью чистых сокетов.
TCP-клиент на сокетах
Рассмотрим определение простейшего клиента, который использует TCP-сокеты для подключения к хосту, отправки и получения данных. Прежде всего для определения сокета, который использует протокол TCP, необходимо для сокета указать в качестве типа протокола Tcp, а в качестве типа сокета — Stream :
Подключение к хосту
Для подключения к удаленному хосту применяется метод Connect() / ConnectAsync() . Оба этих метода имеют множество версий, но в общем случае для подключения к удаленному хосту нам необходим адрес хоста в виде ip-адреса или домена и порт. Отмечу пару перегрузок:
Например, подключемся к хосту «google.com»:
В данном случае после успешного подключения выводим на консоль соответствующее сообщение.
При неудаче подключения будет сгенерировано исключение SocketException
Информация о подключении
После подключения к удаленному хосту мы можем получить его адрес (то есть ip-адрес+порт) с помощью свойства RemoteEndPoint . Кроме того, мы можем получить адрес самого сокета с помощью свойства LocalEndPoint :
Например, консольный вывод с моем случае:
Отключение от хоста
Если мы завершили взаимодействие с хостом, но планируем продолжать использовать сокет, чтобы соединение с удаленным хостом не висело, мы можем отключиться с помощью метода Disconnect() / DisconnectAsync() . Данный метод в качестве параметра принимает значение bool — если оно равно true , то после отключения можно заново использовать сокет для новых подключений:
Чтобы гарантировать, что все данные отправлены и получены перед закрытием подключения, перед вызовом метода Disconnect/DisconnectAsync Microsoft рекомендует вызывать метод Shutdown.
Отправка данных
Для отправки данных применяется метод Send()/SendAsync() . Оба этих метода имеют различные версии. Рассмотрим самые простые версии:
В качестве параметра он получает отправляемые данные в виде структуры ArraySegment<byte> — грубо говоря часть массива байтов. Дополнительно с помощью значений перечисления SocketFlags можно установить параметры отправки.
В качестве результата метод SendAsync() возвращает количество отправленных данных.
Например, отправим на google.com запрос с некоторыми данными:
При взаимодействии с сервером надо понимать, какой протокол реализует данный сервер, то есть правила, по которым этим сервер получает запросы. Так, google.com, как любой стандартный сайт, принимает сообщения, которые соответствуют протоколу HTTP. Грубо говоря, чтобы удаленный хост нас понял, нам надо говорить на его языке. И в данном случае мы посылаем сообщение, которое соответствует протоколу HTTP:
Формат запроса HTTP включает прежде всего линию запроса, которая состоит из типа запроса, пути к запрошенному ресурсу и специфической версии протокола. То есть здесь в сообщении мы указываем, что отправляется запрос типа GET по пути «/» (то есть к корню сайта google.com»). При этом применяется протокол HTTP/1.1. Линия запроса должна завершаться двойным набором символов каретки и перевода строки \r\n .
Кроме того, запрос HTTP может содержать заголовки. Так, в данном случае отправляем заголовок «Host», который указывает на ажрес хоста. В данном случае это «www.gooogle.com:80». И также в данном случае отправляем заголовок «Connection», который имеет значение «close» — это значение предписывает серверу закрыть подключение.
Поскольку мы можем послать только байты, а не строки, то переводим строку в массив байтов:
И отправляем данные:
Стоит обратить внимание, что хотя метод SendAsync принимает объект ArraySegment, здесь мы передаем непосредственно массив с данными, который автоматически будет конвертироваться в структуру ArraySegment<byte> .
В итоге при выполнении запроса получим следющий консольный вывод:
Получение данных от хоста
Для получения данных класс Socket применяет методы Receive() / ReceiveAsync() . Оба метода имеют много перегруженных версий с разным набором параметров, но ключевой параметр — буфер, в который загружаются полученные данные. Для синхронного метода Receive в качестве буфера обычно выступает массив байт, а для асинхронного ReceiveAsync — структура ArraySegment<byte> :
Результатом обоих методов является количество считанных байтов.
Например, получим от google.com ответ:
В качестве буфера отправляемых байтов определена переменная responseBytes , которая представляет массив в 512 байт. В размер буфера в данном случае не принципиально. Главное представлять, насколько большие могут быть полученные данные и в соответствии с этим определять размер для буфера. А чтобы отслеживать реальное количество считанных байт (которое может быть меньше размера буфера), определена переменная bytes.
Причем как и в случае с методом SendAsync в метод ReceiveAsync передается массив байт, который автоматически преобразуется в ArraySegment<byte>.
Поскольку в данном случае ответ от google.com по сути представляет строку, то конвертируем преобразованные данные в строку и выводим ее на консоль.

Как мы видим, это обычный ответ HTTP, где вначале идут статус ответа, заголовки. Однако по ответу видно, что он не полный. Идеальна была бы ситуация, когда мы точно знаем, сколько байт пришлет удаленный хост. И соответственно могли бы определить соответствующий буфер. Но в данном случае мы этого точно не знаем — они могут быть больше размера буфера, а могут быть меньше. Очевидно, нам надо считывать данные в цикле, пока мы не получим последний байт ответа:
теперь для считывания используем цикл do..while. Смотрим, сколько байтов возвращает ReceiveAsync. И пока он вернет 0 байтов, повторяем цикл. Полученные байты конвертируем в строку и добавляем в StringBuilder. В конце выводим полученное содержимое из StringBuilder на консоль:

Теперь мы получили весь ответ от google.com. Но следует учитывать, что при отсутствии данных ReceiveAsync для tcp-сокетов завершает выполнение и возвращает количество байт только в том случае, когда буфер заполнен или когда одна из сторон завершает соединение. Поскольку TCP предполагает установление соединения, при котором хосты могут продолжительное время отправлять и получать данные. В примере выше сделано просто: на сервер google.com отправляется следующее сообщение:
Кроме метода HTTP, пути и протокола здесь также отправляется заголовок «Connection: Close», который предписывает закрыть подключение после завершения текущей транзакции. Благодаря этому мы выполнение не зависает на строке
Уберем этот заголовок
И сокет бы продолжал ждать от google.com новых данных. Поскольку в данном случае мы имеем дело с потоковой передачей, и сокет может бесконечно ждать новую порцию данных. Но данный пример довольно ситуативен, поскольку google.com принимает запросы HTTP, и здесь идет манипуляция с заголовками HTTP. Но широта использования tcp-сокетов протоколом HTTP не ограничивается, и в других ситуациях могут потребоваться другие возможности (не говоря о том, что даже в новых версиях протокола HTTP отказались от заголовка Connection). И здесь же опять все зависит от удаленного хоста. Когда мы сами делаем клиент и сервер, мы сами можем определить любую логику взаимодействия. Когда мы никак не можем повлиять на работу удаленного хоста, то приходится сообразовать работу сокета с работой удаленного хоста. Тем не менее тут также есть варианты. Так, мы можем отключить получение и/или отправку данных на сокете с помощью метода Shutdown()
В данном случае после отправки данных сокет будет отключен от дальнейшей отправки данных с помощью вызова socket.Shutdown(SocketShutdown.Send) , и после получения данных в методе ReceiveAsync google.com также завершит отправку.
Свойство Available
Свойство Available хранит количество доступных для чтения байтов. Соответственно возникает вопрос, почему бы не использовать эти свойство для отслеживания наличия данных, например:
Но свойство Available будет иметь ненулевое значение, если в текущий момент в потоке есть доступные для чтения данные. Но природа протокола TCP такова, что крупные наборы данных отправляются отдельными пакетами. Какой-то пакет может прийти быстрее, какой-то задержится, какой-то будет потерян, и потребуется переотправка. Поэтому может возникнуть ситуация, что сервер отправил данные, часть данных пришла. В какой-то момент свойство Available у сокета возратило 0, соответственно произошел выход из цикла. И в итоге мы получим неполные данные. Поэтому использование свойства Available в данном случае не лучший вариант.
Обычно при получении данных используют одну из следующих стратегий, которые позволяют определить завершение получения данных:
Использование буфера фиксированной длины, когда мы точно знаем, какой именно объем данных будет послан
Отправка в ответе информации о размере ответа, получив которую, нам будет проще считать нужное количество байтов
Использование маркера окончания ответа, получив который, мы завершим считывание данных
Выбор и реализация конкретной стратегии всецело зависит от сервера, который получает запрос и отправляет ответ.
Рефакторинг подключения
Для упрощения работы с сокетом мы можем вынести код подключения и код отправки-получения данных в отдельные методы: