안녕하세요, 카브로 주민 여러분! 책에서 David Clinton은 백업 및 복구 시스템 자동화, Dropbox 스타일 개인 파일 클라우드 설정, 자신만의 MediaWiki 서버 생성 등 12가지 실제 프로젝트를 설명합니다. 흥미로운 사례 연구를 통해 가상화, 재해 복구, 보안, 백업, DevOps 및 시스템 문제 해결을 살펴보겠습니다. 각 장은 모범 사례 검토, 새로운 용어집 및 연습 문제로 끝납니다.
Отрывок «10.1. Создание туннеля OpenVPN»
나는 이미 이 책에서 암호화에 관해 많은 이야기를 했습니다. SSH 및 SCP는 원격 연결을 통해 전송된 데이터를 보호할 수 있으며(3장), 파일 암호화는 서버에 저장된 데이터를 보호할 수 있으며(8장), TLS/SSL 인증서는 사이트와 클라이언트 브라우저 간에 전송되는 데이터를 보호할 수 있습니다(9장). . 그러나 때로는 더 넓은 범위의 연결에서 데이터를 보호해야 할 때도 있습니다. 예를 들어, 팀원 중 일부는 공용 핫스팟을 통해 Wi-Fi에 연결하면서 이동 중에 작업할 수 있습니다. 이러한 액세스 포인트가 모두 안전하다고 가정해서는 안 되지만 직원들에게는 회사 리소스에 연결할 수 있는 방법이 필요하며 VPN이 도움이 될 수 있습니다.
적절하게 설계된 VPN 터널은 안전하지 않은 네트워크를 통해 이동하는 데이터를 숨기는 방식으로 원격 클라이언트와 서버 간의 직접 연결을 제공합니다. 그래서 뭐? 암호화를 통해 이를 수행할 수 있는 많은 도구를 이미 살펴보았습니다. VPN의 진정한 가치는 터널을 열어 원격 네트워크가 모두 로컬인 것처럼 연결할 수 있다는 것입니다. 어떤 의미에서는 우회를 사용하고 있는 것입니다.
이 확장된 네트워크를 사용하여 관리자는 어디서나 서버에서 작업을 수행할 수 있습니다. 그러나 더 중요한 것은 리소스가 여러 위치에 분산되어 있는 회사가 리소스가 필요한 모든 그룹이 어디에 있든 이를 모두 볼 수 있고 액세스할 수 있도록 할 수 있다는 것입니다(그림 10.1).
Сам по себе туннель не гарантирует безопасность. Но один из стандартов шифрования может быть включен в структуру сети, что существенно повышает уровень безопасности. Туннели, созданные с применением пакета OpenVPN с открытым исходным кодом, используют то же шифрование TLS/SSL, о котором вы уже читали. OpenVPN не единственный доступный вариант для туннелирования, но один из самых известных. Считается, что он немного быстрее и безопаснее, чем альтернативный туннельный протокол уровня 2, использующий шифрование IPsec.
Вы хотите, чтобы в вашей команде все безопасно общались друг с другом, находясь в дороге или работая в разных зданиях? Для этого необходимо создать сервер OpenVPN, чтобы разрешить совместное использование приложений и доступ к локальной сетевой среде сервера. Чтобы это работало, достаточно запустить две виртуальные машины или два контейнера: одну для выполнения роли сервера/хоста, а другую — для клиента. Создание VPN — непростой процесс, поэтому, вероятно, стоит потратить несколько минут на то, чтобы представить себе общую картину.

10.1.1. 서버 구성 OpenVPN
시작하기 전에 몇 가지 유용한 조언을 드리겠습니다. 직접 수행할 예정이라면(그리고 강력히 권장합니다) 데스크탑에 여러 개의 터미널 창을 열고 각각 다른 컴퓨터에 연결되어 있는 상태에서 작업하게 될 것입니다. 어느 시점에서 창에 잘못된 명령을 입력할 위험이 있습니다. 이를 방지하려면 호스트 이름 명령을 사용하여 명령줄에 표시되는 컴퓨터 이름을 현재 위치를 명확하게 알려주는 이름으로 변경할 수 있습니다. 이 작업을 수행한 후에는 새 설정을 적용하려면 서버에서 로그아웃했다가 다시 로그인해야 합니다. 다음과 같습니다.

