카테고리 보관물: 서버 설정

LetsEncrypt certbot으로 생성한 인증서 삭제하는 방법

인증서를 발행했는데 쓸 필요가 없어진 인증서를 삭제하고 싶을 때 아래의 명령어를 사용하면 됩니다.
대다수는 그냥 내비두겠지만, 나중에 혼란이 생길 수 있으므로 저는 삭제하기로 했습니다.

certbot delete --cert-name 도메인주소

delete –cert-name을 함께 적어주어야 합니다.

The following certificate(s) are selected for deletion:

  * test.osg.kr

Are you sure you want to delete the above certificate(s)?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Deleted all files relating to certificate test.osg.kr.

명령을 내리면 삭제할 것인지 물어보고, Y를 눌러서 응답하면 삭제됩니다.

docker 명령어 sudo 없이 사용하기

docker engine을 설치하고 나서, docker 명령을 사용하려면 sudo를 매번 붙여줘야 하는 번거로움이 있다.

현 사용자를 docker 그룹의 사용자로 추가해주면 문제는 해결된다.

sudo gpasswd -a $USER docker

이제 로그아웃 후 다시 로그인하거나, 재부팅 하고 나면 sudo 없이 docker 명령어를 실행할 수 있다.

QEMU/KVM 복붙 Ctrl+C, Ctrl+V 안 될 때

호스트에서 복사하고 싶은 텍스트를 복사해서 게스트로 붙여넣기 하고 싶을 때에는,

https://spice-space.org

여기에 들어가서 필요한 것을 게스트에 설치해 주면 된다.

게스트OS가 윈도우인 경우에는 Windows guest tools – spice-guest-tools

게스트OS가 리눅스인 경우에는 SPICE vdagent – spice-vdagent-0.21.0.tar.bz2

받아서 설치하면 된다.

QEMU/KVM 디스크 크기 늘리기

변경하고자 하는 VM이 작동중이라면 우선 shutdown 한다.

디스크 파일이 있는 경로는 root 외에는 읽을 수조차 없으므로 super user의 권한이 필요하다. 따라서 아래와 같이 입력한다. 명령문의 예시는 디스크 크기를 30G 늘리는 예제이다.

sudo su
cd /var/lib/libvirt/images
qemu-img resize win_works.qcow2 +30G

위와 같이 하면 “Image resized.”라고 뜬다. 그러면 qemu/kvm의 디스크 이미지 크기는 조정된 것이다.

그 다음엔 해당 VM을 켜고 들어가서 변경된 파티션 조정 작업을 해 주면 된다.

Jenkins 외부 접속을 위한 방화벽 설정

Jenkins를 설치한 후 localhost로는 접속이 되는데, 외부에서 접속이 되지 않는 경우가 있는데, 방화벽에서 해당 젠킨스 서비스를 구동하는 포트를 java에 대해 인바운드 접근을 허용해 주어야 외부 머신에서 접속이 가능하다.

QEMU/KVM 호스트OS와 게스트OS 동일 네트워크에 연결하기 – 브릿지 네트워크 설정

호스트 OS는 Ubuntu 22.04, 그리고 Virtual Machine Manager를 이용해서 VM을 구동하였다.

그런데 네트워크 장치가 기본적으로 NAT로 설정되어 있었다.
그러면 호스트 OS에서 VM으로 접근할 수가 없다.
그럴 땐 macvtap을 이용하면 호스트 OS와 게스트 OS를 동일 네트워크로 연결할 수 있다.
하지만 macvtap을 이용하면 게스트 OS에서 호스트 OS에 엑세스 하지 못하는 문제가 생긴다.

결론은 Bridge 설정을 해야 한다.

  1. 브릿지 넷필터 비활성화
  2. 브릿지 추가
  3. QEMU/KVM에서 브릿지 선택

우선 브릿지 넷필터 비활성화가 필요하다. 다른 설정을 아무리 잘해도 이 문제 때문에 계속 네트워크 설정이 안 되는 문제를 겪었다. 모든 트래픽을 브릿지로 보내고 VM으로 보내려면 이 작업을 꼭 해야 한다. 아래의 내용을 /etc/sysctl.d/bridge-filter.conf로 저장한다.

