문제
강의 자료에 나온대로 포트포워딩을 진행했지만 실제로는 포트포워딩이 되지 않았다.
상황
강의 자료에 나온 명령어는 다음과 같다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
하지만 보안그룹 인바운드 규칙을 확인해봐도, 서버 내에 프로세스가 정상적으로 실행되었음을 확인해봐도 80포트로 접속이 되지 않았다.
ubuntu@ip-172-31-41-183:~$ sudo iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
위의 명령어로 포트포워딩이 정상적으로 설정됐는지 확인했지만 잘 되어 있었다.
해결
우선 위의 명령어에 대한 자세한 설명은 이 블로그를 참고하고, 간략하게 설명하면 다음과 같다.
- iptables : ip 관리하는 테이블로, 방화벽을 설정하는 명령어
- -t nat : NAT 테이블을 선택
- -A PREROUTING : -A는 새로운 정책을 추가, -A PREROUTING는 라우팅 전에 결정되는 규칙을 추가
- -i eh0 : eth0인 입력 네트워크 인터페이스와 매칭
- -p tcp : TCP 프로토콜과 매칭
- -dPort 80 : 목적지 포트가 80에 대해 매칭
- -j REDIRECT : -j는 jump로, 매칭되는 패킷을 어떻게 처리할지 결정, REDIRECT는 리디렉션.
- -to-port 8080 : 패킷을 8080으로 리디렉션
정리하면 eth0 네트워크 인터페이스로 들어오는 패킷 중, 목적지 포트가 80인 TCP 패킷을 8080 포트로 리디렉션 해주는 명령어이다.
다른 글을 찾아보니 입력 네트워크 인터페이스를 바꿔주니 해결되었고, 그래서 나는 우분투의 각 버전과 아키텍처 별로 NI를 조사해보았다.
아래는 각 버전 별 ifconfig 명령어의 결과다.
우분투 24.04 - ARM
ens5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 172.31.41.183 netmask 255.255.240.0 broadcast 172.31.47.255
inet6 fe80::822:cff:fed1:371f prefixlen 64 scopeid 0x20<link>
ether 0a:22:0c:d1:37:1f txqueuelen 1000 (Ethernet)
RX packets 22538 bytes 29638477 (29.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11742 bytes 917655 (917.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
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 170 bytes 18165 (18.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 170 bytes 18165 (18.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
우분투 24.04 - X86(64)
enX0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 172.31.2.58 netmask 255.255.240.0 broadcast 172.31.15.255
inet6 fe80::31:faff:fe19:a1b prefixlen 64 scopeid 0x20<link>
ether 02:31:fa:19:0a:1b txqueuelen 1000 (Ethernet)
RX packets 21329 bytes 29947584 (29.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2277 bytes 260858 (260.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
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 166 bytes 17850 (17.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 166 bytes 17850 (17.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
우분투 22.04 - ARM
ens5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 172.31.37.9 netmask 255.255.240.0 broadcast 172.31.47.255
inet6 fe80::84c:38ff:fe39:717 prefixlen 64 scopeid 0x20<link>
ether 0a:4c:38:39:07:17 txqueuelen 1000 (Ethernet)
RX packets 22354 bytes 32723724 (32.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10664 bytes 802619 (802.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
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 174 bytes 18800 (18.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 174 bytes 18800 (18.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
우분투 22.04 - X86(64)
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 172.31.8.217 netmask 255.255.240.0 broadcast 172.31.15.255
inet6 fe80::e:5dff:fe7d:c547 prefixlen 64 scopeid 0x20<link>
ether 02:0e:5d:7d:c5:47 txqueuelen 1000 (Ethernet)
RX packets 24261 bytes 34927370 (34.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2865 bytes 297580 (297.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
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 166 bytes 18114 (18.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 166 bytes 18114 (18.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
버전 및 아키텍처 별 네트워크 인터페이스 정리
표로 정리하면 다음과 같다.
우분투 버전 | 우분투 24.04 | 우분투 22.04 | ||
아키텍처 | ARM | X86 | ARM | X86 |
네트워크 인터페이스 |
ens5 | enX0 | ens5 | eth0 |
실제로 버전 및 아키텍처에 따라 달라진다!
즉, 위의 명령어에서 eth0 부분을 현재 서버의 스펙에 맞게 변경해주면 정상적으로 동작이 된다.
나와 같은 경우는 t4g.nano를 사용하여 ARM 아키텍처를 사용하고 있으므로 우분투 버전에 상관없이 eth0를 ens5로 변경해주면 정상적으로 포트포워딩이 적용된다.
NIC 명명법이 변경된 이유
우분투에서 Predictable Network Interface Names 라고 하는, 네트워크 인터페이스 이름을 관리하는 방식이 변경이 되었기 때문이다. (참고 : 블로그)
이러한 변화는 systemd 197 에서부터 시작됐고, 기존의 예측 불가능한 명명법에서 예측이 가능하도록 이름을 할당하도록 명명법이 바뀌었다.
<pf><type><bus_id> 로 구성되며(출처 : IBM), 이더넷(pf가en)으로 예시를 든다면 아래와 같다. (출처 : systemd, systemd를 기반으로 하는 위키)
- eno: Names containing the index numbers provided by firmware/BIOS for on-board devices, example: eno1 (eno = Onboard).
- ens: Names containing the PCI Express hotplug slot numbers provided by the firmware/BIOS, example: ens1 (ens = Slot).
- enp: Names containing the physical/geographical location of the hardware's port, example: enp2s0 (enp = Position).
- enx: Names containing the MAC address of the interface (example: enx78e7d1ea46da).
- eth: Classic unpredictable kernel-native ethX naming (example: eth0).
결론
AWS의 우분투 24.04 LTS버전에서는 enx* 이므로 맥주소를 기반으로 하는 명명법을 따랐다고 볼 수 있다.
TMI
이거 테스트 한다고 우분투 24.04부터 22.04까지 ARM과 X86기반 아키텍처 모두 만들어서 해봤다 ㅎㅎ
우분투 20.04 - x86으로도 해보려고 했지만 (ARM은 아예 없다)
우분투 20.04 버전으로는 Microsoft SQL Server와 함께 있는 AMI 인데, 일단 t2의 nano, micro, small은 모두 안 됐다,,
20.04 버전은 LTS 종료가 1년도 안 남았으니 그냥 안 쓰는 걸로,,
'TIL ✍️' 카테고리의 다른 글
24/08/06(화) 93번째 TIL : 도커 볼륨으로 레디스 데이터 공유하기 (3) | 2024.08.06 |
---|---|
24/08/05(월) 92번째 TIL : 레디스 인증 설정 (0) | 2024.08.05 |
24/08/01(목) 90번째 TIL : AWS Amazon VPC CIDR 범위 (1) | 2024.08.01 |
24/07/31(수) 89번째 TIL : EC2 Ubuntu 사용자 데이터 스크립트 (2) | 2024.07.31 |
24/07/30(화) 88번째 TIL : Access token & Refresh token 요청/응답 방식과 양식 (1) | 2024.07.30 |