Computing

[jhVM][2] CentOS 7 user 추가(sudo 권한 부여), 가상머신 네트워크 설정 및 virbr0(static internal IP 부여) 본문

Cloud/jhVM

[jhVM][2] CentOS 7 user 추가(sudo 권한 부여), 가상머신 네트워크 설정 및 virbr0(static internal IP 부여)

jhson989 2022. 11. 14. 22:55

이전글

- [jhVM][1] virt-manager, CentOS 7 qcow2 image (root password, 용량 설정 등)

 

이전 글에 이어 CentOS 7 가상머신들을 이용한 쿠버네티스 환경 구축 과정에서 배운 내용을 정리하고자고 한다. 공부 중인 단계에서 정리하는 글이기에 부족하거나 정확하지 않은 내용도 있을 수도 있다. 자세한 내용은 추후 다시 한번 정리해볼 예정이다.

 

 

 

User 추가 및 sudo 권한 부여

개발 과정에서 root 계정을 계속 사용할 수 없기에 가상머신에 user를 추가하고자 한다. User 추가는 [useradd]와 [adduser] 명령어 2개가 있다. CentOS에서는 [useradd]와 [adduser], 2개의 명령어가 같은 것([adduser] bin 파일이 [useradd] bin 파일의 심볼릭 링크)이기에 차이점이 없으나, Ubuntu에서는 adduser가 useradd에 비해 더 많은 것을 해주기에 [adduser] 명령어를 사용하면 좀 더 편리하다.

 

## root 계정 로그인 후 진행
# User 추가 (vm user 추가)
adduser vm

# vm 패스워드 설정
passwd vm

# user에 sudo 권한 부여 (vm user를 wheel group에 추가)
usermod -aG wheel vm

 

위 코드는 "vm"이라는 유저를 생성하고, 그 유저에 sudo 권한을 부여한 코드이다. CentOS에서는 wheel group에 속한 user는 sudo 권한을 얻기에, "vm" 유저에 sudo 권한을 부여하기 위해서는 wheel group에 포함시키면 된다. (기본적으로 따로 설정을 안해주면 "vm" 유저의 경우 "vm" 그룹에 속해 있다. 이때 유저는 여러 그룹에 포함될 수 있다.)

 

추가적으로 "vm" 유저의 gid(group id), uid(user id)를 변경하고자 한다. 유저 정보는 OS상에서 gid, uid로 관리된다. 여러 사용자간 파일을 공유하는 NFS 등의 분산파일시스템 사용시 권한 문제가 발생할 수 있다. 이를 해결하기 위해 앞으로 모든 VM에서 "vm" 유저가 속한 "vm" 그룹 gid와 "vm" 유저 uid를 통일해두고자 한다. (사실 group으로 관리하면 될 것 같은데, 이 분야에서는 초보기에 일단 gid, uid 모두 통일해두고자 한다.)

 

# gid 확인 : /etc/group에 group 정보가 저장된다.
$ cat /etc/group | grep "vm"

# uid 확인 : /etc/passwd에 유저 정보가 저장된다.
$ cat /etc/passwd | grep "vm"

# group "vm" gid 변경
$ groupmod -g 1002 vm

# user "vm" uid 변경
$ usermod -u 1002 vm

 

앞으로 프로그램 개발은 안전하게 "vm" 계정(1002:1002)에서 진행될 것이다.

 

 

 

네트워크 설정과 virbr0

컴퓨터가 인터넷에 접속하기 위해서는 일반적으로 외부 IP(external IP)가 필요하다. 하지만 개별 가상머신은 외부 IP 없이도 인터넷에 접속할 수 있다. 바로 NAT(network address translation) 기술을 통해서 Host 컴퓨터의 외부 IP를 사용하여 통신할 수 있기 때문이다. 아래 그림은 가상머신이 어떻게 Host 컴퓨터를 통해 인터넷에 접속하는 지를 보여주는 그림이다. 11.22.33.44는 Host 컴퓨터의 공인(외부) IP, 192.168.122.*(1,100,101,102)는 각 컴퓨터(or 가상머신)들의 내부망에서의 IP이다.

 

