태그: PowerShell

Microsoft PowerShell을 이용한 DNS 서버 레코드 갱신

 

네트워크 관련 작업을 하다 보면 (주로 비용상의 문제로) 유동 IP를 사용해야 하는 경우가 생기곤 한다.
유동 IP 환경에서 서비스를 제공하기 위하여 주로 DDNS를 사용하게 되는데, 웬만한 도메인 서비스들은 DDNS 서비스를 자체적으로 제공하지만, 만약 자체 도메인 서버를 운용하는 경우라면 어떨까?

리눅스라면 BIND와 쉘 스크립트라는 걸출한 물건이 존재한다. 그리고 윈도우에서는 PowerShell을 이용하여 DNS 서버를 관리할 수 있다.

 

PowerShell로 서버를 관리하기 위해서는 몇 가지 전제 조건이 필요하다.

1. WinRM 서비스가 활성화되어 있어야 한다.
2. PSRemoting이 활성화되어 있어야 한다.
3. WinRM 서비스에서 클라이언트/서버가 각각 신뢰하는 호스트로 등록되어 있어야 한다.
4. WinRM 서비스 포트인 TCP 5985/5986이 열려있어야 한다.
5. 클라이언트에서 파워 쉘 스크립트 실행 권한(Set-ExecutionPolicy)이 주어져 있어야 한다.

 

먼저 서버에서 PSRemoting을 활성화해야 한다. 파워 쉘을 관리자 권한으로 열고, 다음 명령을 입력한다.

기본적으로 PSRemoting은 같은 홈/도메인 네트워크 안, 동일한 서브넷 내에서만 허용되어 있다.
이 제약을 풀기 위하여 다음과 같은 명령어를 입력한다.

이제 서버와 클라이언트에서 서로를 신뢰하는 호스트로 지정해주어야 한다.

호스트 이름은 IP 혹은 FQDN이 될 수 있으며, ‘,'(콤마)로 구분된다. 만약 모든 호스트에 대하여 허용하고 싶다면 *(와일드카드 문자열)을 사용하자.

 

이 시점에서 WinRM 서비스가 시작되어 있지 않다면 등록 과정에서 에러가 발생한다. 경고 메시지에서는 자동으로 WinRM 서비스를 시작한다고 하지만, 실제로는 실행되지 않는다.
그러므로 수동으로 시작해준다.

WinRm 서비스가 시작된 후 정상적으로 신뢰하는 호스트 등록이 가능할 것이다.

 

이렇게 서버-클라이언트의 설정이 마무리되면, 접속을 테스트 해 본다.

접속이 정상적으로 이루어진다면 이러한 메시지가 나올 것이다. 만약 접속되지 않는다면 방화벽과 신뢰하는 호스트의 설정을 다시 살펴보자.

접속에 성공하였다면 원격 세션을 통하여 PowerShell을 실행할 준비가 되었다는 뜻이다.

 

이제 실제로 원격 세션을 열어보자. PowerShell에서 원격 세션을 얻을 수 있는 명령어는 크게 두 가지가 있다.

둘 다 원격 세션을 생성하지만, Enter-PSSession은 프롬프트에 직접 로그인하고, New-PSSession은 세션 객체를 만든다는 차이가 있다.

단순히 명령어를 실행하는 것은 Enter-PSSession이 더 간단하지만, 명령을 수행한 결과를 Return한다거나, 로컬 변수를 이용하여 명령을 수행해야 하는 경우에는 New-PSSession이 더 적합하다.

 

New-PSSession을 이용하여 원격 세션을 만드는 것은 아주 간단하다.

여기서 Credential 옵션은 인증 정보를 제공한다. 공란으로 두거나 String을 입력하였을 경우, 윈도 로그인 창이 팝업되고 인증 정보를 입력할 수 있다.
하지만 우리의 목적은 스크립트를 이용한 자동화이므로 수동으로 자격 증명을 입력하는 것은 바람직하지 않다. 그렇다면 어떻게 인증 정보 입력을 자동화 할 수 있을까?

 

