🌆
Sunset Archive
GitHubLinkedInBlog
  • litsynp
  • Archives
    • Projects
      • Let's Parking!
      • 맛집몬스터 (JMT Monster)
      • spring-x-demo Projects
    • Articles
      • My Thoughts on GitBook
      • Wake-on-LAN & RDP Setup
    • Learning
      • Languages
        • Rust
          • Useful Links
          • Syntax
          • Pointers
          • Dependencies
          • Logging
          • Phantom Types
          • Iterable
            • Optional Skip
        • Go
          • Useful Links
          • Structures
          • Zero Values
          • Error Handling
          • Dependency Injection
          • Project Layout
        • JavaScript/TypeScript
          • Basics
            • Types
              • [JS] Falsy Values
              • [TS] Types - unknown, any, never
            • Rest Parameters (...)
            • Spread Syntax (...)
            • Destructuing Assignment
            • CJS, AMD, UMD, ESM
          • Advanced
            • Conditional Destructuring Assignment
            • Type Guards
          • Miscellaneous
            • Dependency Injection in JS?
            • ESLint, Prettier, TypeScript
          • Node
            • Useful Links
            • General
              • V8 Engine
              • Version Management: NVM
              • Environment Variables
            • Database
              • Knex
        • C
          • Dynamic Multi-dimensional Arrays
        • Spring
          • General
            • @Import v.s. @ContextConfiguration
            • MessageSource
          • Kotlin+Spring
            • Kotlin Annotations (Use-Site Targets)
            • Handling Null in Request DTO
            • Handling Null in URL
          • Reactive Stack
            • Reactive API with Spring WebFlux
          • Spring Security
            • Google OAuth Setup
          • Spring Batch
            • Bulk Insert
        • Kotlin
          • val/var in Constructor
          • Initializer Blocks
          • Inheritance Modifiers (final, open, abstract)
          • Delegate Pattern
        • Java
          • Serialization
          • Random Number Generation
            • (1) Math.random() v.s. Random
            • (2) Random v.s. ThreadLocalRandom
        • Python
          • Version Management
        • Ruby
          • Installation
          • Getters & Setters
        • Elixir
        • Erlang
        • Flutter
        • AWS
          • AWS CLI
        • Terraform
          • Installation
          • Basics
      • Code
        • OOP
          • The 4 Basic Concepts of OOP
          • The SOLID Principles
          • GRASP
          • Spring POJO
          • Others
        • Functional Programming
          • Currying
          • Higher-Order Function
          • Closure
          • Monad
        • 공변성, 반공변성, 무공변성
        • Others
          • UUID
          • GraphQL
          • Multimedia
            • Streaming
          • Geography
            • 위도 (Latitude), 경도 (Longitude)
      • Tools
        • Nix
        • Mermaid
          • Flowchart
          • Sequence Diagram
          • Class Diagram
          • Entity Relationship Diagrams
        • VSCode
          • VSCode CLI
          • VSCode Extensions
        • JetBrains
          • IntelliJ - Open Projects in Tabs
          • Delete Leftover IDE Directories
        • vim
          • Commands
      • Books
        • 다재다능 코틀린 프로그래밍 (Programming Kotlin)
          • Pt 01. 코틀린으로 스크립팅 하기
            • Ch 01. 코틀린 시작하기
            • Ch 02. Java 개발자를 위한 코틀린 필수 사항
            • Ch 03. 함수를 사용하자
            • Ch 05. 콜렉션 사용하기
        • 오브젝트 (Object)
          • Ch.0 들어가며 - 프로그래밍 패러다임
          • Ch.1 객체, 설계
          • Ch.2 객체지향 프로그래밍
          • Ch.3 역할, 책임, 협력
          • Ch.4 설계 품질과 트레이드오프
          • Ch.5 책임 할당하기
          • Ch.6 메시지와 인터페이스
          • Ch.7 유연한 설계
          • Ch.8 의존성 관리하기
          • Ch.9 유연한 설계
          • Ch.10 상속과 코드 재사용
          • Ch.11 합성과 유연한 설계
          • Ch.12 다형성
          • Ch.13 서브클래싱과 서브타이핑
          • Ch.14 일관성 있는 협력
          • Ch.15 디자인 패턴과 프레임워크
          • End. 마치며 - 나아가기
          • 후기
        • 헤드 퍼스트 디자인 패턴 (Head First Design Patterns)
          • Ch.1 디자인 패턴 소개와 전략 패턴
          • Ch.2 옵저버 패턴
          • Ch.3 데코레이터 패턴
          • Ch.4 팩토리 패턴
          • Ch.5 싱글턴 패턴
          • Ch.6 커맨드 패턴
          • Ch.7 어댑터 패턴과 퍼사드 패턴
          • Ch.8 템플릿 메소드 패턴
          • Ch.9 반복자 패턴과 컴포지트 패턴
          • Ch.10 상태 패턴
          • Ch.11 프록시 패턴
          • Ch.12 복합 패턴
        • 이펙티브 타입스크립트 (Effective TypeScript)
          • Ch.1 타입스크립트 알아보기
            • Item 1 타입스크립트와 자바스크립트의 관계 이해하기
            • Item 2 타입스크립트 설정 이해하기
            • Item 3 코드 생성과 타입이 관계없음을 이해하기
            • Item 4 구조적 타이핑에 익숙해지기
            • Item 5 any 타입 지양하기
          • Ch.2 타입스크립트의 타입 시스템
            • Item 6 편집기를 사용하여 타입 시스템 탐색하기
            • Item 7 타입이 값들의 집합이라고 생각하기
            • Item 1-7 Study Summary
            • Item 8 타입 공간과 값 공간의 심벌 구분하기
            • Item 9 타입 단언보다는 타입 선언을 사용하기
            • Item 10 객체 래퍼 타입 피하기
            • Item 11 잉여 속성 체크의 한계 인지하기
            • Item 12 함수 표현식에 타입 적용하기
            • Item 13 타입과 인터페이스의 차이점 알기
            • Item 14 타입 연산과 제너릭 사용으로 반복 줄이기
            • Item 15 동적 데이터에 인덱스 시그니처 사용하기
            • Item 16 number 인덱스 시그니처보다는 Array, 튜플, ArrayLike를 사용하기
            • Item 17 변경 관련된 오류 방지를 위해 readonly 사용하기
            • Item 18 매핑된 타입을 사용하여 값을 동기화하기
          • Ch.3 타입 추론
            • Item 19 추론 가능한 타입을 사용해 장황한 코드 방지하기
            • Item 20 다른 타입에는 다른 변수 사용하기
            • Item 21 타입 넓히기
            • Item 22 타입 좁히기
            • Item 23 한꺼번에 객체 생성하기
            • Item 24 일관성 있는 별칭 사용하기
            • Item 25 비동기 코드에는 콜백 대신 async 함수 사용하기
            • Item 26 타입 추론에 문맥이 어떻게 사용되는지 이해하기
            • Item 27 함수형 기법과 라이브러리로 타입 흐름 유지하기
          • Ch.4 타입 설계
            • Item 28 유효한 상태만 표현하는 타입을 지향하기
            • Item 29 사용할 때는 너그럽게, 생성할 때는 엄격하게
            • Item 30 문서에 타입 정보를 쓰지 않기
            • Item 31 타입 주변에 null 값 배치하기
            • Item 32 유니온의 인터페이스보다는 인터페이스의 유니온을 사용하기
            • Item 33 string 타입보다 더 구체적인 타입 사용하기
            • Item 34 부정확한 타입보다는 미완성 타입을 사용하기
            • Item 35 데이터가 아닌, API와 명세를 보고 타입 만들기
            • Item 36 해당 분야의 용어로 타입 이름 짓기
            • Item 37 공식 명칭에는 상표를 붙이기
          • Ch.5 any 다루기
            • Item 38 any 타입은 가능한 한 좁은 범위에서만 사용하기
            • Item 39 any를 구체적으로 변형해서 사용하기
            • Item 40 함수 안으로 타입 단언문 감추기
            • Item 41 any의 진화를 이해하기
            • Item 42 모르는 타입의 값에는 any 대신 unknown을 사용하기
            • Item 43 몽키 패치보다는 안전한 타입을 사용하기
            • Item 44 타입 커버리지를 추적하여 타입 안전성 유지하기
          • Ch.6 타입 선언과 @types
            • Item 45 devDependencies에 typescript와 @types 추가하기
            • Item 46 타입 선언과 관련된 세 가지 버전 이해하기
            • Item 47 공개 API에 등장하는 모든 타입을 익스포트하기
            • Item 48 API 주석에 TSDoc 사용하기
            • Item 49 콜백에서 this에 대한 타입 제공하기
            • Item 50 오버로딩 타입보다는 조건부 타입을 사용하기
            • Item 51 의존성 분리를 위해 미러 타입 사용하기
            • Item 52 테스팅 타입의 함정에 주의하기
          • Ch.7 코드를 작성하고 실행하기
            • Item 53 타입스크립트 기능보다는 ECMAScript 기능을 사용하기
            • Item 54 객체를 순회하는 노하우
            • Item 55 DOM 계층 구조 이해하기
            • Item 56 정보를 감추는 목적으로 private 사용하지 않기
            • Item 57 소스맵을 사용하여 타입스크립트 디버깅하기
          • Ch.8 타입스크립트로 마이그레이션하기
            • Item 58 모던 자바스크립트로 작성하기
            • Item 59 타입스크립트 도입 전에 @ts-check와 JSDoc으로 시험해 보기
            • Item 60 allowJS로 타입스크립트와 자바스크립트 같이 사용하기
            • Item 61 의존성 관계에 따라 모듈 단위로 전환하기
            • Item 62 마이그레이션의 완성을 위해 noImplicitAny 설정하기
        • Dive Into Design Patterns
          • 디자인 패턴 소개
          • 소프트웨어 디자인 원칙들
          • 디자인 패턴 목록
          • 유용한 링크
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (System Design Interview)
          • Key Points
          • Real Life Systems
          • Engineering Blogs
        • Node.js 디자인 패턴 바이블 (Node.js Design Patterns 3rd Edition)
        • 리팩터링 2판 (Refactoring: 2nd Ed.)
          • 1장 리팩터링: 첫 번째 예시
          • 2장 리팩터링 원칙
          • 3장 코드에서 나는 악취
          • 4장 테스트 구축하기