net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0

이제는 /etc/udev/rules.d/99-bridge-fileter.rules 파일에 아래와 같이 적어준다.

ACTION==”add”, SUBSYSTEM==”module”, KERNEL==”br_netfilter”, RUN+=”/sbin/sysctl -p /etc/sysctl.d/bridge-filter.conf”

재부팅 해주면 반영된다.

이제 브릿지를 추가해 줄 차례다. nm-connection-editor를 실행한다. 혹시나 GUI를 이용할 수 없는 경우에는 참고자료를 살펴보길 바란다.

  1. + 버튼을 누른 후 Connection Type을 Virtual의 Bridge로 선택한 후, Create를 눌러서 Bridge Connection을 추가한다.
  2. Connection Name을 bridge0, Interface name을 bridge0로 변경해 준다.(bridge0는 예시로 적은 것이다 희망하는 이름을 적어주면 된다.)
  3. bridged connections의 Add 버튼을 누른다.
  4. Connection Type에 Ethernet을 선택.
  5. Connection name에 eth-bridge0 입력.
  6. Device에서 LAN선이 꼽혀 있는 NIC 선택(예, enp8s0). 그리고 Save 클릭.
  7. IPv4 Settings에서 Method를 Manual로 변경한다.
  8. Addresses에 Add를 누른 후 브릿지의 IPv4를 설정해 준다. DNS Server도 설정해 준다.
  9. Save를 눌러서 저장한다.
  10. Bridge에 bridge0이 추가되었고, Ethernet에 eth-bridge0이 추가 되었다면 성공.
  11. terminal에서 nmcli con up eth-bridge0 해주면, 브릿징 완료.
  12. 세팅이 잘 됐는지 확인하고 싶으면, 첫째 nmcli con show해서 bridge0와 eth-bridge0이 올라가있고 enp8s0이 내려가 있는지 확인하면 된다. 그리고, ip a 해보면 공유기와 연결된 NIC에 master bridge0이 보일 것이며, IP는 bridge0에 잡혀 있을 것이다. 이제 브릿지 사용 준비 완료.

이제 마지막이다. QEMU/KVM에서 NIC 설정에 들어간다.

  1. Network source를 Bridge device로 선택한다.
  2. Device name은 위에서 설정한 브릿지 이름을 적어준다.(위에서는 bridge0)
  3. Device model을 e1000e로 선택한다.
  4. Apply를 눌러서 적용한 후, VM을 실행하면 된다.

끝.

참고자료
https://levelup.gitconnected.com/how-to-setup-bridge-networking-with-kvm-on-ubuntu-20-04-9c560b3e3991

https://wowgold-seller.com/ko/stories/285-how-to-use-bridged-networking-with-libvirt-and-kvm

리눅스 운영체제에서 타임존 설정하기

클라우드 서비스를 이용하게 되면 기본적으로 시간은 UTC +00:00 기준으로 설정된다. 한국시간 기준으로 타임존을 설정하려면 timedatectl 명령어를 사용하면 된다.

우선 timedatectl만 입력하면 상태값들을 확인할 수 있다.

그리고, 아래와 같이 입력하면 Asia/Seoul 기준의 타임존 설정이 끝난다.

sudo timedatectl set-timezone Asia/Seoul

Nginx 로드 밸런싱 – https 서버 여러 대인 경우

처음엔 아래와 같은 방식으로 작성했는데, 이렇게 하는 경우 proxy_pass를 통해 https의 해당 도메인으로 정확히 연결되지 않는 현상을 발견하였다. 현재 사용할 서버는 PHP 아닌데, 왜 PHP가 뜨는 거지? 오잉? 싶었는데, 다른 서비스 용으로 PHP가 돌아가고 있었다. 즉, 엉뚱한 도메인으로 연결되고 응답으로 404 Not Found를 돌려받고 있었다. Oh my gosh! 왜 이런 현상이 생기는 것이지? 이건 분명 도메인으로 넘어가지 않고 IP로 넘어가서 발생한 현상일 듯한데 싶었다. 그렇다면 어떻게 이걸 명확하게 도메인으로 넘겨줄 수 있을지 고민이 되었다.

