강좌
클라우드/리눅스에 관한 강좌입니다.
네트워크 분류

라우터를 활용한 네트워크 보안

작성자 정보

  • 구돌 작성
  • 작성일

컨텐츠 정보

본문

라우터를 활용한 네트워크 보안

 

앞에서도 잠깐 언급하였지만 라우터는 패킷 라우팅이 주 임무이지만 모든 트래픽이 라우터를 통과하는 만큼 잘만 활용한다면 라우터 내부의 시스템을 보호하는 훌륭한 방화벽과 같은 보안 장비가 될 수도 있고 똑똑한 네트워크 모니터링 장비가 될 수도 있다.

 

필자의 경우 초기에 서버 관리자중 누군가는 라우터를 담당해야 했기에 어쩔 수 없이 맨 땅에 헤딩하기 식으로 배워야했지만 이제는 그때 라우터를 공부해 두지 않았으면 현재 맡고 있는 시스템 보안과 네트워크 모니터링을 어떻게 할 수 있었을까 하는 생각마저 들 정도이다.

 

그 정도로 시스템이나 네트워크 보안에 있어 라우터나 스위치를 빼고는 보안을 생각할 수 없을 정도로 중요한 역할을 하기 때문이다.

 

 

간단히 예를 들어보자. 갑자기 특정한 포트를 향하는 웜 바이러스가 기승을 부리기 시작하였는데, 내부의 모든 시스템에서 일일이 패치를 하기는 불가능하고 그렇다고 일일이 서버에서 특정한 포트를 차단하는 설정을 하는 것이 쉽지는 않을 것이다.

 

이러한 상황에서 라우터의 access-list를 이용하여 간단히 해당 포트를 차단하기만 하면 일단 급한 대로 웜 바이러스에 대해 내부의 시스템을 보호할 수 있으며 패치 등 시스템에서 작업할 수 있는 시간을 벌 수 있을 것이다.

 

또한 네트워크 모니터링을 하다보면 특정한 IP또는 IP대역에서 내부의 시스템에 대해 지속적으로 스캐닝을 하거나 공격을 시도하는 경우가 있는데, 그냥 두기에는 찝찝하고 그렇다고 내부의 모든 시스템에서 해당 IP를 차단하는 것도 여간 번거롭지 않을 수 없다.

 

이러한 경우 라우터에서 한 줄만 추가하면 해당 IP를 간단하게 차단하여 라우터 내부단에 있는 모든 시스템을 동시에 보호할 수 있을 것이다.

 

이렇듯 라우터를 활용하면 불가능한 일도 가능하게, 어려운 일도 쉽게 할 수 있다.

 

물론 라우터 그 자체는 보안장비가 아니기 때문에 하드웨어 사양이나 트래픽 등 네트워크 환경을 고려하지 않고 너무 세세한 보안 기능까지 적용하려 한다면 오히려 라우터 성능에 악영향을 주거나 심할 경우 서비스장애까지 유발할 수 있으므로 주의해서 사용해야 할 것이다.

 

여기에서는 라우터 내부단의 네트워크와 서버들을 보호할 수 있는 용도로서 실무에서 자주 사용되는 기능과 그 활용방법에 대해서 알아보도록 하겠다.

 

 

 

11.2.1 라우터 Access-list 활용

 

라우터에서의 access-list는 라우터보안의 기본이라 할 만큼 중요한 역할을 하므로 작동 방식에 대해 정확하게 이해하고, 활용할 수 있도록 충분히 연습을 하여야 한다.

 

또한 굳이 라우터를 사용하지 않더라도 다른 보안장비나 프로그램에서도 유사하거나 동일한 형식을 사용하므로 사용방법을 반드시 익혀 두는 것이 좋다.

 

여기에서 주의할 것은 일반적으로 access-list는 패킷필터링의 용도로 사용되지만 그렇다고 해서 ‘access-list 자체가 패킷을 필터링하는 것은 아니다.

 

라는 것이다.

 

