VPC Flow log는 VPC위에 생성된 네트워크 인터페이스에서 송수신되는 IP 트래픽 로그를 수집할 수 있는 기능이다.
AWS에서 네트워크 인터페이스를 ENI(Elastic Network Interface)라고 하는데, 대표적으로 EC2와 RDS, ELB에 ENI가 할당이되며 VPC endpoint, RDS, Elasticache 등에도 ENI가 할당이 된다.
VPC flow log는 S3, Cloudwatch logs 에 저장할 수 있다. (kinesis Firehose는 따로 사용해보진 않음)
비용적인 측면으로 보면 s3가 더 저렴하지만 로그 파일 형태로 일일히 다운로드 받아야하며 원하는 데이터를 필터링하기가 어렵다.
S3 에서 네트워크 관련 로그를 확인 하기 위해서는 S3, Athena 를 사용한 쿼리 해당 링크를 참조하면 좋을거 같다. (기회가 된다면 포스팅하도록....!)
Cloudwatch logs를 사용하게되면 AWS관리 콘솔에서 대시보드 형태로 제공이되며 필터를 걸어서 검색하기도 수월하고, 데이터 보관주기도 쉽게 설정할 수 있다.
또한, Cloudwatch 에서도 로그 그룹에 저장된 로그를 쿼리할 수 있다. Cloudwatch Logs Insights 를 사용한 쿼리 해당 링크를 참고하면 좋을거 같다. (기회가 된다면 함께 포스팅)
# Default Format
${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status}
# Log 예시
2 123456789012 eni-xxxxxxxxxxxxxxxxx 10.x.x.x 192.x.x.x 80 54452 6 5 884 1690848063 1690848091 ACCEPT OK
2 123456789012 eni-xxxxxxxxxxxxxxxxx 192.x.x.x 10.x.x.x 54452 80 6 7 3145 1690848063 1690848091 ACCEPT OK
Default 포맷으로 위 14가지를 확인할 것인지, 필요한 것만 커스텀 할 것인지를 선택할 수 있다.
필드 | 설명 |
---|---|
version | VPC Flow Log Version |
account-id | 트래픽이 기록되는 소스 네트워크 인터페이스 소유자의 AWS 계정 ID |
interface-id | 트래픽이 기록되는 네트워크 인터페이스 ID |
srcaddr | 들어오는 트래픽의 소스 주소 또는 네트워크 인터페이스의 나가는 트래픽의 네트워크 인터페이스의 IPv4 또는 IPv6 주소 |
dstaddr | 나가는 트래픽의 대상 주소 또는 네트워크 인터페이스의 들어오는 트래픽의 네트워크 인터페이스의 IPv4 또는 IPv6 주소. |
srcport | 트래픽의 소스 포트 |
dstport | 트래픽의 대상 포트 |
protocol | 패킷에 대한 Protocol Number (6: TCP, 17: UDP, 1: ICMP) |
packets | 로그 캡처 중 전송된 패킷 수 |
bytes | 로그 캡처 중 전송된 바이트 수 |
start | 로그 캡처 시작 시간 (단위 : Unix 초) |
end | 로그 캡처 종료 시간 (단위 : Unix 초) |
action | ACCEPT : 보안 그룹 및 네트워크 ACL에서 허용한 기록된 트래픽 REJECT : 보안 그룹 또는 네트워크 ACL에서 허용하지 않은 트래픽 |
log-status | Flow Log의 로깅 상태 – OK: 데이터가 선택된 대상에 정상적으로 로깅 – NODATA: 캡처 기간 중 ENI에서 전송하거나 수신된 네트워크 트래픽이 없을 경우 – SKIPDATA: 캡처 기간 중 일부 Flow Log 레코드를 건너뜀. 내부용량 제한 또는 내부오류 원인 가능 |
AWS 공식 문서와 다르게 작성자 기준으로 읽기 쉽게 적어놓은 내용이라 자세한 내용은 아래 링크를 참고하면 좋을거 같다.
VPC FlowLogs
필드 | 설명 |
---|---|
vpc-id | 트래픽이 기록되는 네트워크 인터페이스를 포함하는 VPC 의 ID |
subnet-id | 트래픽이 기록되는 네트워크 인터페이스가 포함된 서브넷의 ID |
instance-id | 인스턴스를 소유한 경우 트래픽이 기록되는 네트워크 인터페이스와 연결된 인스턴스의 ID |
tcp-flags | 다음 TCP 플래그의 비트마스크 값 (FIN:1, SYN:2, RST:4, PSH:8, ACK:16, SYN-ACK:18, URG:32) TCP segment structure |
type | 트래픽 유형(IPv4, IPv6) |
pkt-srcaddr | 트래픽의 패킷레벨의 출발지 IP 주소 (NAT 를 통과하여도 원래의 IP를 알 수 있음) |
pkt-dstaddr | 트래픽의 패킷레벨의 목적지 대상 IP 주소 (NAT 를 통과하여도 원래의 IP를 알 수 있음) |
region | 리전 정보 |
az-id | 가용 영역의 ID |
sublocation-type | sublocation-type 필드에 반환되는 하위 위치 타입 (wavelength, outpost, localzone) |
sublocation-id | 하위 위치의 ID |
pkt-src-aws-service | pkt-srcaddr 필드에 대한 IP 주소 범위의 이름 (AMAZON, CLOUDFRONT, ...) |
pkt-dst-aws-service | pkt-dstaddr 필드에 대한 IP 주소 범위의 이름 (AMAZON, CLOUDFRONT, ...) |
flow-direction | 인터페이스에 대한 흐름 방향으로 ingress 또는 egress |
traffic-path | 송신 트래픽이 대상으로 이동하는 경로 |
인프라 운영을 하면서 네트워크 로그를 보는 경우가 종종 있으며, 폐쇄망에서 tcpdump 등 명령어를 설치하는 것은 어려운 상황이라면 VPC Flow Logs 를 활용하는 경우가 있었다. 또한 통신 여부를 확인하기 위해서 자주 사용하기에 활용하면 좋을 것 같다.
위에도 언급 했지만, Cloudwatch 로그 그룹에 로그를 쌓다보니 제법 많은 비용이 발생할 수 있기 때문에 보관 기간을 정하거나 특정 Subnet 만 하는 등 상황에 맞게 설정을 진행하면 된다.