이 접근 방식을 따르고 작업하는 각 컴퓨터에 적절한 이름을 지정하면 현재 위치를 쉽게 추적할 수 있습니다.
После использования hostname вы можете столкнуться с раздражающими сообщениями Unable to Resolve Host OpenVPN-Server при выполнении последующих команд. Обновление файла /etc/hosts с соответствующим новым именем хоста должно решить проблему.
Подготовка вашего сервера для OpenVPN
설치용 OpenVPN на вашем сервере требуется два пакета: openvpn и easy-rsa (для управления процессом генерации ключа шифрования). Пользователи CentOS должны при необходимости сначала установить репозиторий epel-release, как вы делали это в главе 2. Чтобы иметь возможность проверить доступ к серверному приложению, вы также можете установить веб-сервер Apache (apache2 для Ubuntu и httpd на CentOS).
Пока вы настраиваете сервер, советую активировать брандмауэр, который блокирует все порты, кроме 22 (SSH) и 1194 (порт OpenVPN по умолчанию). Этот пример иллюстрирует, как будет работать ufw в Ubuntu, но я уверен, что вы все еще помните программу firewalld CentOS из главы 9:
# ufw enable
# ufw allow 22
# ufw allow 1194서버의 네트워크 인터페이스 간 내부 라우팅을 활성화하려면 /etc/sysctl.conf 파일에서 한 줄(net.ipv4.ip_forward = 1)의 주석 처리를 제거해야 합니다. 이렇게 하면 원격 클라이언트가 연결된 후 필요에 따라 리디렉션될 수 있습니다. 새 옵션을 작동시키려면 sysctl -p를 실행하십시오:
# nano /etc/sysctl.conf
# sysctl -p이제 서버 환경이 완전히 구성되었지만 준비되기 전에 수행해야 할 작업이 한 가지 더 있습니다. 다음 단계를 완료해야 합니다(자세한 내용은 다음에서 다루겠습니다).
- Создайте на сервере набор ключей для шифрования инфраструктуры открытых ключей (PKI) с помощью сценариев, поставляемых с пакетом easy-rsa. По сути, сервер OpenVPN также действует как собственный центр сертификации (ЦС).
- 클라이언트에 적합한 키를 준비하세요.
- 서버에 대한 server.conf 파일 구성
- Настройте ваш клиент OpenVPN
- VPN을 확인하세요
암호화 키 생성
Чтобы не усложнять жизнь, можно настроить свою ключевую инфраструктуру на той же машине, где работает сервер OpenVPN. Однако в рекомендациях по безопасности обычно предлагается использовать отдельный сервер ЦС для развертываний в производственной среде. Процесс генерации и распределения ресурсов ключа шифрования для использования в OpenVPN проиллюстрирован на рис. 10.2.

Когда вы устанавливали OpenVPN, автоматически был создан каталог /etc/openvpn/, но в нем пока ничего нет. Пакеты openvpn и easy-rsa поставляются с примерами файлов шаблонов, которые вы можете использовать как основу для своей конфигурации. Чтобы запустить процесс сертификации, скопируйте каталог шаблона easy-rsa из /usr/share/ в /etc/openvpn и перейдите в каталог easy-rsa/:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa이제 easy-rsa 디렉토리에는 꽤 많은 스크립트가 포함됩니다. 테이블에 10.1에는 키를 생성하는 데 사용할 도구가 나열되어 있습니다.

위 작업에는 루트 권한이 필요하므로 sudo su를 통해 루트 권한이 필요합니다.
작업할 첫 번째 파일은 vars라고 하며 easy-rsa가 키를 생성할 때 사용하는 환경 변수를 포함합니다. 이미 존재하는 기본값 대신 사용자 고유의 값을 사용하려면 파일을 편집해야 합니다. 이것이 내 파일의 모습입니다(목록 10.1).
목록 10.1. /etc/openvpn/easy-rsa/vars 파일의 주요 조각
export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"vars 파일을 실행하면 해당 값이 셸 환경으로 전달되어 새 키의 내용에 포함됩니다. sudo 명령 자체가 작동하지 않는 이유는 무엇입니까? 첫 번째 단계에서 vars라는 스크립트를 편집한 다음 적용하기 때문입니다. 적용한다는 것은 vars 파일이 해당 값을 셸 환경으로 전달하여 새 키의 내용에 포함된다는 것을 의미합니다.
완료되지 않은 프로세스를 완료하려면 새 셸을 사용하여 파일을 다시 실행해야 합니다. 이 작업이 완료되면 스크립트는 /etc/openvpn/easy-rsa/keys/ 디렉터리의 모든 콘텐츠를 제거하기 위해 다른 스크립트인 clean-all을 실행하라는 메시지를 표시합니다.