access-list 자체는 패킷을 IP나 프로토콜, 포트 등 조건에 따라 정의만 할 뿐이며 이 기준에 맞는 패킷에 따라 허용하고 차단하는 등 필터링을 할 수도 있고, QoS를 적용할 수도 있으며 통계를 낼 수도 있다.

 

아마도 access-list에서 사용하는 permit이나 deny라는 용어 때문에 방화벽처럼 허용하고 거부하는 것으로 느낄 수 있지만 반드시 그런 것은 아니라는 점을 주의하기 바란다.

 

두 번째는 정확하게 알고 제대로 사용하여야 한다는 점이다.

 

만약 트래픽을 허용하고 차단하는 용도로 사용한다면 룰의 적용순서나 IP등을 실수로 작성하였을 경우, 심각한 문제를 유발할 수 있기 때문이다.

 

필자도 처음에 access-list를 어설프게 공부한 상태에서 라우터에 잘못 적용하여 네트워크가 마비된 적이 있었다.

 

그래서 필자는 지금도 access-list를 적용할 때는 반복해서 적용할 설정내용을 자세히 살펴본 다음 가능하면 콘솔에서 설정하려고 노력한다.

 

왜냐하면 룰을 잘못 설정했을 경우 바로 설정을 취소하여야 하는데, 잘못 설정된 룰로 인하여 원격에서 접속할 수 없는 경우도 흔히 발생할 수 있기 때문이다.

 

access-list는 매우 유용하지만 잘못 사용하면 위험하므로 적용 시에는 조심, 조심 또 조심하기 바란다.

 

 

access-list는 번호나 이름으로 판별하는 access-list 타입에 따라 여러 가지 종류가 있는데, 다른 것은 알 필요 없고 주로 실무에서는 Standard aclExtended acl이 사용되므로 이 두 가지만 알면 된다.

 

access-list 종류

숫자 범위

standard access-list

1-99

extended access-list

100-199

 

 

standard access-list

 

먼저 standard aclIP패킷의 소스주소만을 검사하여 룰을 정의하는 것으로, 사용할 수 있는 번호는 1부터 99번까지이다.

 

사용 형식은 다음과 같다.

 

 

access-list acl번호 {permit 또는 deny} {소스주소 wildcard 또는 any}

 

여기에서 acl번호는 1부터 99번까지 사용가능한데, 번호는 단지 각 룰을 구별하기 위한 번호일 뿐이며 번호 자체에 별 다른 의미는 없다.

 

그리고 permit으로 허용할 것인지 아니면 deny로 거부할 것인지를 지정하고 소스주소를 명시할 경우 소스주소와 함께 wildcard mask를 이용하거나 모든 IP에 대해 룰을 지정할 경우 any를 쓰면 된다.

 

이를테면 10.0.0.1을 소스로 한 패킷을 허용하는 룰을 설정한다면 다음과 같을 것이다.

 

 

 

access-list 10 permit 10.0.0.1 0.0.0.0

 

여기에서 단일한 IP인 경우 netmask255.255.255.255가 맞는데, access-list에서는

wildcard(또는 inverse) mask라는 것을 사용하여야 한다.

 

여기에서 wildcard masknetmask와 반대이므로 255.255.255.255가 아니라 0.0.0.0으로 써 주어야 한다.

 

, wildcard mask를 사용할 때는 255.255.255.255에서 해당 netmask를 뺀 값이라고 생각해도 된다.

 

, 192.168.1.0/24의 경우 C Class이므로 netmask로 나타낸다면 255.255.255.0 인데, 이를 wildcard mask로 나타내면 255.255.255.255 - 255.255.255.0 = 0.0.0.255가 되는 것이다.

 

참고로 단일한 IP를 뜻할 때는 다음과 같이 host를 이용하여 지정해도 되는데 실무에서는 이 방식이 더 자주 사용된다.

 

 

access-list 10 permit host 10.0.0.1

 

access-list는 한 줄씩 위에서부터 아래로 순서대로 실행되는데, 명시적으로 지정하지 않으면 기본적으로 "deny any"이므로 위의 의미는 아래와 동일하다.

 

