ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [라즈베리파이5] 홈서버 구축하기 5 - 보안 세팅 3단계 WireGuard 구축하기
    📗공부기록/CS 2026. 2. 2. 02:58

    이제 정말 WireGuard를 이용해 VPN을 구축해보자.

    아래 명령어를 입력해서 install 해준다.

    sudo apt update
    sudo apt install wireguard -y
    
    wg --version # 설치 확인

     

     

    그리고 서버가 가지고 있을 개인키와 공개키를 생성한다.

    sudo -i
    cd /etc/wireguard
    
    umask 077 # 다음 파일 나만 읽을 수 있도록 권한 설정 
    wg genkey | sudo tee server_private.key | sudo wg pubkey | sudo tee server_public.key
    
    umask 022 # 파일 권한 원상복구
    
    cat server_private.key # 생성된 키 확인 명령어
    cat server_public.key
    
    exit # 아래 conf 파일 편집까지 마치고 진행 권장
    
    
    # 이 명령어는 클라이언트 키 생성 명령어인데, 클라이언트에서 직접 만드는 걸 권장함
    # wg genkey | tee 클라이언트_private.key | wg pubkey | tee 클라이언트_public.key
    
    # 생성한 키 삭제 명령어
    # sudo shred -u /etc/wireguard/server_private.key

     

    여기서 일반 계정으로는 /etc에 접근할 수 없기 때문에 sudo -i 명령어를 사용해서 접근 및 작업을 하면 된다. exit 명령어는 root권한 접속을 나오는 명령어이다.

     

    이제 설정파일을 생성하고

    nano /etc/wireguard/wg0.conf

     

     아래 내용을 추가한다. vpn을 통해서 모든 인터넷 접속을 내 서버를 거쳐서 나가게 만들 거라면 아래 주석 부분이 필요하지만, 나는 ssh 접속을 안전하게 하기 위해 vpn을 설정한 거기 때문에(서버가 종착지이기 때문에) 해당 내용이 불필요해 주석처리했다.

    [Interface]
    Address = 10.0.0.1/24 # VPN 내부 네트워크
    ListenPort = 51820 # WireGuard 기본 포트
    PrivateKey = 서버_PRIVATE_KEY_여기에
    
    
    # 와이어가드를 게이트웨이로 만들어주는 설정. 각각 서버가 켜질 때, 꺼질 때 실행 된다. 서버로만 쓸거면 필요 없음
    # PostUp   = ufw route allow in on wg0 out on eth0
    # PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    # PostDown = ufw route delete allow in on wg0 out on eth0
    # PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

     

    그리고 아래 IP 포워딩 활성화도 마찬가지로 서버가 종착지일 경우 해줄 필요 없다. IP 포워딩은 서버를 통해 다른 곳으로 가는 패킷을 허용한다는 의미이다. 이것도 필요 없으니 적어만 놓고 넘어가겠다.

    sudo nano /etc/sysctl.conf # 해당 파일을 편집하여
    
    net.ipv4.ip_forward=1 # 이 줄을 찾아 주석 해제한 뒤
    
    sudo sysctl -p # 적용 시킨다.

     

     

    그리고 이제는 외부에서 22번 포트가 아니라 와이어가드 포트 51820을 통해 ssh에 접근을 해야 하니 해당 포트의 ufw 방화벽을 해제한다. WireGuard는 udp 프로토콜을 사용하기 때문에 udp만 열어둔다.

    sudo ufw allow 51820/udp

     

    udp가 tcp보다 단순하지만 빠르기 때문에 vpn은 udp를 많이 사용한다고 한다. 또한 tcp 포트는 통신 시 데이터를 주고 받기 전 서로 신호를 주고 받는 일이 일어나는데, 이런 특징 때문에 누군가 찔러봤을 때 내 포트가 응답을 하게 되어 해커의 포트 스캔에 적발되는 것이다. 반면 udp 같은 경우에는 인증이 되지 않은 패킷이 들어오면 아예 응답을 하지 않기 때문에 해커는 포트가 열려 있는 지 닫혀 있는지 알 수 없어 vpn에 매우 적합하다고 할 수 있다.

     

    그리고 WireGuard 서버를 실행한다

    sudo systemctl enable wg-quick@wg0
    sudo systemctl start wg-quick@wg0
    
    # 아래는 확인 명령어
    sudo wg
    ip a show wg0

     

    이제 내 집 말고 카페나 사무실 등 다른 네트워크에서도 접속하려면 공유기 포트포워딩을 해줘야 한다. 

    공유기 설정 페이지로 이동해서 고급설정 > NAT/Router > 포트포워드

    프로토콜 udp, 외부포트, 내부포트에 51820을 적어주고, 내부포트 IP 주소를 서버(우분투) IP로 설정한다.

    서버 IP는 아래 명령어로 확인할 수도 있고,  내 서버의 IP를 이미 고정해두었다면 공유기 설정 페이지에서도 확인할 수 있다. 

    hostname -I

     

     

    이제 클라이언트에도 WireGuard를 세팅하고 접속 테스트를 해보자.

     

    나는 맥북을 이용해서 서버에 접속하기 때문에 AppStore에서 내 맥북에 해당 앱을 깔았다.

     

    그리고 앱을 실행해 add empty tunnel을 클릭한다. 그럼 자동으로 클라이언트의 개인키와 공개키가 생성된다. 여기서의 공개키는 잘 복사해둔다. Peer의 PublicKey는 아까 서버에서 만든 키를 붙여 넣으면 된다. 까먹었으면 위에 적어둔 cat 명령어를 이용해서 다시 확인한다.

    [Interface]
    PrivateKey = CLIENT_PRIVATE_KEY
    Address = 10.0.0.2/24
    DNS = 1.1.1.1
    
    [Peer]
    PublicKey = SERVER_PUBLIC_KEY # 서버에서 만든 공개키
    Endpoint = 211.201.xxx.xxx:51820
    AllowedIPs = 10.0.0.1/32 # 이 주소(서버)만 vpn을 통하도록 설정
    PersistentKeepalive = 25

     

    공개키가 생겼으니 서버의 wg0.conf에도 클라이언트 정보를 추가해야 한다. wg0.conf를 열어서 [Peer] 부분을 추가하고 재실행한다.

    sudo -i
    nano /etc/wireguard/wg0.conf
    
    [Peer]
    PublicKey = CLIENT_PUBLIC_KEY # 클라이언트 공개키
    AllowedIPs = 10.0.0.2/32
    
    # 파일을 편집한 경우 재실행 명령어
    sudo wg-quick down wg0
    sudo wg-quick up wg0

     

    클라이언트에서 세팅을 끝마친 뒤 Activate 버튼을 눌러 활성화 시킨 뒤, 터미널에서 sudo wg 명령어를 입력했을 때 latest handshake 등 제대로 된 응답이 오면 성공한거다. 더 정확하게 확인해보고 싶다면 맥북에 스마트폰 핫스팟을 연결해서 다른 네트워크에서 직접 접근해보면 완전하게 확인이 가능하다. 잘 접속된다면 이제 우리는 22번 포트로 바로 들어갈 일이 없기 때문에 제한 없이 열려있던  ufw도 wg0을 통해 들어오는 경우만 허용하도록 변경해주면 끝이다! 

     

    sudo ufw delete allow 22
    sudo ufw allow in on wg0 to any port 22 proto tcp # 오직 wg0(VPN 인터페이스)를 통해서 들어오는 SSH만 허용

     

     


     

    번외

    [conf 파일에 적힌 10.0.0.~ IP의 의미는 무엇일까?]

    10.0.0.1? 10.0.0.2? 무슨 의미일까?

     

    우선 10~로 시작하는건 그냥 와이어가드의 기본 사설 IP일 뿐이다. 다른거로 변경해도 서로 값만 일치하면 상관이 없다고 한다.

    10.0.0.1번 : 서버

    10.0.0.2번 : 맥북

    10.0.0.3번 : 데스크탑 PC ... 이런 형태로 각 기기별로 ip를 지정해준 것 뿐이다. 1부터 254번 까지 지정해줄 수있다. (0번과 255번은 각각 역할이 있어 할당해줄 수 없다.)

     

    뒤에 붙는 /24나 /32 같은 숫자는 무엇일까?

     

    왼쪽부터 몇 번째 숫자까지 고정할 것인지를 의미한다. IPv4는 8비트씩 4묶음 총 32비트의 숫자로 이루어져 있다. 24는 세 자리만 일치하면 통과기 때문에 10.0.0까지 일치하면 그 뒤 1 부터 254까지 모든 숫자를 포함한다. 32는 4자리가 모두 일치해야 되기 때문에 하나의 기기, 하나의 IP만을 의미한다.

     

    서버에 있는 conf 파일의 interface > address는 10.0.0.1/24이고 peer > allowedIPs는 10.0.0.2/32
    클라이언트에 있는 conf 파일의 interface > address는 10.0.0.2/24이고 peer > allowedIPs는 10.0.0.1/32이다.
    그럼 전체적으로 어떤 의미인지 해석해보자.

     

    서버 : 나는 10.0.0.1번이고, 목적지가 10.0.0.x번인 데이터는 VPN을 이용해 보낼거야!(통로 생성) 그리고 인증된 IP는 지금 10.0.0.2 하나구나! 여기서 보낸거 외에는 아예 받지도 말아야지.(통로 입장권)

     

    클라이언트 : 나는 10.0.0.2번이고, 목적지가 10.0.0.x번인 데이터는 VPN을 이용해 보낼거야!(통로 생성) 그리고 인증된 IP는 지금 10.0.0.1 하나구나! 여기서 보낸거 외에는 아예 받지도 말아야지.(통로 입장권)

     

    그리고 AllowedIPs는 인증된 IP가 아니면 아예 요청을 받지도 않는다. IP와 암호화 키를 1:1로 묶어서 강력한 보안을 지키는데, 이를 크립토키 라우팅이라고 한다.

    댓글

Designed by Tistory.