당연히 다음 단계는 clean-all 스크립트를 실행한 다음 pkitool 스크립트를 사용하여 루트 인증서를 생성하는 build-ca를 실행하는 것입니다. vars에서 제공한 ID 설정을 확인하라는 메시지가 표시됩니다.
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key다음은 빌드 키 서버 스크립트입니다. 새 루트 인증서와 함께 동일한 pkitool 스크립트를 사용하므로 키 쌍 생성을 확인하는 동일한 질문이 표시됩니다. 키 이름은 전달한 인수에 따라 지정됩니다. 이 시스템에서 여러 VPN을 실행하지 않는 한 일반적으로 다음 예와 같이 서버가 됩니다.
# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base UpdatedOpenVPN использует параметры, сгенерированные с помощью алгоритма Диффи — Хеллмана (с применением build-dh), чтобы согласовать аутентификацию для новых соединений. Созданный здесь файл не должен быть секретным, но должен быть сгенерирован с использованием сценария build-dh для ключей RSA, которые в данный момент активны. Если вы создадите новые ключи RSA в будущем, вам также потребуется обновить файл на основе алгоритма Диффи — Хеллмана:
# ./build-dhВаши ключи на стороне сервера теперь попадут в каталог /etc/openvpn/easy-rsa/keys/, но OpenVPN этого не знает. По умолчанию OpenVPN будет искать ключи в /etc/openvpn/, поэтому скопируйте их:
# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn클라이언트 암호화 키 준비
이미 본 것처럼 TLS 암호화는 일치하는 키 쌍을 사용합니다. 하나는 서버에 설치되고 다른 하나는 원격 클라이언트에 설치됩니다. 즉, 클라이언트 키가 필요합니다. 우리의 오랜 친구인 pkitool이 바로 여러분에게 필요한 것입니다. 이 예에서는 /etc/openvpn/easy-rsa/ 디렉터리에서 프로그램을 실행할 때 클라이언트 인수를 전달하여 client.crt 및 client.key라는 파일을 생성합니다.
# ./pkitool client이제 두 클라이언트 파일은 여전히 키/ 디렉터리에 있는 원본 ca.crt 파일과 함께 클라이언트로 안전하게 전송되어야 합니다. 소유권과 접근 권한으로 인해 이는 쉽지 않을 수 있습니다. 가장 간단한 방법은 소스 파일의 내용(해당 내용만 제외)을 PC 바탕 화면에서 실행 중인 터미널에 수동으로 복사하는 것입니다(텍스트를 선택하고 마우스 오른쪽 버튼을 클릭한 후 메뉴에서 복사를 선택). 그런 다음 이를 클라이언트에 연결된 두 번째 터미널에서 생성한 것과 동일한 이름의 새 파일에 붙여넣습니다.
하지만 누구나 자르고 붙여넣을 수 있습니다. 대신, 잘라내기/붙여넣기 작업이 가능한 GUI에 항상 액세스할 수 있는 것은 아니기 때문에 관리자처럼 생각하십시오. 파일을 사용자의 홈 디렉터리에 복사한 다음(원격 scp 작업이 해당 파일에 액세스할 수 있도록) chown을 사용하여 파일 소유권을 루트에서 루트가 아닌 일반 사용자로 변경하여 원격 scp 작업을 수행할 수 있습니다. 모든 파일이 현재 설치되어 있고 액세스할 수 있는지 확인하세요. 잠시 후에 클라이언트로 이동합니다.
# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crt전체 암호화 키 세트가 준비되면 VPN 생성 방법을 서버에 알려야 합니다. 이는 server.conf 파일을 사용하여 수행됩니다.
키 입력 횟수 줄이기
타이핑이 너무 많나요? 대괄호를 사용하여 확장하면 이러한 XNUMX개 명령을 XNUMX개로 줄이는 데 도움이 됩니다. 나는 여러분이 이 두 가지 예를 연구하고 무슨 일이 일어나고 있는지 이해할 수 있다고 확신합니다. 더 중요한 것은 수십 또는 수백 개의 요소가 포함된 작업에 이러한 원칙을 적용하는 방법을 이해할 수 있다는 것입니다.
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
server.conf 파일 설정
Откуда вы можете знать, как должен выглядеть файл server.conf? Помните шаблон каталога easy-rsa, который вы скопировали из /usr/share/? При установке OpenVPN остался сжатый файл шаблона конфигурации, который вы можете скопировать в /etc/openvpn/. Я буду опираться на тот факт, что шаблон заархивирован, и познакомлю вас с полезным инструментом: zcat.
cat 명령을 사용하여 파일의 텍스트 내용을 화면에 인쇄하는 방법에 대해 이미 알고 있지만, gzip을 사용하여 파일을 압축하면 어떻게 될까요? 언제든지 파일의 압축을 풀면 cat이 파일을 출력하지만 이는 필요한 것보다 한두 단계 더 필요합니다. 대신, 짐작할 수 있듯이 zcat 명령을 실행하여 압축을 푼 텍스트를 한 단계로 메모리에 로드할 수 있습니다. 다음 예에서는 텍스트를 화면에 인쇄하는 대신 server.conf라는 새 파일로 리디렉션합니다.
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpnОставим в стороне обширную и полезную документацию, прилагаемую к файлу, и посмотрим, как он может выглядеть, когда вы закончите редактирование. Обратите внимание, что точка с запятой (;) указывает OpenVPN не читать и не выполнять следующую строку (листинг 10.2).