즉 끝에 deny any를 쓰지 않아도 permit하지 않은 것은 기본적으로 모두 deny한다는 의미이다.

 

access-list 10 permit host 10.0.0.1

access-list 10 deny any

 

 

extended access-list

 

extended acl은 이 용어가 뜻하는 바와 같이 소스IP 주소만을 검사하여 제어하는 간단한 standard acl에 비해 프로토콜 및 소스IP, 목적지 IP, 소스 포트, 목적지 포트 등을 이용한 확장된(extended) 트래픽 제어가 가능하며, 사용할 수 있는 번호는 100부터 199번까지이다.

 

사용 형식은 다음과 같다.

 

 

access-list acl번호 {permit 또는 deny} 프로토콜 소스 소스-wildcard 목적지 목적지 -wildcard

 

여기에서 acl 번호는 100부터 199번까지 사용가능한데, 번호는 단지 각 룰을 구별하기 위한 번호일 뿐이며 번호 자체에 큰 의미는 없다.

 

그리고 permit으로 허용할 것인지 아니면 deny로 거부할 것인지 지정하며 이후에 프로토콜 및 소스정보, 목적지 정보를 지정하여 주면 된다.

 

프로토콜은 IPtcp, udp, icmp가 올 수 있으며 IP를 지정하면 포트번호를 지정하지 않고 소스 및 목적지 IP만 지정하면 되고, tcpudp를 지정하면 포트 번호를, 그리고 icmp를 지정하면 icmp typecode를 지정하면 된다.

 

그리고 wildcard maskstandard access-list에서 지정하는 방식과 동일하다.

 

access-list 110 permit udp 10.64.32.0 0.0.0.255 host 172.22.15.87 eq 69

access-list 110 permit udp any host 172.22.15.85 eq 53

access-list 110 permit udp any any eq 161

위의 예를 통해 설정된 의미를 살펴보도록 하자. 먼저 acl 번호가 110이므로 extended acl 인 것을 알 수 있으며 udp프로토콜에 대해서만 적용된 것을 알 수 있다.

 

 

첫 줄은 소스IP“10.64.32.0 0.0.0.255”이므로 netmask로 바꾸면 “10.64.32.0 255.255.255.0” , 10.64.32.0/24 C class이고, 목적지IPhost이므로 단일한 IP172.22.15.87이고 목적지포트는 69인 패킷을 허용(permit)한다는 룰이다.

 

단일한 포트일 경우에는 “eq 포트번호로 지정하지만 포트 대역을 모두 적용하고자 한다면 “range 시작포트번호 끝포트번호와 같이 지정하면 된다.

 

이를테면 “range 100 200”과 같이 지정하면 포트 100번부터 200번까지의 모든 포트를 의미한다.

 

 

????[유용한 팁]

리눅스 방화벽인 iptables에서는 포트대역을 어떻게 표현하였는지 기억나는가? iptables에는 시작포트번호:끝포트번호형식으로 중간에 콜론(:)을 사용하였다.

 

, 1024:65535라면 1024부터 65535까지의 포트를 의미한다.

 

 

두 번째는 소스가 any이므로 모든 IP에 대해 목적지 IP172.22.15.85이면서 목적지 포트가 53/udp인 패킷을 허용한다는 의미이다.

 

그리고 마지막 세 번째 줄은 소스와 목적지 IP모두에 대해 즉 IP에 관계없이 목적지 포트가 161/udp인 모든 트래픽을 허용한다는 의미이다.

 

access-list에서는 그 뒤에 명시적으로 다른 설정이 없을 경우에는 기본적으로 모두 deny any이므로 이외의 트래픽은 tcpudp, icmp 관계없이 모두 deny한다는 의미가 된다.

 

 

이렇게 access-list를 설정하였지만 설정한 것 자체는 아무런 의미가 없다.

 

왜냐하면 access-list를 설정한 다음에는 이 룰을 어떤 인터페이스에 어떻게 적용할 것인가를 정의하여야 하기 때문이다.

 