Powered by GitBook
On this page
  • About
  • RDP (Remote Desktop Protocol)
  • WoL (Wake-on-LAN)
  • More on the matter

Was this helpful?

Edit on GitHub
  1. Archives
  2. Articles

Wake-on-LAN & RDP Setup

내 방에 있는 컴퓨터를 집 밖에서도 사용해보자.

PreviousMy Thoughts on GitBookNextLearning

Last updated 9 months ago

Was this helpful?

About

Back in the day

어릴 때 처음으로 산 "내 랩탑"이라고 부를 수 있을 만한 것은 애플의 유니바디 맥북이었다.

"흰둥이"라고 불렸던 이 둥글둥글하고 지금 봐도 귀여운 녀석은 애플에서 만든 맥북 2010년 모델로 내 어린 시절 추억이 가득한 랩탑이다. 무게는 2.13kg 정도라는데 사실 무거운 편은 아니었지만 배터리 성능과 무게에 불만이 있어서 그 뒤로 몇 년 동안 노트북을 구매할 때는 가볍고 배터리가 오래 가는 노트북을 샀다.

아무튼 2019년 초, 내 첫 데스크탑을 조립했다. 이후 RAM과 GPU도 업그레이드 하면서 꽤나 쾌적한 작업 환경을 구축했다.

