Hyunseok
현재 사이트는 2024년 11월 이후로 업데이트 되지 않습니다. 새 글은 블로그로 확인해주세요. 블로그로 이동
프로그래밍/개인홈페이지 미니 서버를 만들어보자 - RHEL9에서 Wireguard 설치
2023. 1. 10. 10:00

현재 사이트는 2024년 11월 이후로 업데이트 되지 않습니다. 새 글은 블로그로 확인해주세요. 블로그로 이동

네트워크맵에서 보았듯, vpn을 중간에 심었다

 

vpn도 여러 가지가 있는데 그중에 가장 널리 알려진 게 openvpn 아닐까

 

하지만.. 요즘 핫하기도 하고 속도도 2배 빠르다고 홍보하는 wireguard를 쓰지 않을 수가 없다..

 

설치해 보자 

 

처음에는 wg-easy.. 를 이용해서 설치하려 했는데 

 

남자가 가오가 있지 상남자식 설치 간다! 하고 하나하나 떼와서 설치를 시작했다..

 

여하튼..

 

레드햇은 친절하게도 Wireguard를 설치하는 도큐멘테이션을 만들어놓았다 

 

근데.. 중간중간에 함정이 있으니.. 정리를 해서 올려보려 한다 

 

Wireguard 설치 

# 혹시모르니 epel-relase설치
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

# wireguard 본체 설치
dnf install wireguard

# wireguard-tools 설치
dnf install wireguard-tools

 

본격적으로 세팅에 들어가기 앞서, 숙지해야 할 것이 몇 가지 있다

wireguard는 ssh만큼 쉽게 쓰자!라는 취지에서 만들어졌다

wireguard는 통신프로토콜로 udp를 사용한다

wireguard는 서버 <> 클라이언트 간에 통신 인증을 ssh와 같이 키파일로 통신한다

 

1. 설치 후 wireguard의 위치

/etc/wireguard

 

2. 우리가 쓸 vpn 서버의 인터페이스

wg0

 

키 작성 및 권한설정 

wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key

 

키 쌍 조회

# private 키 값
cat /etc/wireguard/$HOSTNAME.private.key
> 생성된 키값이 나타난다

# public 키 값
cat /etc/wireguard/$HOSTNAME.public.key
> 생성된 키값이 나타난다

어디다가 

private = 생성된 키 값

이런 식으로 적어두자

 

인터페이스 세팅을 위한 wg0생성 및 세팅

cd /etc/wireguard
ls
> wg0.conf가 없다면
> vi wg0.conf


#wg0.conf
[Interface]
Address = x.0.0.0/24
ListenPort = 51820
PrivateKey = privatekey값
MTU = 1420
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

일단 wg0.conf가 있는지 없는지부터 확인하고.. 

없으면 vi나 touch로 새로 만들어 파일로 들어가자

 

들어가서 인터페이스 설정을 해준다

Adress = 내부망에서 쓸 아이피주소다 cidr기준으로 적어주자

cidr 계산이 귀찮다면 아래의 사이트를 이용하자

https://www.ipaddressguide.com/cidr

 

Free IP address tools for IPv4 and IPv6 | IPAddressGuide

Free IP address tools for ping, traceroute, reverse DNS lookup, CIDR conversion, Netmask conversion, decimal conversion and IP lookup for IPv4 and IPv6

www.ipaddressguide.com

 

ListenPort = wireguard에서 쓸 포트다 바꿔줘도 좋고 기본포트인 51820도 괜찮다

PrivateKey = 아까 만든  private키값을 넣어주자

MTU = mtu값이다 (보통 스택오버플로우를 보니 1500을 많이 쓰는데 얘네는 권장으로 1420을 쓰라 한다)

PostUp/Down = 시작 시/종료 시 넣어줄 옵션이다 

보통 rhel계열은 방화벽 설정을 firewall을 쓰긴 하는데

여전히 본체는 리눅스라서 iptables도 쓸 수 있다 

 여하튼 적어둔 명령어들은.. 나도 자세하게는 모르지만

오가는 패킷들을 싸악 wg0에 갈 수 있도록 묶어주는 역할을 한다

 

끌 때는 또 없애준다

 

설정이 잘되었다면 이제 :wq로 저장해서 닫아주자

 

서버로 가는 ip4 포워딩 추가

# 적고 :wq로 저장해서 나와준다
vi /etc/sysctl.conf
> net.ipv4.ip_forward = 1 

# sysctl 리로드
sysctl -p

이게.. 아마 필요할 것이다 아까 iptables랑 무슨 차이지 하는 생각이 들긴 하는데..

거의 모든 튜토리얼에서 넣으라 한다 잔말 말고 넣어주자

 

방화벽 설정

firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --zone=public --permanent --add-port=51820/udp
firewall-cmd --reload

https://en.wikipedia.org/wiki/Network_address_translation

 

Network address translation - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Protocol facilitating connection of one IP address space to another Network address translation between a private network and the Internet Network address translation (NAT) is a method

en.wikipedia.org

공인아이피를 돌려쓰기 위한,

그리고 그 아래에서 단어 뜻 그대로 자신을 숨길 수 있는 기법중하나인 masquerade적용과..

내부통신에서 쓸 51820을 열어주고 방화벽을 reload 해주자

 

이제 거의 다 온듯하다

 

tools를 이용해 보자

 

wg-quick과 wg, 거의 이 두 개만 쓸 것이다

 