, serial 인터페이스에 적용할 것인지 아니면 ethernet 인터페이스에 적용할 것인지를 정하고, 인터페이스에 적용한다면 그 인터페이스를 기준으로 들어오는(incoming)트래픽에 대해 적용할 것인지, 아니면 나가는(outgoing) 트래픽에 대해 적용할 것인지 등을 정해야 하는 것이다.

 

인터페이스에 적용하는 방법은 다음과 같이 하면 된다.

 

아래는 standard acl의 예이나 extended acl도 동일하다.

 

 

Router#configure terminal

Router(config)#access-list 10 deny 131.108.3.0 0.0.0.255

Router(config)#access-list 10 permit any

Router(config)#interface s0

Router(config-if)#ip access-group 10 [in/out]

 

세 번째 줄까지는 앞에서 살펴본 바와 같이 소스가 131.108.3.0/24인 트래픽을 차단하고 이외의 트래픽은 모두 허용하는 standard acl을 설정한 것을 알 수 있다.

 

이후 serial 0 interface 모드로 들어간 후 앞에서 지정한 access-list를 지정한 것을 알 수 있는데,

acl을 인터페이스에 지정하는 것은 위와 같이 “ip access-group 적용할acl번호 in 또는 out”과 같이 하면 된다.

 

만약 in이나 out을 별도로 지정하지 않으면 기본적으로 out이 된다.

 

그럼 여기에서 해당 access-group에 대해 in을 설정하여야 하는지 out을 설정하여야 하는지에 대해 알아보도록 하자. 특히 이를 잘못 설정하였을 경우 네트워크가 마비되는 등 의도하지 않은 결과가 발생할 수 있으므로 주의하여야 한다.

 

아래의 그림에서 좌측이 내부 네트워크, 우측이 외부 네트워크라고 가정하고 생각해 보자. 그림을 보면 내부에서 외부로 outbound , 나가는 트래픽은 내부 ->ethernet -> 라우터 내부 -> serial”순으로 이동하게 된다.

 

따라서 내부에서 외부로 나가는(outbound) 트래픽을 제어하고자 할 경우에는 아래와 같이 두 가지 방법으로 설정하면 되는데, ethernet 인터페이스에 적용하려면 라우터 입장에서는 들어오는 것이므로 in으로, serial 인터페이스에 적용하려면 라우터 입장에서는 나가는 것이므로 out으로 하면 된다.

 

, 아래의 두 룰은 동일한 결과라 할 수 있다.

 

07724729bc4793df016d97cb5ab845c0_1652840021_542.png
 

[그림] outbound 트래픽의 in/out 구별방법

 

 

이번에는 반대로 외부 네트워크에서 내부 네트워크로 들어오는 트래픽에 대해 제어해 보도록 하자. 이때도 동일한 방식으로 외부에서 내부로 들어오는 트래픽은 외부 -> serial -> 라우터 내부 -> ethernet”순으로 이동하게 된다.

 

따라서 외부에서 내부로 들어오는(inbound) 트래픽을 제어하고자 할 경우에는 아래와 같이 두 가지 방법으로 설정하면 되는데, serial 인터페이스에 적용하려면 라우터 입장에서는 들어오는 것이므로 in으로, ethernet 인터페이스에 적용하려면 라우터 입장에서는 나가는 것이므로 out으로 하면 된다.

 

, 아래의 두 룰은 동일한 결과라 할 수 있다.

 

 

 

07724729bc4793df016d97cb5ab845c0_1652840040_3816.png
 

[그림] inbound 트래픽의 in/out 구별방법

 

access-list에서 inout은 매우 중요한 개념이므로 반복적으로 살펴보아 반드시 이해하기 바란다.

 

 

 

 

 

???? [필자경험담]

필자가 처음 access-list를 설정할 때 가장 애매했던 부분이 바로 in인지 out인지를 구별하는 것이었다.

 

