페이지를 불러오는 중…
해결한 사람
1
명
정답률
100.00
%
시간 제한
5
ms
메모리 제한
1024
MB
인터넷에는 항상 다른 사람의 컴퓨터를 해킹하려는 악당들이 많이 있다. 이들은 고양이 사진, 은행 로그인 정보, 프로그래밍 데이트 사이트의 회원 목록을 훔친다. 네트워크 기반 공격에 대한 최초의 대응책 중 하나는 방화벽이다. 방화벽은 다양한 기준에 따라 일부 네트워크 트래픽을 걸러 내어 무단 접근을 차단한다. 이 문제에서는 네트워크를 통해 서버로 전송된 특정 메시지를 폐기할지 받아들일지를 결정하는 방화벽의 일부를 구현한다.
방화벽은 긴 목록에 나열된 여러 개의 규칙으로 구성된다. 규칙의 형식은 ``[조건 목록]이 참이면, 동작을 수행한다''이다. 조건은 다음 중 하나이다.
[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 | 7 | $P \le 10\,000$. 동작은 `accept`뿐이다.
2 | 15 | $P \le 10\,000$. 어떤 규칙에도 조건이 없다.
3 | 29 | $P \le 10\,000$. `limit` 조건은 없다.
4 | 25 | $P \le 100$
5 | 14 | $P \le 1\,000$
6 | 10 | $P \le 10\,000$
입력의 첫째 줄에 방화벽의 규칙 수를 나타내는 정수 이 주어진다.
다음 개의 줄에는 목록의 규칙이 한 줄에 하나씩 주어진다.
다음 줄에는 방화벽에 도착하는 패킷의 수를 나타내는 정수 이 주어진다. 패킷은 도착 순서대로 주어진다.
패킷의 형식은 IP:port이며, 예를 들면 127.0.0.1:123이다. 패킷의 ID는 단순히 이 목록에서 패킷의 위치이다. 첫 번째 패킷의 id는 이고 마지막 패킷의 ID는 이다.
포트는 정수 이다.
각 패킷이 받아들여지거나 폐기될 때까지 방화벽을 통과시킨다. 수행되는 각 동작에는 무엇을 출력해야 하는지가 설명되어 있다. 동작
log은 방화벽에서 패킷의 처리를 중단하지 않으므로, 각 패킷으로 인해 여러 줄이 출력될 수도 있다는 점에 유의한다.
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
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
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
Programmeringsolympiaden
로그인 상태를 확인하는 중입니다.