실제 물리 서버를 이용한 OpenStack 구축(15) : 인스턴스 접속

NOHHYEONGJUN·2025년 2월 23일

OpenStack

목록 보기
19/23
post-thumbnail

1. 인스턴스 접속

인스턴스 접속을 위한 구성은 대부분 끝났다.
이미지 추가, 유동 IP 설정을 끝으로 인스턴스에 접속해보겠다.

 

1. Ubuntu 이미지 추가

여러 리눅스 배포판은 클라우드용 이미지를 제공한다.

  • 인스턴스 생성 시, 스크립트 수행으로 자동 설정, 커스터마이징이 가능하다.
    • 일반적으로 cloud-init이라는 SW를 사용한다.
    • 이런 기능을 이용해 각자 운영하는 환경에 맞춰 수정하여 사용한다
      • ex) ssh 포트번호 수정, 보안프로그램 설치 마스터 ssh키 등록 등

ubuntu 22.04 / 24.04 두 버전을 추가하겠다.

  • 또한 SSH Port를 변경하겠다. (원하는 숫자로 수정)

이미지 다운로드 & 포트 수정

# con01

cd /nfs

wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
wget https://cloud-images.ubuntu.com/jammy/current/noble-server-cloudimg-amd64.img

# 22.04 #
# ssh Port 변경
sudo apt install libguestfs-tools -y

sudo virt-customize -a jammy-server-cloudimg-amd64.img --run-command \
  "sed -i 's/^#Port 22/Port <PORT-NUMBER>/' /etc/ssh/sshd_config && systemctl restart ssh"
  
# 변경 확인
sudo guestfish --rw -a jammy-server-cloudimg-amd64.img -i
cat /etc/ssh/sshd_config | grep "^Port"


# 24.04 #
# ssh Port 변경
sudo apt install libguestfs-tools -y

sudo virt-customize -a noble-server-cloudimg-amd64.img --run-command \
  "sed -i 's/^#Port 22/Port <PORT-NUMBER>/' /etc/ssh/sshd_config && systemctl restart ssh"
  
# 변경 확인
sudo guestfish --rw -a noble-server-cloudimg-amd64.img -i
cat /etc/ssh/sshd_config | grep "^Port"

 

OpenStack에 이미지 추가

# con01

. admin-openrc

# 22.04 #
openstack image create "Ubuntu-22.04" \
  --file jammy-server-cloudimg-amd64.img \
  --disk-format qcow2 \
  --progress \
  --public
  
# 24.04 #
openstack image create "Ubuntu-24.04" \
  --file noble-server-cloudimg-amd64.img \
  --disk-format qcow2 \
  --progress \
  --public

 

 

2. 유동 IP 설정

만약 공유기 네트워크에 노드를 연결해 사용중이라면, 공유기로부터 IP를 할당받아 사용 가능하다.
또한, 고정 IP 사용 환경이라면 VM에 바로 고정 IP를 할당해 사용할 수 있다.
그러나 일반적으로 공용 IP는 한정적이므로, 모든 VM에 유동 IP를 할당해 사용은 어렵다.

사용 가능한 유동 IP 범위를 지정해 사용할 수 있도록 한다.

관리네트워크네트워크provider network서브넷 편집

사용 가능한 범위를 지정해준다.

 

프로젝트네트워크Floating IP프로젝트에 IP 할당

연결 또는 인스턴스 설정에서 인스턴스에 유동 IP를 연결해 줄 수 있다.

 

 

3. 포트 포워딩 설정

한정적인 유동 IP를 대신해 포트 포워딩을 사용할 수 있다.
이전에 생성했던 가상 라우터의 NAT 포트포워딩을 설정해 가상 라우터의 외부 인터페이스로 내부 VM으로 접속할 수 있다.

앞서 ssh 포트번호를 33번으로 바꾸었다 가정하고, 가상 라우터의 IP(192.168.1.20)의 33205 포트로 접속 시,
내부 인스턴스 10.0.0.205의 33번 포트로 접속 가능 하도록 설정해 보겠다.

# con01

ip netns

qdhcp-d322dfc4------------------------- (id: 0)
qrouter-b97da050------------------------- (id: 1)

