아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

방화벽

면접 대비

시간 제한1초메모리 제한1024 MB

요약
각 패킷을 규칙 목록의 위에서 아래로 검사하며 포트, IP, 최근 1000개 패킷의 전송 횟수 조건을 확인하고, accept나 drop이 나올 때까지 일치하는 규칙의 동작을 출력한다.
난이도

보통10점 중 5점

유형
시뮬레이션, 구현, 큐, 배열
정답자
아직 제출이 없습니다

문제

인터넷에는 항상 남의 컴퓨터를 해킹하려 드는 나쁜 사람들이 많다. 이들은 고양이 사진, 은행 로그인 정보, 프로그래밍 데이팅 사이트의 회원 명단을 훔친다. 네트워크 공격에 맞서는 첫 번째 대응책 중 하나가 방화벽이다. 방화벽은 여러 기준에 따라 일부 네트워크 트래픽을 걸러서 허가되지 않은 접근을 막는다. 이 문제에서는 네트워크를 통해 서버로 보낸 메시지를 폐기할지 받아들일지 결정하는 방화벽의 일부를 구현한다.

방화벽은 긴 목록에 담긴 여러 개의 규칙으로 이루어진다. 규칙은 "[조건 목록]이 참이면 동작을 수행한다" 형태이다. 조건은 다음 중 하나이다.

  • port=XYZ - 메시지를 포트 XYZ로 보냈을 때.
  • ip=XYZ - 메시지를 IP 주소 XYZ에서 보냈을 때.
  • limit=XYZ - 마지막 1000개 메시지(방금 받은 메시지 포함) 중 적어도 XYZ개를 이 IP 주소에서 보냈을 때.

동작은 다음 중 하나이다.

  • accept - 패킷을 방화벽 밖으로 내보낸다. accept packet-ID를 출력한다.
  • log - log packet-ID를 출력한다.
  • drop - 패킷을 막는다. drop packet-ID를 출력한다.

규칙의 예와 설명은 다음과 같다.

  • accept - 항상 패킷을 받아들인다.
  • accept ip=127.0.0.1 - 패킷이 IP 주소 127.0.0.1에서 왔으면 받아들인다.
  • drop port=22 ip=192.168.1.1 - 패킷이 IP 주소 192.168.1.1에서 왔고 포트 22로 보냈으면 폐기한다.
  • log port=80 limit=500 - 패킷을 포트 80으로 보냈고 마지막 1000개 메시지 중 적어도 절반을 이 IP 주소에서 보냈으면 로그를 남긴다.

패킷이 방화벽에 들어오면, 패킷과 일치하는 규칙을 만날 때까지 목록의 규칙을 위에서 아래로 모두 확인한다. 주어진 방화벽은 패킷이 목록 끝에 도달하기 전에 반드시 받아들여지거나 폐기되도록 구성된다.

입력

첫째 줄에는 방화벽의 규칙 수를 나타내는 정수 1≤N≤1001 \le N \le 100이 주어진다.

다음 NN개 줄에는 목록의 규칙이 한 줄에 하나씩 주어진다.

그다음 줄에는 방화벽에 도착하는 패킷의 수 P≤10 000P \le 10\,000이 주어진다. 패킷은 도착한 순서대로 주어진다. 패킷은 IP:port 형태이며, 예를 들어 127.0.0.1:123과 같다. 패킷 ID는 이 목록에서 패킷의 위치이다. 첫 번째 패킷의 ID는 11이고 마지막 패킷의 ID는 PP이다.

포트는 정수 1≤p≤655351 \le p \le 65535이다.

출력

각 패킷을 받아들여지거나 폐기될 때까지 방화벽을 통과시킨다. 수행한 동작마다 출력할 내용이 정해져 있다. log 동작은 패킷을 방화벽 안에 멈춰 세우지 않으므로, 패킷 하나가 여러 줄을 출력할 수 있다.

예제3

  1. 예제 1

    입력
    6
    accept ip=127.0.0.1
    drop port=22
    accept limit=5
    accept port=80
    accept port=10 port=11
    drop
    16
    127.0.0.1:80
    127.0.0.1:22
    192.168.0.1:80
    192.168.0.1:11
    192.168.0.1:12
    192.168.0.1:13
    192.168.0.1:14
    192.168.0.1:15
    192.168.0.1:16
    192.168.0.1:22
    192.168.0.1:80
    154.135.0.5:22
    154.135.0.5:80
    127.0.0.1:8080
    215.215.5.8:5919
    215.215.5.9:5919
    
    예상 출력
    accept 1
    accept 2
    accept 3
    drop 4
    drop 5
    drop 6
    accept 7
    accept 8
    accept 9
    drop 10
    accept 11
    drop 12
    accept 13
    accept 14
    drop 15
    drop 16
    
  2. 예제 2

    입력
    4
    accept ip=192.168.0.1
    log port=22
    accept
    drop
    16
    127.0.0.1:80
    127.0.0.1:22
    192.168.0.1:80
    192.168.0.1:11
    192.168.0.1:12
    192.168.0.1:13
    192.168.0.1:14
    192.168.0.1:15
    192.168.0.1:16
    192.168.0.1:22
    192.168.0.1:80
    154.135.0.5:22
    154.135.0.5:80
    127.0.0.1:8080
    215.215.5.8:5919
    215.215.5.9:5919
    
    예상 출력
    accept 1
    log 2
    accept 2
    accept 3
    accept 4
    accept 5
    accept 6
    accept 7
    accept 8
    accept 9
    accept 10
    accept 11
    log 12
    accept 12
    accept 13
    accept 14
    accept 15
    accept 16
    
  3. 예제 3

    입력
    5
    log limit=1
    log limit=2
    log limit=3
    drop limit=1
    accept
    16
    127.0.0.1:80
    127.0.0.1:22
    192.168.0.1:80
    192.168.0.1:11
    192.168.0.1:12
    192.168.0.1:13
    192.168.0.1:14
    192.168.0.1:15
    192.168.0.1:16
    192.168.0.1:22
    192.168.0.1:80
    154.135.0.5:22
    154.135.0.5:80
    127.0.0.1:8080
    215.215.5.8:5919
    215.215.5.9:5919
    
    예상 출력
    log 1
    drop 1
    log 2
    log 2
    drop 2
    log 3
    drop 3
    log 4
    log 4
    drop 4
    log 5
    log 5
    log 5
    drop 5
    log 6
    log 6
    log 6
    drop 6
    log 7
    log 7
    log 7
    drop 7
    log 8
    log 8
    log 8
    drop 8
    log 9
    log 9
    log 9
    drop 9
    log 10
    log 10
    log 10
    drop 10
    log 11
    log 11
    log 11
    drop 11
    log 12
    drop 12
    log 13
    log 13
    drop 13
    log 14
    log 14
    log 14
    drop 14
    log 15
    drop 15
    log 16
    drop 16