Firewall
네트워크 중간에 위치해서 해당 장비를 통과하는 트래픽을 사전에 주어진 정책 조건에 맞추어서 허용하거나 차단하는 장비
- 방화벽은 네트워크 3, 4 계층에서 동작하며 세션을 인지하는 상태 기반 엔진(Stateful Packet Inspection - SPI) 으로 동작
초기 방화벽
-
SPI 엔진이 없었음
-
초기 방화벽에서는 패킷의 인과관계를 확인하지 못하고 장비에 등록된 정책만으로 단순히 패킷을 필터링 했음
-
패킷의 세션 정보나 방향성과 상관없이 순수하게 방화벽에 설정된 정책에 따라 동작하는데, 이러한 방식을 Stateless 또는 패킷 필터 방화벽이라고 함.
-
패킷이 인입되면 해당 패킷이 방화벽에 설정된 정책에 일치하는지 확인을 하는데 이때 참고하는 조건을 5-Tuple 이라고 함
-
5-Tuple
Source IP
Destination IP
Protocol No
Source Port
Destination Port
-
방화벽에 일치된 정책이 있으면 해당 정책에 따라 그 패킷을 허용하거나 차단

- 지정된 구간에서 간단한 정책을 정의할 때는 큰 문제가 없는데, 인터넷 통신과 같이 불특정 다수 기반의 정책을 할 때는 복잡함
-
패킷 단위의 필터링이므로 5-Tuple 이외의 3, 4계층 헤더를 변조해서 공격하면 적절한 방어가 불가능
-
패킷 필터링 자체는 이후에 등장한 방화벽 엔진들보다 부하가 적고 간단한 동작으로 네트워크 장비에서 사용되거나 현대적인 일부 방화벽에서도 특수한 기능을 위해서 사용
-
지정된 IP들을 방어하는데는 간단한 패킷 필터링이 부하가 적어 블랙리스트 처리를 위해 방화벽 내부에 패킷 필터링 엔진과 SPI 엔진을 함께 동작시킴
SPI 엔진
패킷 필터링 엔진
- 기존 패킷 필터 방화벽이 상태값 없이 순수하게 정책만으로 제어하던 한계를 극복하기 위해서 개발된 것이 Stateful Inspection Firewall (상태 기반 방화벽)
- 패킷 필터는 가볍고 빠르지만, 인터넷과 같이 불특정 다수와 통신할 때는 정책 관리가 어려움
- 통신은 대부분 양방향으로 이루어지는데 패킷 필터 엔진은 양방향성을 인지하지 못하고 단순하게 패킷이 조건과 일치하는지만 확인함
- 내부 사용자가 외부의 특정 웹 페이지에 접속할 때 3-way 핸드셰이크를 거친 후 HTTP 요청과 응답 과정을 거침
- 패킷 필터 방화벽에서 이런 트래픽을 처리하기 위해 정책을 선언하려면 목적지가 불특정 다수의 웹이 될 수 있으므로 외부로 나가는 목적지에 대해서는 모든 패킷을 허용해야 함
- 이렇게 정책을 설정하면 내부에서 외부 웹 사이트로 나갈 수는 있지만, 외부에서 내부로 들어오는 응답에 대한 정책이 없어서 정상적인 통신이 되지 않을 수 있음
- 응답에 대한 정책을 설정하느 경우 외부 웹 사이트는 불특정 다수이기 때문에 출발지가 IP여야 하고, 목적지 서비스 포트는 내부에서 외부 호출 시 랜덤 포트를 지정하므로 마찬가지로 모든 포트가 되어야 하기 때문에 보안상 매우 취약
- 이러한 문제 때문에 패킷 상태를 인지해 패킷의 인과 관계를 파악할 수 있는 상태 기반 SPI 엔진이 나오게 됨
SPI 엔진
패킷의 인과 관계와 방향성을 인지해 정책을 적용할 수 있어서 내부 네트워크에서 인터넷으로 통신할 때 유용하게 사용

방화벽이 패킷을 처리하는 순서