매뉴얼이나 책을 아무리 찾아보아도 시원하게 알려주는 곳도 없고, 그나마 설명되어 있는 것도 난해하였다.

 

따라서 이 간단한 원리를 깨닫기까지에는 적지 않은 고민과 시간이 필요하였었다.

 

그것에 비하면 여러분은 행복하지 않은가? 고민할 필요 없이 이렇게 쉽게 알아버렸으니.. ^^;

 

다음으로 살펴보아야 할 부분은 일단 access-list를 적용한 후 룰을 추가하거나 변경, 삭제하고자 할 때이다.

 

실제로 네트워크를 운영하다보면 수시로 access-list룰을 수정해야 할 일이 생기곤 하는데 이 역시 잘못 하다보면 심각한 문제를 유발할 수 있으므로 주의하여야 한다.

 

특히 access-list를 수정하는 것은 처음에 설정하는 것보다 다소 복잡하므로 주의하여야 한다.

 

다시 한 번 확인해 보면, access-list를 설정하는 순서는 먼저 access-list를 정의한 후 access-group을 이용해 해당 access-list를 인터페이스에 적용하는 것인데, access-list를 해제하려면 이와 반대로 하면 된다.

 

즉 먼저 해당 인터페이스에서 no를 이용하여 access-group을 해제한 후 global configuration 모드에서 no를 이용하여 access-list를 삭제하면 된다.

 

Router#configure terminal

Router(config)#interface s0

Router(config-if)#no ip access-group 10 [in/out]

Router(config-if)#exit

Router(config)# no access-list 10

 

 

, 그럼 access-list의 룰을 수정 또는 변경하려면 어떻게 해야 할까? access-list에서는 수정이나 변경을 하려면 먼저 선언된 룰을 삭제한 후 새롭게 설정하여야 하며 중간에 변경하거나 수정할 수 있는 방법이 없다.

 

따라서 access-list의 룰을 변경하려면 다음과 같은 순서로 하여야 한다.

 

직접 예를 들어 보도록 하자.

아래와 같이 룰을 작성하였는데, 작성 후 살펴보니 access-list 10에서 IP를 잘못 입력하여 변경하려 한다고 가정하자.

Router#configure terminal

Router(config)#access-list 10 deny 131.108.3.0 0.0.0.255

Router(config)#access-list 10 permit any

Router(config)#interface s0

Router(config-if)#ip access-group 10 [in/out]

Router(config)# Ctrl +Z (Ctrl 키를 누른 상태에서 Z 입력)

 

그러면 먼저 acl설정을 초기화하여야 하므로 삭제할 때와 마찬가지로 먼저 인터페이스 모드로 들어가 access-group을 삭제한다.

 

그리고 global configuration 모드에서 access-list를 삭제하도록 한다.

 

Router#configure terminal

Router(config)#interface s0

Router(config-if)#no ip access-group 10 [in/out]

Router(config-if)#exit

Router(config)# no access-list 10

Router(config)# Ctrl +Z (Ctrl 키를 누른 상태에서 Z 입력)

 

이제 acl설정이 깨끗하게 초기화되었다.

 

다음단계로 넘어가기 전에 실제로 원하는 대로 초기화 되었는지 “sh run”을 실행하여 config를 확인해 보는 것도 좋다.

 

이제 변경된 정보로 새롭게 acl을 적용하면 된다.

 

아래의 경우 앞의 131.108.3.0 대신 131.108.4.0을 지정한 것을 알 수 있다.

 

 

Router#configure terminal

Router(config)#access-list 10 deny 131.108.4.0 0.0.0.255

Router(config)#access-list 10 permit any

Router(config)#interface s0

Router(config-if)#ip access-group 10 [in/out]

 

access-list를 적용한 후에는 실제로 얼마만큼 패킷이 매칭 되는지 알기 위해서 다음과 같이 “sh access-list acl번호를 실행하면 된다.

 

Router>sh access-lists 101

Extended ip access list 101

deny tcp any any range 1 chargen (7562 matches)

deny udp any any eq tftp (40670053 matches)