학교 가는데 매번 노트북조차 들고 다니기 귀찮았던 나는 "내 컴퓨터가 이렇게 성능이 좋은데 밖에서도 내 컴퓨터에 접속을 할 순 없을까?"라는 생각이 들었다.

Cloud Computing?

옛날부터 클라우드 상에 컴퓨터가 띄워져 있으면 참 좋겠다고 생각한 나는 처음엔 클라우드 컴퓨터를 떠올렸다. 그런데 당시 데스크탑을 대체할 만한 괜찮은 서비스는 내 눈에 보이지 않았다.

어차피 내 컴퓨터도 있겠다, 내 컴퓨터가 유비쿼터스하게 어디서든 접근이 가능하면 좋겠다 이거다. 이걸 활용할 수 있는 방안을 좀 더 조사해봤다. 그러다가 RDP라는 것이 눈에 들어왔다.

RDP (Remote Desktop Protocol)

이 프로토콜을 활용해 원격으로 컴퓨터를 접근할 수 있도록 하는 프로그램이 마이크로소프트 리모트 데스크탑이다.

RDP 말고도 사실 원격 제어는 팀뷰어, 크롬 원격 데스크탑, VNC 등등...이 유명하고 널리 알려진 것이 많다. 그럼 왜 굳이 RDP를 썼을까?

  • 속도가 빠르고 이미지나 영상 글자를 볼 때 화질이 좋다.

    • 컴퓨터공학과다이보니 적어도 기본적인 코딩은 할 수 있어야 하는데 팀뷰어, 크롬 원격 데스크탑은 속도가 조금만 느려져도 화질이 너무 저하돼서 글자가 안 보였다.

  • 접속이 잘 안끊긴다.

    • 크롬 리모트 데스크탑은 당시에 조금 사용하다보면 먹통이 돼서 재접속을 반복해야하는 경우가 잦았는데 RDP로 갈아탄 이후엔 그런 이슈가 많이 없어졌다.