http {
  ...
  upstream servers {
    server first.myserver.com:443;
    server second.myserver.com:443;
  }

  server {
    listen 443 ssl;
    location / {
      proxy_pass https://servers;
    }
    ...
  }

}

그리고서 구글링을 하다가 힌트(https://stackoverflow.com/questions/29071168/nginx-upstream-with-http-https/65767299)를 발견한 후 아래와 같이 수정하였다.

http {
  ...
  upstream servers {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
  }

  server {
    listen 443 ssl;
    location / {
      proxy_pass http://servers;
    }
    ...
  }

  server {
    listen 8081;
    location / {
      proxy_pass https://first.myserver.com;
    }
  }

  server {
    listen 8082;
    location / {
      proxy_pass https://second.myserver.com;
    }
  }

}

드디어 로드 밸런싱이 원하는대로 작동하기 시작했다.

정리해보면, nginx의 소스코드를 까보지 않아서 왜 이런 현상이 발생하는지는 정확히 모르겠지만, 추론컨대 전자의 경우 domain으로 작성하지만 IP와 포트로만 처리하는 것으로 보인다. 왜냐하면 동일 머신에 필자가 운용중인 다른 서비스로 접근하는 것을 확인했으니 말이다. 후자의 경우는 각각의 proxy 서버가 명확하게 목적지를 가리키고 있으므로 문제가 발생하지 않았던 것으로 보인다.

단일 서비스만 운용하는 경우에는 별 문제가 되지 않을 수 있겠지만, https로 이용하는 서비스가 여러 개 있다면 필자와 같이 문제가 발생할 수 있다.

Jenkins – Publish over SSH 플러그인 키 설정

Publish over SSH는 Jenkins에서 빌드를 마치고, 특정 서버로 배포를 할 때 사용하는 플러그인이다.

SSH 접속을 위해서는 User ID와 비밀번호 또는 개인키/공개키가 필요하다. 우리는 개인키/공개키를 사용할 것이므로 비밀번호는 필요하지 않다.

혹여나 사용하는데 필요한 개인키/공개키 쌍이 준비되어 있지 않다면, 그림 1과 같이 ssh-keygen을 이용해서 키 쌍을 준비해야 한다.

그림 1. ssh-keygen 이용하여 개인키/공개키 쌍 만들기

* Publish over SSH 플러그인을 우선 설치한다.

* Jenkins 관리 > 시스템 설정 > SSH Servers로 이동한다.

* SSH Servers에 항목이 없다면, “추가” 버튼을 클릭한 후, 아래의 내용을 기입한다.

Name에는 식별할 수 있는 이름을 적어준다.
Hostname에 접속할 IP나 도메인을 적어준다.
Username에는 접속할 사용자 이름을 적어준다.
Remote Directory에는 접속하고자 하는 디렉토리를 입력한다.

그림 2. SSH Server 기본 정보 입력 예시

* 우측 하단에 있는 “고급” 버튼을 누르면 고급 항목들이 펼쳐진다.

그림 3. 고급 버튼 위치

* “Use password authentication, or use a different key” 여기에 체크를 해 준 후,
Key에 SSH에 사용할 개인키를 붙여넣어주면 Jenkins 상의 개인키 설정이 끝난다.

그림 4. 개인키 입력 화면

* 배포 대상인 서버로 접속한 후, 그림 5와 같이 사용하려는 공개키를 ssh-rsa부터 끝까지 모두 복사해서 ~/.ssh/authorized_keys 파일에 공개키를 한 줄 추가해 준다. authorized_keys 파일이 없다면 새로 작성하면 된다.

그림 5. 공개키 내용 열람

* Jenkins의 SSH Server 항목 우측 하단에 Test Configuration 버튼을 누른다.

그림 6. Test Configuration 버튼 위치

* 왼쪽에 Success라고 뜨는지 확인했다면 SSH 접속을 위한 개인키/공개키 설정이 끝난다.

그림 6. 성공 메시지

만약 성공하지 못한다면, Success 라는 내용 대신에 오류 메시지로 문제점을 알려줄 것이다. 해당 오류에 대해 구글링 후 문제를 해결하면 된다.