일단 만든 인터페이스를 올려보자

#wg0 인터페이스 올리기 (서버실행)
wg-quick up wg0

#wg0 인터페이스 내리기 (서버종료)
wg-quick down wg0

up으로 올려주고 wg를 쳐서 잘 나오는지 확인하자 잘 나오면 이런 식으로 나올 것이다

이제 코어는 잘 올라갔다 

 

근데 현대인이라면 도구를 써야 하지 않겠는가! 

바로 gui툴을 깔아보자

https://github.com/ngoduykhanh/wireguard-ui

 

GitHub - ngoduykhanh/wireguard-ui: Wireguard web interface

Wireguard web interface. Contribute to ngoduykhanh/wireguard-ui development by creating an account on GitHub.

github.com

docker로 하는 방법도 있는데.. 어차피 키생성할 때 빼고는 닫아둘 거라서 그냥 파일째로 뜯어오자 

 

지금 쓰는 서버가 x86서버일 테니 i386파일을 끌고 오자

wireguard-ui 설치

# tar혹은 wget이 없다면 설치
yum install wget
yum install tar

# wget으로 최-신 wireguard-ui 다운로드 링크로 받아주기
wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.4.0/wireguard-ui-v0.4.0-linux-386.tar.gz

# 압축풀어주고
tar -zxvf wireguard-ui-v0.4.0-linux-386.tar.gz

#wireguard-ui의 포트도 열어주고
firewall-cmd --permanent --zone=public --add-port=5000/tcp

#실행해주자
./wireguard-ui

 

wireguad-ui가 실행되면 이제 서버:5000으로 띄워보자 아래와 같은 화면이 뜬다

아이디/비밀번호는  admin/admin이다 들어가 보자 

 

로그인하면 이런 화면이 뜰 것이다

 

이거 깔고나서부터는 사실 직접 wg0.conf파일 건드릴 필요 없이 

wireguard Server에서 건드려주면 된다 (매우 편하다)

 

그리고.. 한 가지.. 이거 지워도 괜찮은지 모르겠지만

global settings에서 forward mark를 지워주자

헤더에 마크값을 보내는 기능인듯한데.. 키를 쓰는 마당에 굳이 필요한가 싶다

(안 지워도 괜찮나..? 하지만 나는 이거 지우고 제대로 돌아갔다)

 

클라이언트 설정하기 전에 우측 상단에 edit을 눌러 클라이언트를 위한 파일을 conf파일을 만들어보자

wireguard-ui 설정

edit을 누르면 이런 식으로 뜬다

네임은 대충 적고

email은 패스해도 괜찮다

 

 IP Allocation은 vpn접속했을 때 할당받을 나의 IP이다

서버에서 adress를 50.0.0.0/24로 설정했다면 wireguard는 서버를

50.0.0.0/32 (50.0.0.0)로 서버값을 줬을 것이고 

그럼 그다음 번호부터 /24 값 범위 안에서 아무 값이나 주면 된다

참고로 /32는 딱 그 번호만 가리킨다 (50.0.0.1/32 > 50.0.0.1)

 

그리고 Allowed IPs

아마 0.0.0.0/0으로 되어있을 텐데

그러면 클라이언트끼리 서로 통신도 안되고 뭔가 이상하다

내가 받을 수 있는 IP라고 생각하고 그냥 내부망에서는 다들 자유롭게 이동할 수 있게끔 

위의 값을 활용하자 하면 50.0.0.0/24를 넣어줘서

50.0.0.0 ~ 50.0.0.255가 자신에게 접근 가능하게끔 만들어주자

 

나머지는 안 채워도 괜찮고 그냥 확인을 누르고 만들어진 파일을 다운로드해서

다운로드한 파일 안에 값을 복사해 주자

 

그리고 설정이 끝났다면 무조건..

우측상단에 있는 컨픽적용을 꼭 눌러주자..

 

 

클라이언트 설정

 

이제 서버를 세팅했으니 클라이언트를 설정해 주자

 

공통적으로 해야 할 것은 wireguard설치, wireguard-tools설치까지 해주자

 

그리고.. 아마도 이거 꺼져있을텐데 요것도 켜주자

추가 서비스 실행, 클라이언트 적용

systemctl start resolvconf.service
systemctl enable resolvconf.service

 

 

그리고 /etc/wireguard로 가서 wg0.conf파일을 열어주고

 

아까 다운로드한 파일의 내용을 그대로 붙여 넣기하고 :wq 한 뒤에

 

밖에 나와서 냅다 wg-quick up wg0.conf를 하면 서버로 접속이 된다

 

서버가 힘들지 클라이언트는 파일만 있다면 날먹수준으로 바로 가능하다..

 

이렇게 wireguard의 세팅이 끝났다 

 

아마 중간에 분명 누군가는 오류가 뜰 것이고 

 

여기까지 왔는데 누군가는 클라이언트끼리 핑이 안 갈수도 있고..

 

누군가는 서버랑도 핑이 안돌수도 있고..

 

누군 connect는 됐는데 인터넷이 안될 수도 있고.. 여러 가지다 

 

삽질.. 화이팅이다 하다 보면 하나하나 해결되는 재미를 느낄 수 있을 것이다

 

다음 편은 세팅한 wireguard 서버 <> nginx로  wireguard에 접속한 클라이언트의 웹페이지를 불러와보자

 


프로그래밍/개인홈페이지의 다른 글