deny tcp any any eq finger (2807 matches)

deny udp any any eq sunrpc (77 matches)

deny tcp any any eq sunrpc (44974 matches)

deny tcp any any range exec 518 (5411 matches)

deny udp any any eq syslog (330270 matches)

deny tcp any any eq cmd

deny tcp any any eq uucp (181 matches)

deny udp any any eq 2049 (1018 matches)

permit ip any any (2991035 matches)

 

만약 “show access-list”명령어에서 나타나는 카운터 수치를 초기화하려면 clear를 이용해 초기화하면 된다.

 

 

Router # clear access-list counter

 

 

access-list 사용 시 주의 점

 

access-liststandard이든 extended이든 관계없이 iptables와 마찬가지로 룰의 순서가 매우 중요하다.

 

따라서 먼저 지정된 룰에 우선순위가 있으므로 룰의 순서를 잘못 지정하면 전혀 예상하지 못한 결과가 발생할 수 있다.

 

이를테면 제일 첫 줄에 모든 트래픽을 허용하는 룰을 정의한 이후에 거부하는 룰을 지정 하더라도 이미 모두 허용되었으므로 이후의 룰은 아무런 의미가 없다는 것이다.

 

마찬가지로 첫 줄에 모두 거부하는 룰을 작성 한 다음에 세부적인 허용 룰을 작성하더라도 이미 거부되었으므로 의미가 없게 된다.

 

 

 

access-list를 설정하면 해당 인터페이스를 통과하는 모든 트래픽에 대해 필터링 여부를 체크하기 때문에 트래픽이 많은 곳에서는 적용 시 각별히 주의하여야 한다.

 

만약 적용하여야 한다면 성능을 고려하여 룰은 가능하면 간략하게 작성하고, 가장 빈번한 접속을 먼저 선언하는 것이 좋다.

 

이를테면 다음과 같은 경우 100.100.1.0100.100.2.0보다 더 자주 접속한다면 먼저 선언하는 것이 좋다는 것이다.

 

access-list 10 permit 100.100.1.0 0.0.0.255

access-list 10 permit 100.100.2.0 0.0.0.255

access-list 10 deny 100.100.0.0 0.0.255.255

access-list 10 permit any

 

또한 장비에 따라 또는 벤더에 따라 access-listHW에서 고속으로 처리하는 경우도 있고, CPU기반에서 처리하는 경우도 있으니 적용 시 사전에 꼭 확인해 보기 바란다.

 

 

여러 룰을 선언할 때에는 범위가 더 좁은 룰을 먼저 선언하여야 한다.

 

위의 룰을 참고하면, 만약 첫 번째, 두 번째 룰보다 세 번째 룰을 먼저 선언했다면 100.100.1.0100.100.2.0을 포함한 100.100.0.0대역은 접속이 차단될 것이다.

 

 

하나의 인터페이스에는 각각 in 1, out 1개 이렇게 최대 2개의 룰을 지정할 수 있다.

 

물론 같은 access-list 번호에 대해 inout을 모두 적용할 수도 있으며 번호가 달라도 관계없다.

 

그러나 한 인터페이스에서 in을 두개 설정하거나 out을 두개 설정하는 것은 불가능하므로 그러한 경우에는 두 룰을 한 개의 룰로 적절히 합쳐야 한다.

 

 

 

기본적으로 access-listL3 인터페이스에 설정한다.

 

만약 L3 스위치에 Vlan을 설정하여 VLANaccess-list를 설정하고자 할 경우에는 아래와 같이 inout에 주의하여야 한다.

 

 

 

내부 ==> vlan을 통과 ==> 외부로 나가는 트래픽은

: access-group in 에서 필터링하여야 함

외부 => vlan을 통과 ==> 내부로 들어오는 트래픽

: access-group out 에서 필터링하여야 함

 

강사 : 라쿠텐 홍석범 부매니저

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 전체 회원수 59,444 명
  • 전체 게시물 30,916 개
  • 전체 댓글수 11,873 개