- 장비에 패킷이 들어오면 우선 세션 상태 테이블을 확인
- 조건에 맞는 세션 정보가 세션 테이블에 있을 때 포워딩 테이블을 확인(라우팅 ARP 포함)
- 조건에 맞는 세션 정보가 세션 테이블에 없을 때 방화벽 정책을 확인
- 방화벽 정책은 맨 위의 정책부터 확인해 최종 정책까지 확인한 후 없을 때 암시적인 거부(implicit Denial) 규칙을 참고해 차단됨
- 허용 규칙이 있으면 내용을 세션 테이블에 적어 넣음
- 포워딩 테이블을 확인(라우팅, ARP 포함)
- 조건에 맞는 정보가 포워딩 테이블에 있을 때 적절한 인터페이스로 패킷을 포워딩
- 조건에 맞는 정보가 포워딩 테이블에 없을 때 패킷을 폐기
- SPI 엔진을 가진 방화벽은 세션 인지 기능이 있어서 5-Tuple 조건만 확이놯는 것이 아니라 OSI 3, 4 계층의 세부적인 필드도 같이 확인함
- 세션을 추가로 인지하고 세션 테이블에 저장하므로 로깅하기가 쉬운데 대부분의 방화벽은 통신 전체의 세션을 로그로 저장해서 보안 사고 시 이런 세션 로그를 기반으로 어떤 통신에 문제가 있었는지 판단
ALG
- 방화벽은 패킷 필터 엔진보다 헤더 정보를 상세히 확인하고 세션을 인지할 수 있지만 애플리케이션 헤더 정보를 인지하지는 못함
- 세션 방화벽 이전에 개발된 고대 프로토콜은 방화벽과 같은 세션 장비를 고려하지 못해 통신 중간에 방화벽이 있으면 정상적인 통신이 불가능한 경우가 발생하는데, 가장 대표적인 프로토콜이 FTP
- FTP는 컨트롤 프로토콜과 데이터를 보내는 데이터 프로토콜이 분리되어 동작하는데, FTP 서버는 컨트롤 프로토콜과 데이터 프로토콜이 반대로 세션을 맺으므로 방화벽이 FTP 프로토콜을 이해해서 동작하지 않으면 정상적인 서비스가 불가능
- 세션 기반으로 동작하는 방화벽은 세션의 방향성이 매우 중요한데, FTP Active Mode 에서는 초기 접속 방향과 반대로 데이터 프로토콜이 동작하므로 방화벽을 통과하지 못했는데 이 문제를 해결하기 위해서 FTP 통신 방식을
패시브 모드로 변경해서 해결 
- 패시브 모드 자체를 제공하지 못하는 컴포넌트가 있을 수 있고 이미 개발 애플리케이션의 경우는 변경이 불가능할 수 있음
- 방화벽에서 FTP 액티브 모드를 통과시키기 위해 애플리케이션 프로토콜을 확인하고 필요에 따라 세션을 인지해 포트를 자동으로 열어줌 →
ALG(Application Layer Gateway)
- ALG 기능은 PAT(Port Address Translation) 기능이 동작하는 방화벽에서 PAT를 정상적으로 통과하지 못하는 프로토콜들을 자동으로 인지해서 애플리케이션 정보를 변경하거나 세션 테이블을 만들어주는 역할을 수행
- FTP ALG 기능이 동작하려면 패킷이 방화벽을 지나갈 때 방화벽이나 해당 패킷이 참조되는 정책에 ALG 기능이 활성화 되어 있어야 한다.
- 최근 대부분의 애플리케이션이 이런 방화벽이나 NAT를 고려해서 개발되고 있고, STUN(Session Traversal Utilities for NAT) 과 같은 Hole Punching 기술들도 발전해서 오래된 프로토콜을 제외하면 ALG 기능을 사용하지 않는 추세
Router의 ACL
ACL(Access Control List) 은 라우터에서 사용할 수 있는데 트래픽을 식별하고 필터링하고 분류하고 변환 작업을 수행할 수 있는 List
- 데이터 네트워크에서는 라우터가 트래픽 연결점 역할을 수행
- 라우터에서 나가고 들어오는 패킷을 필터링하는 기능을 제공
- 네트워크 트래픽을 제한하고 특정 사용자나 특정 장비의 네트워크 사용을 제한할 수 있음
ACL의 주요 기능
- 패킷 필터링
- 라우터를 통과하는 패킷의 허용 또는 거부를 결정하는 것
- 패킷 분류
- IP ACL은 허용 조건(Permit Condition) 이나 거부 조건(Deny Condition) 을 순차적으로 나열한 것으로 이들 조건을 IP 주소나 상위 계층의 IP 프로토콜에 적용
- ACL은 라우터를 통과하여 지나가는 트래픽을 필터링하지만 라우터에서 출발하는 트래픽은 필터링 하지 않음
- 라우터가 라우터에서 출발하는 패킷을 차단할 수 없기 때문에 라우터로부터 시작하는 telnet 접속을 차단할 수는 없음
동작
- ACL의 허용 또는 거부 동작은 입력 ACL과 출력 ACL로 구분
- 입력 ACL은 입력되는 패킷들이 라우팅 되기 전에 처리(출력 ACL 보다 효율적)
- 입력 ACL은 매우 효율적인데 그 이유는 필터링 조건에 의해 패킷이 라우팅 되기 전에 패킷의 거부가 결정되기 때문에 라우팅을 위한 오버헤드를 줄일 수 있음
- 입력 ACL에서 패킷이 허용되면 그 다음에 라우팅 과정을 거치게 됨
특징
- 출력 ACL은 출력 인터페이스로 라우팅 된 후에 패킷의 허용 또는 거부를 결정
- 패킷이 인터페이스에 입력되면 라우터는 라우팅 테이블을 참조해서 패킷이 라우팅 될 수 있는지를 결정하는데, 라우팅 테이블에 해당 목적지로 가는 경로가 명시되어 있지 않으면 그 패킷은 라우팅 될 수 없으므로 폐기됨
- 라우터는 패킷이 전달되는 출력 인터페이스에 ACL이 적용되어 있는지를 검사하고 ACL이 없으면 출력 버퍼에 저장
- ACL이 존재하면 ACL 구문에 의해서 검사될 때까지 출력 인터페이스에 전달되지 않음
- ACL은 여러 인터페이스에 적용이 가능하기 때문에 동일한 ACL을 하나의 인터페이스 입력에 적용하고 다른 인터페이스의 출력에 적용이 가능하지만, 하나의 인터페이스의 입력 또는 출력 ACL은 하나만 적용 가능
- ACL은 프로토콜 마다 적용할 수 있는데, 이 경우에도 하나의 프로토콜에는 하나의 ACL 만 적용이 가능
- ACL은 위에서부터 아래로 각각의 구문을 빠짐없이 패킷에 적용하여 검사 수행
- 패킷과 ACL 구문이 일치하면 나머지 구문은 검사하지 않음
- 일치하는 구문이 있으면 조건에 따라 허용되거나 거부됨
- 마지막 구문까지 검사한 후 마지막 구문까지 일치하지 않으면 패킷은 폐기됨
- 마지막 구문은 묵시적 거부
ACL의 종류
-
표준 ACL
- 패킷의 발신지 IP 주소를 검사해서 패킷을 필터링 함
- 10.1.1.1 에서 출발한 모든 패킷은 허용하고 10.1.1.2 에서 출발한 모든 패킷은 거부합니다. 형태로 작성
-
확장 ACL
- 패킷의 발신지 IP와 수신지 IP를 모두 검사해서 필터링 함
- 10.1.1.1 에서 출발하여 10.1.1.3으로 가는 패킷은 거부
-
번호 ACL
- ACL의 번호에 따라 표준 ACL과 확장 ACL을 구분
- 1~99 또는 1300~1999가 표준 IPv4 ACL
- 확장 IPv4 ACL은 2000~2699번
-
이름 ACL
- 문자를 사용하기 때문에 구별이 쉬움
- 이름 ACL은 ACL 구문을 한 줄씩 삭제할 수 있는 장점이 있음
와일드카드 마스크
- 여러 개의 IP 주소를 하나로 표현하기 위한 방법
- 와일드카드 마스크는 각각 8비트씩으로 된 4개의 옥텟으로 이루어진 32비트의 수
- 와일드카드 마스크 비트 0은 대응하는 비트값을 검사하라는 의미고, 와일드카드 마스크의 비트 1은 대응하는 비트값을 무시하라는 의미
- 와일드카드 마스크는 서브넷 마스크와 유사하게 IP 마스크와 쌍을 이루고 있으며, 둘 다 32비트
- 서브넷 마스크에서 0과 1인 IP 주소의 호스트 부분과 네트워크 부분을 결정하는데, 와일드카드 마스크는 대응하는 IP 주소가 일치하는지 / 무시해도 되는지를 결정
- 192.168.1.0, 192.168.1.1, 192.168.1.2, 192.168.1.3 네 개의 주소를 와일드카드 마스크 하나로 표기
- 앞의 3개는 전부 동일하므로 0
- 00000000
- 00000001
- 00000010
- 00000011
- 앞의 6자리는 모두 0으로 동일하고 뒤의 두자리가 서로 다름
- 192.168.1.0 0.0.0.3
- 와일드카드 마스크는 2의 지수승으로 IP를 묶음
- 2의 지수승이 아니면 하나의 와일드카드 마스크로 표현할 수 없음
- 10.1.4.0/24 부터 10.1.8.0/24 까지를 와일드카드 마스크로 표현
- 서브넷 마스크: 10.1.4.0 255.255.247.0
- 와일드카드 마스크: 10.1.4.0
0.0.8.0 (이렇게 남는 대역을 포함시키지 않음)
→ 10.1.4.0 0.0.3.255
10.1.8.0 0.0.0.255
- → 와일드카드 마스크에서는 없는 대역은 제외하고 여러 개로 구성할 수 있음
특별한 와일드카드 마스크
- host는 전체 IP 주소의 모든 비트가 일치하는 것을 의미
- 172.23.16.29 하나만을 의미: 172.23.16.29 0.0.0.0 또는
host 172.23.16.29
모든 host를 의미하는 any
- 모든 호스트를 의미할 때는
0.0.0.0 255.255.255.255 또는 any
ACL 설정
표준 번호 ACL의 설정
-
출발지 IP 주소를 기반으로 패킷을 필터링 하는데 TCP/IP 프로토콜 전체를 허용하거나 거부
-
표준 번호 ACL은 1~99, 1300~1999 의 번호를 사용
-
과정
- ACL을 작성
- access-list 번호 {permit | deny | remark} ‘네트워크 주소’ ‘와일드카드마스크’
- access-list 1 permit 172.16.0.0 0.0.255.255
- 인터페이스에 적용
- ip access-group 번호 {in | out}
-
실습
- 라우터 3개 배치
- R1과 R2는 Ethernet2/0 으로 연결
- R2와 R3는 Ethernet2/1 로 연결
- IP 할당
- R1의 Ethernet2/0에 192.168.0.1/24 를 할당
- R1#configure terminal
- R1(config)#interface ethernet2/0
- R1(config)#ip address 192.168.0.1 255.255.255.0
- R1(config-if)#no shutdown
- R1(config-if)#exit
- R1(config)#exit
- R1#show ip interface brief
- R2의 Ethernet2/0에 192.168.0.254/24 를 할당
- R2의 Ethernet2/1에 172.16.0.254/24 를 할당
- R2#configure terminal
- R2(config)#interface ethernet2/0
- R2(config)#ip address 192.168.0.254 255.255.255.0
- R2(config-if)#no shutdown
- R2(config-if)#interface ethernet2/1
- R2(config-if)#ip address 172.16.0.254 255.255.255.0
- R2(config-if)#np shutdown
- R2(config-if)#exit
- R2(config)#exit
- R2#show ip interface brief
- R3의 Ethernet2/1에 172.16.0.1/24를 할당
- R3#configure terminal
- R3(config)#interface ethernet2/1
- R3(config)#ip address 172.16.0.1 255.255.255.0
- R3(config-if)#no shutdown
- R3(config-if)#exit
- R3(config)#exit
- R3#show ip interface brief
- 통신이 가능하도록 라우팅
- R1# configure terminal
- R1(config)# router ospf 1
- R1(config-router) # network 192.168.0.0 0.0.0.255 area 0
- R1(config-router) # exit
- R1(config) # exit
- R1# show ip route
- R2# configure terminal
- R2(config)# router ospf 1
- R2(config-router) # network 192.168.0.0 0.0.0.255 area 0
- R2(config-router) # network 172.16.0.0 0.0.0.255 area 0
- R2(config-router) # exit
- R2(config) # exit
- R2# show ip route
- R3# configure terminal
- R3(config)# router ospf 1
- R3(config-router) # network 172.16.0.0 0.0.0.255 area 0
- R3(config-router) # exit
- R3(config) # exit
- R3# show ip route
-
표준 ACL을 이용해서 R2에서 192.168.0.1 에서 172.16.0.1 로 통신이 되지 않도록 설정
- R2#configure terminal
- R2(config)# access-list 1 deny 192.168.0.1 0.0.0.0
- R2(config)# interface ethernet2/1
- R2(config-if)# ip access-group 1 out
- R1#ping 172.16.0.1 #UUUUU
확장 번호 ACL 설정
- 발신지와 목적지 IP 주소를 모두 검사하고 프로토콜과 TCP나 UDP 포트 번호를 검사할 수 있음
- 패킷의 출발지, 목적지, 프로토콜 유형, 포트 주소, 응용 등을 기반으로 접속을 허용하거나 거부할 수 있음
- HTTP는 허용하고 FTP는 거부
- 번호를 100~199, 2000~2699 번 사이로 작성해야 함
- 설정 과정
- ACL 구문을 작성
- access-list 번호 {permit | deny} 프로토콜 출발지네트워크주소 와일드카드마스크 {operator port} 목적지네트워크주소 와일드카드마스크 {operator port}
- 인터페이스에 적용하는 것은 동일
이름을 이용하는 방법
- ip access-list extended 이름
- ip access-list standard 이름