정답은 Credential 옵션에 PSCredential 오브젝트를 넘겨주는 것이다. 단, 이 때 주의할 것은 PowerShell Credential에서 패스워드는 암호화 된 스트링으로 지정된다는 점이다.
Plain String을 넣을 경우 인증이 이루어지지 않는다. 그러므로 먼저 Plain-Text를 SecureString으로 변환해주어야 한다.

새로운 secureString 객체를 만들고 password를 SecureString으로 변환하였다.

 

그리고 PSCredential 오브젝트를 만들 때 아이디와 SecureString을 인자로 넘겨주고, PSCredential로 인증을 수행한다.
이것으로 새로운 PSSession 객체를 얻었다.

 

원격 접속이 성립하였으니, 원격으로 명령어를 실행해야 할 것이다. 원격 명령어 실행을 위해 사용하는 것이 바로 Invoke-Command 명령어다.

Invoke-Command 명령어의 문법은 다음과 같다.

여기서 지역 변수를 전달하고 싶다면 params()와 -ArgumentList 옵션을 사용한다.

 

이 명령어를 이용해 가장 먼저 할 일은 DNSServer 모듈이 존재하는지 확인하는 것이다.

DNSServer Cmdlet이 존재한다면 모듈 목록에 DnsServer가 나올 것이다.

 

DNSServer Cmdlet이 있다면 실제로 DNS 서버의 레코드를 읽고, 변경할 수 있다.
지금은 DDNS를 적용할 것이므로, 레코드의 값을 변경하는 명령어인 Set-DnsServerResourceRecord를 이용해야 한다.

Set-DnsServerResourceRecord cmdlet은 목표 레코드를 리소스 레코드 오브젝트를 통하여 검색한다. 즉, 그 오브젝트와 일치하는 대상을 수정할 수 있다.
그러므로 우리는 먼저 Get-DnsServerResourceRecord를 통하여 목표 리소스 레코드 오브젝트를 얻고, 그것을 수정하여 새로운 변수에 담고, 원본 리소스 레코드를 트리거로 삼아 목표 값을 갱신할 수 있다.

이 때, IPv4 Address의 경우 String을 직접 입력하지 못하므로, System.Net.IPAddress 객체로 변환해주어야 한다는 점에 유의하자.

 

백문이 불여일견, 샘플 소스를 하나 올려두겠다.

 

마지막 줄의 Get-PSSession | Remove-PSSession을 통해 사용이 끝난 세션은 반드시 종료하자.

VMware Horizon 6.2 설치/구성 – (5) Direct Connection 설치/구성

 

1. VMware Horizon View Agnet / Direct Connection Plug-In 설치

VMware Horizon은 피치 못할 이유나, 기타 구성 문제로 View Connection Server를 통한 접속이 불가능한 경우를 위해 클라이언트에서 VM으로 직접 접속이 가능한 Direct Connection이라는 플러그인을 제공하고 있습니다.

View Agent 설치 후 Direct Connection 플러그인을 설치하면, 클라이언트에서 해당 VM의  FQDN으로 직접 접속이 가능해집니다.

 

Horizon Agent와 Direct Connection은 기본적으로 VMware 하이퍼바이저 위에서 동작하도록 설정되어 있으나 KVM, Hyper-V, 심지어는 물리 머신 위에 설치할 수도 있습니다.

기본적으로, 이 경우에는 설치할 때 해당 게스트를 관리할 Connection Server의 주소를 제공해야 합니다.

KakaoTalk_20160519_230754148

그러나, VMware에서는 이 제한을 우회할 수 있는 방법을 제공합니다.

명령 프롬프트를 열고, Horizon Agent 설치 파일이 있는 폴더로 이동합니다. 그리고 다음과 같은 명령으로 설치 프로세스를 시작합니다.

이제 Connection Server의 주소를 제공하지 않고도 설치가 진행됩니다.

