
인스턴스 접속을 위한 구성은 대부분 끝났다.
이미지 추가,유동 IP설정을 끝으로 인스턴스에 접속해보겠다.
여러 리눅스 배포판은
클라우드용 이미지를 제공한다.
- 인스턴스 생성 시, 스크립트 수행으로 자동 설정, 커스터마이징이 가능하다.
- 일반적으로
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
만약 공유기 네트워크에 노드를 연결해 사용중이라면, 공유기로부터 IP를 할당받아 사용 가능하다.
또한, 고정 IP 사용 환경이라면 VM에 바로 고정 IP를 할당해 사용할 수 있다.
그러나 일반적으로공용 IP는 한정적이므로, 모든 VM에 유동 IP를 할당해 사용은 어렵다.
사용 가능한 유동 IP 범위를 지정해 사용할 수 있도록 한다.

관리 → 네트워크 → 네트워크 → provider network → 서브넷 편집
사용 가능한 범위를 지정해준다.

프로젝트 → 네트워크 → Floating IP → 프로젝트에 IP 할당
연결 또는 인스턴스 설정에서 인스턴스에 유동 IP를 연결해 줄 수 있다.
한정적인 유동 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
default 보안 그룹을 확인하면, 같은 보안 그룹에 속한 인스턴스들끼리만 Ingress를 허용하고 있다.
접속을 위해 192.168.1.0/24 대역을 추가하고, 기본 들어옴 규칙을 삭제하겠다.

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

CIDR을 192.168.1.0/24로 입력, 모든 TCP 선택 후 추가한다.
기존 들어옴 규칙은 삭제한다.
포트 포워딩을 통해 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
아직 생성되지 않은 인스턴스에도 포트 포워딩을 미리 설정해두려고 한다.
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