요즘은 크롬 리모트 데스크탑 같은 프로그램도 많이 좋아졌다는데 내가 쓸 당시엔 이런 저런 이슈가 있어서 맘에 들지 않았다.

RDP 설정이 꽤 까다롭다고 알려져 있는데, 설정 자체는 쉽다. 그냥 서버(접근하려는 컴퓨터)와 클라이언트(바깥 컴퓨터)가 있고, 서버에서 RDP 포트를 열어주면 열려있는 포트로 클라이언트가 접속하면 된다. 다만, 포트를 연다는 것부터 보안상 문제가 되기 때문에 안전하게 설정하려면 좀 더 신경을 써야 한다.

RDP 설정하는 법은 구글링하면 되고, 안전하게 설정하는 법은 맨 밑에 링크로 적어놨다. (VPN도 사용하는 게 좋다.)

참고로 윈도우 10 Pro에서만 된다. 아닌 경우에는 우회가 필요한데 꽤 까다롭다.

WoL (Wake-on-LAN)

이게 사실 제일 신기했다. 컴퓨터(메인보드)가 WoL 이란 것을 지원하면 BIOS에서 켤 수 있는 기능이다. 이걸 켜면 컴퓨터가 꺼져 있더라도 약간의 전원을 파워로부터 받아서 신호를 받을 수 있는 상태가 된다. 특별하게 약속된 형태의 패킷(매직 패킷)을 원격으로 모바일 앱 등을 이용해 대상 컴퓨터로 보내면 컴퓨터의 랜카드가 작동해 패킷을 읽고 컴퓨터를 부팅해주는 서비스이다. 짧게 말해서, 원격으로 컴퓨터를 켤 수 있다는 거다.

아무리 컴퓨터 전기세가 그렇게 많이 안나간다지만 랩탑도 아니고 데스크탑 PC를 항상 켜둘 순 없지 않은가...? (그래픽카드도 달려있는 데스크탑 PC는 켜두면 은근히 팬 소음이 있고 방이 뜨끈해진다.)

조건과 설정이 꽤 복잡하고, 잘 되는지 안되는지 컴퓨터를 끄고 테스트 해봐야 해서 귀찮았던 기억이 난다.

아무튼 설정 방법을 대략 요약을 하자면:

  • 컴퓨터 BIOS에서 매직 패킷을 받을 수 있도록 WoL 기능을 활성화하고

  • 컴퓨터에서 WoL이 정상적으로 작동하도록 전원 관련 기본 세팅을 해주고

  • 공유기에서 내 데스크탑 PC로 포트포워딩을 해서 내 컴퓨터를 외부에서 찾을 수 있도록 하고

  • 대부분 가정에서는 유동 IP를 사용할테니 IP를 고정하도록(IP가 새로 부여될 때마다 DNS 데이터베이스를 자동으로 갱신) 공유기에서 DDNS를 설정하고

  • 스마트폰에 WoL 앱을 깔아서 호스트를 등록해 컴퓨터를 원격으로 켤 수 있게 설정하면 된다.

이렇게 쓰고 나니 매우 복잡한데...? (어떻게 한거지) 그런데 막상 한 번 설정하면 그 뒤로는 건드릴 필요가 없어서 편하다.

이렇게 켜는 방법 말고 스마트 플러그라고 IoT 플러그를 구매해서 원격으로 켜는 방법도 있는데 비용이 니까 이 방법을 이용했다.

공유기와 케이블로 연결해야하므로 유선 랜으로만 가능하다.

WoL을 설정했다면 컴퓨터가 시간이 지나도 잠자기 모드에 들어가지 않도록 바꿔야 한다. 잠자기 들어가버리면 WoL로는 어쩔 수가 없다... 집에 가서 마우스 만져야된다. 🥲

WoL 심화 - 포트 바꾸기

포트를 바꾸고 wail2ban 스크립트 적용까지 하는 것이 좋다. 포트 변경만으로는 공격을 완전히 막을 수 없으므로 파워쉘 스크립트를 적용한다.