이러한 설정 중 일부를 살펴보겠습니다.
- 기본적으로 OpenVPN работает через порт 1194. Вы можете изменить это, например, чтобы еще больше скрыть свои действия или избежать конфликтов с другими активными туннелями. Поскольку 1194 требует минимальной координации с клиентами, лучше всего сделать именно так.
- OpenVPN применяет для передачи данных либо протокол управления передачей (TCP), либо протокол пользовательских датаграмм (UDP). TCP может быть немного медленнее, но он более надежен и с большей вероятностью понятен приложениям, работающим на обоих концах туннеля.
- 데이터 콘텐츠만 전달하는 더 간단하고 효율적인 IP 터널을 생성하려는 경우 dev tun을 지정할 수 있습니다. 반면에 여러 네트워크 인터페이스(및 해당 인터페이스가 나타내는 네트워크)를 연결하여 이더넷 브리지를 생성해야 하는 경우 dev 탭을 선택해야 합니다. 이것이 무엇을 의미하는지 이해하지 못한다면 tun 인수를 사용하십시오.
- Следующие четыре строки передают OpenVPN имена трех файлов аутентификации на сервере и файл параметров dh2048, который вы создали ранее.
- 서버 라인은 로그인 시 클라이언트에 IP 주소를 할당하는 데 사용되는 범위와 서브넷 마스크를 설정합니다.
- Необязательный параметр push «route 10.0.3.0 255.255.255.0» позволяет удаленным клиентам получать доступ к частным подсетям за сервером. Для выполнения этой работы также требуется настройка сети на самом сервере, чтобы частная подсеть знала о подсети OpenVPN (10.8.0.0).
- 포트 공유 localhost 80 라인을 사용하면 포트 1194에서 들어오는 클라이언트 트래픽을 포트 80에서 수신 대기하는 로컬 웹 서버로 리디렉션할 수 있습니다. (이는 웹 서버를 사용하여 VPN을 테스트하려는 경우 유용합니다.) 그런 다음 tcp 프로토콜이 선택되면.
- 세미콜론(;)을 제거하여 사용자 none 및 그룹 nogroup 줄을 활성화해야 합니다. 원격 클라이언트를 none 및 nogroup으로 실행하도록 강제하면 서버의 세션에 권한이 부여되지 않습니다.
- log указывает, что текущие записи в журнале будут перезаписывать старые записи при каждом запуске OpenVPN, тогда как log-append добавляет новые записи в существующий файл журнала. Сам файл openvpn.log записывается в каталог /etc/openvpn/.
Кроме того, в файл конфигурации также часто добавляют значение client-to-client, чтобы несколько клиентов могли видеть друг друга в дополнение к серверу OpenVPN. Если вы удовлетворены своей конфигурацией, то можно запускать сервер OpenVPN:
# systemctl start openvpnИз-за меняющегося характера отношений между OpenVPN и systemd для запуска службы иногда может потребоваться такой синтаксис: systemctl start openvpn@server.
Запуск ip addr для отображения списка сетевых интерфейсов вашего сервера теперь должен вывести ссылку на новый интерфейс с именем tun0. OpenVPN создаст его для обслуживания входящих клиентов:
$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft forever모든 것이 완전히 작동하기 전에 서버를 재부팅해야 할 수도 있습니다. 다음 중지는 클라이언트 컴퓨터입니다.
10.1.2. Конфигурирование клиента OpenVPN
Традиционно туннели строятся как минимум с двумя выходами (иначе мы бы называли их пещерами). Правильно настроенный OpenVPN на сервере направляет трафик в туннель и из него с одной стороны. Но вам также потребуется какое-то программное обеспечение, работающее на стороне клиента, то есть на другом конце туннеля.
В этом разделе я собираюсь сосредоточиться на ручной настройке компьютера с Linux того или иного типа для работы в качестве клиента OpenVPN. Но это не единственный способ, с помощью которого доступна такая возможность. OpenVPN поддерживает клиентские приложения, которые можно устанавливать и использовать на настольных компьютерах и ноутбуках с Windows 또는 macOS, а также на смартфонах и планшетах на базе Android и iOS. Подробности см. на сайте openvpn.net.
패키지 OpenVPN необходимо будет установить на клиентском компьютере, как он был установлен на сервере, хотя здесь нет необходимости в easy-rsa, поскольку используемые вами ключи уже существуют. Вам нужно скопировать файл шаблона client.conf в каталог /etc/openvpn/, который только что был создан. На этот раз файл не будет заархивирован, поэтому обычная команда cp отлично справится с данной задачей:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/client.conf 파일의 대부분의 설정은 설명이 필요하지 않습니다. 즉, 서버의 값과 일치해야 합니다. 다음 예제 파일에서 볼 수 있듯이 고유 매개변수는 원격 192.168.1.23 1194이며, 이는 클라이언트에게 서버의 IP 주소를 알려줍니다. 다시 한 번 이것이 귀하의 서버 주소인지 확인하십시오. 또한 중간자 공격을 방지하기 위해 클라이언트 컴퓨터가 서버 인증서의 신뢰성을 확인하도록 강제해야 합니다. 이를 수행하는 한 가지 방법은 remote-cert-tls server 행을 추가하는 것입니다(목록 10.3).