Agent의 설치가 완료된 뒤, Direct Connection을 설치하면 클라이언트로부터의 직접 접속이 가능해집니다.

  설치 과정에서 Horizon 라이센스의 검증은 이루어지지 않습니다. 하지만 이 VM/물리 머신에 접속하는 세션도 Horizon의 기능을 이용하는 것이기에, 적절한 수량의 Concurrently Connected User 라이센스가 필요합니다.

 

2. NAT / 포트포워딩 설정하기

NAT가 적용된 호스트에 접속하기 위해서는 포트포워딩이 필요합니다. PCoIP는 SSL 연결에 443, PCoIP 연결에 TCP/UDP 4172를 사용합니다.

또한, 올바른 External IP Address를 설정해야 합니다. 3번PCoIP Session 설정 (ADM파일 이용)을 참조하십시오.

 

이 설정은 레지스트리를 수정하는 것으로 수행될 수도 있습니다. 레지스트리 설정값은 다음과 같습니다.

파워 쉘 스크립트를 이용하여 유동 IP 환경에 대응하는 것 또한 가능합니다.

예제 파워 쉘 스크립트입니다.

이 스크립트를 작업 스케줄러에 등록하고, 주기적으로 실행시켜줄 수 있습니다. 해당 스크립트를 실행하기 위해서는 스크립트 실행 권한과 관리자 권한이 필요합니다.

스크립트 실행 권한을 얻기 위해서는 파워 쉘을 관리자 권한으로 실행하고 다음 명령어를 입력합니다.

 

3. PCoIP Session 설정 (ADM 파일 이용)

  그룹 정책 관리 탬플릿(ADM)을 이용하기 위해서는 사용중인 Windows의 버젼이 Professional 이상이어야 합니다.

3-1. 로컬 그룹 정책을 편집하기 위하여 gpedit.msc를 실행합니다.

Group_Policy-1

3-2. 컴퓨터 구성 – 관리 탬플릿을 우클릭, 탬플릿 추가/제거를 선택합니다.

 

Group_Policy-2

3-3. Horizon View Agent Direct Connection의 관리 템플릿을 추가합니다. 경로는 <Agent 설치 폴더>\extras\ 입니다.

 

Group_Policy-3

3-4. ADM을 통하여 Direct Connection 세션의 설정을 변경할 수 있습니다.

View Administrator의 그것에 비하여 설정할 수 있는 옵션이 적지만, 반드시 필요한 설정들은 다 사용할 수 있습니다.

 

4. 테스트 결과 / 확인된 문제들

1-1. KVM / Windows 10 에서의 정상 동작을 확인하였습니다.

1-2. 물리 머신의 Windows 8.1 / Hyper-V 위의 Windows 8.1에서 마우스 포인터가 사라지고, 키보드가 먹통이 되는 문제를 확인하였습니다. Windows 8.1과의 호환성 문제인지, Hyper-V와 물리 머신 드라이버의 호환 문제인지는 확인되지 않았습니다.

에러 로그는 다음과 같습니다.

확인 결과 Hyper-V의 통합 드라이버가 문제를 발생시키는 것으로 보입니다. / Integration Service 비활성화 후 진행, 여전히 동작하지 않습니다.

1-3. Windows 10 / Hyper-V 또한 동작하지 않습니다. Hyper-V와 호환되지 않는 것으로 보입니다.

5. 함께 보기

 

1. VMware Horizon 6.2 설치/구성 – (0) VMware Horizon 소개

2. VMware Horizon 6.2 설치/구성 – (1) 사전 준비와 설치 

3. VMware Horizon 6.2 설치/구성 – (2) VMware Horizon 설정

4. VMware Horizon 6.2 설치/구성 – (3) 보안 서버에 SSL 인증서 배포하기

5. VMware Horizon 6.2 설치/구성 (4) – ThinApp 배포하기

6. VMware Horizon 6.2 설치/구성 – (5) Direct Connection 설치/구성(현재 포스트)