Fig 1. NAT 기술을 이용한 가상머신의 외부 인터넷 접속

 

NAT 기술은 내부망의 컴퓨터가 외부망과 통신할 수 있도록 하는 기술로, 내부망의 컴퓨터 IP를 공인 IP로 변환(translation)하는 기술이다. 이때 Host 컴퓨터가 router의 역할을 수행한다고 생각하면 좋을 것 같다. 예를 들어 VM1(192.168.122.100)이 [google.com]에 접근하려고 한다고 하자. 그러면 VM1이 보낸 패킷은 Host 컴퓨터의 NAT에 의해 IP주소 [192.168.122.100]가 [11.22.33.44]로 전환되어 google.com에 전송된다. google.com은 response 패킷을 다시 Host 컴퓨터 [11.22.33.44]로 전송하고, Host 컴퓨터는 들어온 패킷을 다시 NAT을 통해 VM1으로 전달한다.

 

VM1이 보낸 패킷: [192.168.122.100] -> [11.22.33.44]로 변환 -> google.com에 전달

google.com이 보낸 패킷 :  [11.22.33.44] ->  [192.168.122.100]로 변환 -> VM1에 전달

 

이러한 NAT은 PAT(Port Address Translation)를 통해 여러 개의 VM들이 하나의 공인 IP를 이용할 수 있도록 지원한다. 위의 예와 마찬가지로 VM1, VM2가 동시에 [google.com]에 접근한다고 하자. VM1, VM2가 보낸 패킷들은 모두 NAT에 의해 IP [11.22.33.44]로 변경되어 접속될 것이다. VM1, VM2 구분을 위해 사용되는 것이 PAT로 두 가상머신 구분을 위해 IP 뿐만 아니라 Port 번호까지 사용한다. 

 

VM1이 보낸 패킷: [192.168.122.100:40044] -> [11.22.33.44:23343]로 변환 -> google.com에 전달

VM2이 보낸 패킷: [192.168.122.101:50540] -> [11.22.33.44:43388]로 변환 -> google.com에 전달

google.com이 보낸 패킷 :  [11.22.33.44:43388] ->  [192.168.122.101:50540]로 변환 -> VM2에 전달

google.com이 보낸 패킷 :  [11.22.33.44:23343] ->  [192.168.122.100:40044]로 변환 -> VM1에 전달

 

libvirt는 NAT/PAT 지원을 위해 virbr0을 자동으로 생성하고, 이 virbr0 interface가 NAT 역할을 수행한다. 

 

 

 

VM에 Static Internal IP 부여

각 VM은 DHCP를 통해 자동으로 네트워크 구성(내부망 IP, 게이트웨이, 서브넷마스크, DNS 서버)이 부여된다. 따라서 VM의 internal IP 또한 자동으로 부여되기에 DHCP range안에서 랜덤하게 부여된다. Static하게 직접 internal IP를 부여할 수도 있는데 그 방법은 다음과 같다.

 

(시작하기 앞서 안전을 위해 VM은 shutdown하자. 모든 코드는 Host 코드에서 실행된다.)

 

1. virbr0의 네트워크 이름 알아내기

$ virsh net-list 

결과 : default

 

2. VM의 mac address 알아내기

$ virsh dumpxml [vm name] | grep "mac"  // ex) virsh dumpxml vm | grep "mac" 

결과 : <mac address='45.22.42.11.55.33' />

 

3. default network 수정하기

$ virsh net-edit default

Fig 2.와 같이 <dhcp> tag에 <host> 추가하기 

 

Fig 2. net-edit 수정

 

4. DHCP service 재실행하기

$ virsh net-destroy default

$ virsh net-start default

 

위 4단계를 거치면 최종적으로 VM의 internal IP는 192.168.122.10로 수정된다.