요약하면 다음과 같다.

  1. 윈도우 레지스트리 편집기로 RDP 포트를 변경하고 재부팅 (1000 이상의 포트 추천)

  2. 방화벽에서 해당 포트 열어두기

  3. Remote Desktop 서비스 재시작 또는 윈도우 재시작

  4. 공유기에서 포트포워딩 설정 (내부, 외부 포트 둘 다 바꾼 포트로 변경)

  5. wail2ban 적용하기

wail2ban GitHub을 들어가보니 이제 read-only가 되어서 다른 방법 찾아보는 게 좋을 것 같다.

More on the matter

RDP

    • 가끔씩, 인터넷이 끊길 때인지 모르겠지만 특정 프로그램 (카카오톡, 유튜브 등)을 실행 중인 상태에서 화면이 멈추는 이슈가 있었는데 이걸 보고 레지스트리 수정을 거쳤더니 그 이후로 고쳐졌다.

    • 여러 가지 안드로이드 원격 앱을 소개한다. 여기서 Jump Desktop이 언급되는데, 유료이긴 하지만 RDP 클라이언트로 꽤 괜찮다. 요즘은 내가 잘 안쓴다.

RDP 심화

    • 이거 설정해줘야 좋다. 비밀번호 brute-force attack를 차단해준다. 실제로 IP 접근 로그를 보니 다양한 IP 접근 시도가 있어서 놀라웠다.

    • 보안이 매우 중요한데 포트를 바꾸는 건 기본이지 않을까 싶다. 무차별로 RDP 기본 포트로 접근하는 시도를 방지하기 위해 포트를 바꿔주자.

WoL

    • WoL 설정 상세가 다 나와있으며, ipTIME 설정하는 법도 나와있다. 앱 설정 법도 있어서 매우 유용.

    • WoL 바이오스 설정부터 윈도우 설정, ipTIME 공유기 설정, 앱 설정까지 포함.

    • 되는 예시. 핵심 설정 위주로 잘 포스팅되어있다.

    • MSI 메인보드에서 WoL을 설정하는 방법이 적혀있다.

그러나 학생이었던 나는 학교에서 꽤 많은 시간을 보내야 했고, 급할 때 자료가 필요하거나 과제를 학교에서 하는 경우도 많았기 때문에 노트북을 들고 다니곤 했다. 요즘은 M1 맥북이 나와서 해당 사항이 아니지만, 당시에 랩탑은 툭하면 버벅거리고, 조금만 쓰면 배터리도 녹아 내렸으며, 제대로 뭔갈 해보려고 하면 소음도 심했다. 학교 공학관에 6층 PC실이라고 컴퓨터가 잔뜩 모여 있는 곳이 있긴 하지만 우리 집 컴퓨터 쓰듯이 쓰기엔 다소 불편했다. 그래서 를 만들어서 들고 다녔던 기억이 난다. (추억이 새록새록...)

Remote Desktop by Microsoft

는 마이크로소프트에서 개발한 프로토콜로, 다른 컴퓨터에서 그래픽 유저 인터페이스를 접근하도록 해주는 프로토콜이다.

wail2ban GitHub -

wail2ban 쉬운 설치 가이드 -

,

Ubuntu 라이브 USB
원격 데스크톱 프로토콜, RDP
glasnt/wail2ban
RDP(원격데스크탑) 무차별 대입공격 관련 보안스크립트 적용 가이드
Stack Exchange - Remote Desktop intermittently freezing
Clien - 안드로이드에서 원격 어플 고군 분투기
Clien - 원격데스크톱(RDP)에 대한 무차별 패스워드 대입 공격 차단
Tistory - 즐겨패기 - 원격데스크톱(RDP) 포트 변경하기
Dsuny - 원격 데스크톱 포트(3389) 변경하기 !!
Naver Blog - 스마일♧뉴스 - 원격부팅 Wake On Lan (WOL) 설정 방법
Tistory - NEORAY - Wake On Lan(WOL) : 원격으로 컴퓨터 켜기 설정 및 사용
Tistory - 서울에서 온 남자, 뉴욕에서 온 여자 - 나의 WOL(Wake On Lan : 웨이크 온 랜) 성공기
Tistory - yourjune Blog - MSI 메인보드에서 WOL(Wake On Lan) 설정하는 방법
https://www.howtogeek.com/70374/how-to-geek-explains-what-is-wake-on-lan-and-how-do-i-enable-it/