AWS EC2에 적용되는 보안 그룹(Security Group)에 규칙을 적용하였을 때 예상되는 것과 다르게 동작하지 않는 경우가 있습니다.
올바르게 동작하지 않는 여러가지 케이스 중 프로토콜을 잘못 입력한 경우 아래와 같은 방법을 시도해 볼 수 있습니다.
1. 프로토콜 확인
보안그룹에는 프로토콜 유형을 지정해야 합니다. 만약 프로토콜 유형이 정상적으로 지정되지 않으면 해당 규칙에 매핑되지 않습니다.
예를 들어, 호스트간 연결 확인을 위해 Ping을 사용한다면 ICMP 프로토콜을 등록해야 합니다. 하지만 해당 규칙을 TCP로 입력한 경우 정상적으로 동작하지 않습니다.
먼저 등록하고자하는 규칙에 적용될 프로토콜 유형을 확인합니다.
대부분의 애플리케이션에서 TCP, UDP를 사용할 것이고 특수한 경우에는 SMTP, HTTP, NFS 등이 사용될 것입니다.
위의 그림은 보안그룹에 등록되어 있는 2개의 규칙을 보여줍니다.
첫번째 규칙은 호스트에 SSH 프로토콜을 사용하여 접속하기 위해 지정된 규칙입니다.
두 번째 규칙은 호스트 간 SCTP(Stream Control Transmission Protocol)을 주고 받기 위해 지정된 규칙입니다.
SCTP의 경우 보안그룹 유형에 작성되어 있지 않습니다. 이 경우 프로토콜의 번호를 확인하여 사용자 지정 프로토콜을 입력해야 합니다.
https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
위의 링크에 접속하면 각 프로토콜과 번호가 매핑되어 있습니다.
SCTP는 132번이므로 보안그룹의 유형은 '사용자 지정 프로토콜', 프로토콜은 132를 입력하였습니다.
2. tcpdump를 통한 프로토콜 확인
만약 위와 같이 프로토콜 유형을 올바르게 지정한 경우에 통신이 되지 않는다면 tcpdump를 사용하여 문제 해결을 시도해 볼 수 있습니다.
'tcpdump는 명령 줄에서 실행하는 일반적인 패킷 가로채기 소프트웨어이다'
tcpdump는 특정 인터페이스의 트래픽을 실시간으로 조회할 수 있습니다.
아래와 같이 명령어를 통해 문제가 있는 패킷을 조회합니다.
sudo tcpdump -i [interface] -ne -l
interface를 모를때
sudo tcpdump -i any -ne -l
interface가 ens5의 경우
sudo tcpdump -i ens5 -ne -l
interface가 ens5이고 port가 3512인경우
sudo tcpdump -i ens5 -ne -l port 3512
interface가 ens5이고 icmp 프로토콜의 경우
sudo tcpdump -i ens5 -ne -l icmp
예를 들어, 위의 그림과 같이 호스트1에서 호스트 2로 icmp 패킷을 보내기 위해 보안그룹에 적용을 하였지만 정상적으로 동작하지 않는 경우를 가정해 보겠습니다.
아마도 이 경우 보안그룹을 정상적으로 적용하였다면 인지하지 못한 특정 단계가 있을 수 있습니다.
icmp를 전송하기 전에 다른 통신이 필요한경우와 같은 경우입니다.
이러한 경우 아래와 같은 방법을 시도해 볼 수 있습니다.
Host 1에서 아래의 명령어를 입력합니다.
sudo tcpdump -i any -ne -l | grep 10.10.0.2
혹은 특정 인터페이스를 알고 있다면
sudo tcpdump -i ens5 -ne -l | grep 10.10.0.2
수많은 패킷이 발생할 경우 Ctrl+c로 멈춘 뒤 확인을 합니다.
ICMP가 아닌 다른 프로토콜이 확인된 경우 해당 프로토콜을 보안그룹에 적용합니다.
위의 과정을 통해 보안그룹이 정상동작하지 않는 경우 문제를 해결하기 위한 시도를 할 수 있습니다.