# 게이트웨이 이름 확인
ip netns exec <router id> ifconfig

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

qg----------: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.20  netmask 255.255.255.0  broadcast 192.168.1.255
		------------------------

qr----------: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.0.0.1  netmask 255.255.255.0  broadcast 10.0.0.255
        ------------------------
        
# 포트 포워딩
# 취소 필요시 -A -> -D 로 재명령
sudo ip netns exec <router id> iptables -A PREROUTING -t nat -i <gateway id> -p tcp --dport 33205 -j DNAT --to 10.0.0.205:33

 

 

4. 보안 그룹 수정

default 보안 그룹을 확인하면, 같은 보안 그룹에 속한 인스턴스들끼리만 Ingress를 허용하고 있다.
접속을 위해 192.168.1.0/24 대역을 추가하고, 기본 들어옴 규칙을 삭제하겠다.

기존 default 보안 그룹이다. 들어옴 규칙을 수정해야 한다.

CIDR을 192.168.1.0/24로 입력, 모든 TCP 선택 후 추가한다.

기존 들어옴 규칙은 삭제한다.

 

 

5. ssh 접속 시도

포트 포워딩을 통해 10.0.0.205로 ssh 접속을 시도해보겠다.

ssh -i test.pem ubuntu@192.168.1.20 -p 33205

유동 IP를 할당 후 접속을 시도해보겠다.

# 192.168.1.35 할당

ssh -i test.pem ubuntu@192.168.1.35 -p 33

 

 

6. 포트 포워딩 설정 자동화

아직 생성되지 않은 인스턴스에도 포트 포워딩을 미리 설정해두려고 한다.
8080, 3000, 443, 80, 33(ssh)에 대해 진행하겠다.

 

표와 같이, 사용하기 편하도록 포워딩 규칙을 정하고 진행하면 된다.

🚨 3000, 33이 모두 33xxx로 매핑되어 있다. 주의해서 수정해 사용한다.🚨

 

# con01

vi /nfs/create_port_forward.sh

#!/bin/bash

# 라우터 ID와 인터페이스 설정
ROUTER_ID="qrouter--------------------------"
INTERFACE="qg-----------"

# 포트 매핑 함수
create_port_forward() {
    local ip=$1
    local last_octet=${ip##*.}  # IP의 마지막 옥텟 추출
    
    # 마지막 옥텟을 3자리로 패딩 (예: 1 -> 001, 20 -> 020)
    local padded_octet=$(printf "%03d" $last_octet)

    # 8080 -> 88xxx
    sudo ip netns exec $ROUTER_ID iptables -A PREROUTING -t nat -i $INTERFACE -p tcp --dport "88$padded_octet" -j DNAT --to "$ip:8080"
    
    # 3000 -> 33xxx
    sudo ip netns exec $ROUTER_ID iptables -A PREROUTING -t nat -i $INTERFACE -p tcp --dport "33$padded_octet" -j DNAT --to "$ip:3000"
    
    # 443 -> 44xxx
    sudo ip netns exec $ROUTER_ID iptables -A PREROUTING -t nat -i $INTERFACE -p tcp --dport "44$padded_octet" -j DNAT --to "$ip:443"
    
    # 80 -> 80xxx
    sudo ip netns exec $ROUTER_ID iptables -A PREROUTING -t nat -i $INTERFACE -p tcp --dport "80$padded_octet" -j DNAT --to "$ip:80"
    
    # 33 -> 33xxx
    sudo ip netns exec $ROUTER_ID iptables -A PREROUTING -t nat -i $INTERFACE -p tcp --dport "33$padded_octet" -j DNAT --to "$ip:33"

    echo "Created port forwarding rules for IP: $ip"
}

# 2~254 범위의 IP에 대해 포트포워딩 설정
for i in {2..254}; do
    IP="10.0.0.$i"
    create_port_forward $IP
done

echo "Port forwarding setup completed!"

# 설정된 규칙 확인
echo "Checking NAT rules..."
sudo ip netns exec $ROUTER_ID iptables -t nat -L PREROUTING -n -v
profile
Cloud/DevOps & Network Virtualization에 관심 있는 Engineer입니다. 🐳⚓️👨‍✈️

0개의 댓글