이제 /etc/openvpn/ 디렉터리로 이동하여 서버에서 인증 키를 추출할 수 있습니다. 예제의 서버 IP 주소 또는 도메인 이름을 원하는 값으로 바꾸세요.

Ничего захватывающего, скорее всего, не произойдет, пока вы не запустите OpenVPN на клиенте. Поскольку вам нужно передать пару аргументов, вы сделаете это из командной строки. Аргумент —tls-client сообщает OpenVPN, что вы будете действовать как клиент и подключаться через шифрование TLS, а —config указывает на ваш файл конфигурации:
# openvpn --tls-client --config /etc/openvpn/client.conf명령 출력을 주의 깊게 읽고 올바르게 연결되었는지 확인하십시오. 처음에 문제가 발생하는 경우 서버와 클라이언트 구성 파일 간의 설정 불일치 또는 네트워크 연결/방화벽 문제 때문일 수 있습니다. 다음은 몇 가지 문제 해결 팁입니다.
- Внимательно прочитайте вывод операции OpenVPN на клиенте. Он часто содержит ценные советы о том, что именно не может быть выполнено и почему.
- 서버의 /etc/openvpn/ 디렉터리에 있는 openvpn.log 및 openvpn-status.log 파일에서 오류 메시지를 확인하세요.
- Проверьте связанные с OpenVPN и подходящие по времени сообщения в системных журналах на сервере и клиенте. (journalctl -ce выведет на экран самые последние записи.)
- 서버와 클라이언트 사이에 활성 네트워크 연결이 있는지 확인하십시오(자세한 내용은 14장 참조).
Об авторе
데이비드 클린턴 — системный администратор, преподаватель и писатель. Он администрировал, писал об этом и создавал учебные материалы для многих важных технических дисциплин, включая системы Linux, облачные вычисления (в частности AWS) и контейнерные технологии, такие как Docker. Он написал книгу Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Многие из его учебных видеокурсов можно найти на сайте Pluralsight.com, а ссылки на другие его книги (по администрированию Linux и виртуализации серверов) доступны по адресу .
» 책에 대한 자세한 내용은 다음에서 확인할 수 있습니다.
»
»
Khabrozhiteley의 경우 쿠폰을 사용하여 25% 할인을 받으세요 - Linux
종이책을 결제하시면 전자책이 이메일로 발송됩니다.
출처 : habr.com
