EdgeRouter - Zone 정책 CLI 예제

download at 2017-06-14T00:20:00Z origin

Overview


이 문서는 zone 기반 방화벽을 설정하는 방법에 대하여 서술합니다.

EdgeOS는 ACL 기반 방화벽과 zone 기반 방화벽 모두 지원합니다. 하지만 현재의 zone 기반 방화벽은 CLI에서만 설정이 가능합니다. ACL 기반 방화벽과 zone 기반 방화벽의 차이를 알고 싶다면, 다음 문서를 참고하세요요: ACL vs. Zones

다음 3개의 네트워크가 존재한다고 가정합니다:

  1. WAN - 172.16.10.0/24, 2001:0DB8:0:9999::0/64
  2. LAN - 192.168.100.0/24, 2001:0DB8:0:AAAA::0/64
  3. DMZ - 192.168.200.0/24, 2001:0DB8:0:BBBB::0/64

본 예제는 라우터 온 어 스틱 (router on a stick)을 사용하였지만, 가지고 있는 NIC에 적용이 가능합니다.

논리 네트워크 다이어그램

  • Internet – 192.168.200.100 – tcp/80
  • Internet – 192.168.200.100 – tcp/443
  • Internet – 192.168.200.100 – tcp/25
  • Internet – 192.168.200.100 – tcp/53
  • EdgeOS 는 DHCP, DNS forwarder, NAT, router, firewall 역할을 담당.
  • 192.168.200.200/2001:0DB8:0:BBBB::200 는 내부/외부 DNS, web, mail (SMTP/IMAP) 서버.
  • 192.168.100.10/2001:0DB8:0:AAAA::10 는 EdgeOS로 SSH 접근이 가능한관리자 콘솔.
  • LAN 과 DMZ 호스트는 기본적으로 web, FTP, SSH의 아웃바운드로 접근이 가능.
  • LAN 은 DMZ 리소스에 접근이 가능.
  • DMZ 는 LAN 리소스에 접근 불가.
  • 인바운드 WAN은 DMZ 호스트에 연결.

image0

물리 네트워크 다이어그램

EdgeOs 인터페이스는 .1/:1 각 주소에 할당. 아래는 VLAN의 포트 할당입니다:

  • WAN - VLAN 10
  • LAN - VLAN 20
  • DMZ - VLAN 30

설정은 다음과 같이 진행합니다:

interfaces {
 ethernet eth0 {
 vif 10 {
 address 172.16.10.1/24
 address 2001:db8:0:9999::1/64
 }
 vif 20 {
 address 192.168.100.1/24
 address 2001:db8:0:AAAA::1/64
 }
 vif 30 {
 address 192.168.200.1/24
 address 2001:db8:0:BBBB::1/64
 }
 }
}

image1

Zone 기본

각 인터페이스는 하나의 zone에 할당됩니다. 인터페이스는 물리, 터널 (VPN, PPTP, GRE 등)과 같은 가상 인터페이스 모두 동일하게 처리합니다.

zone A에서 zone B로 트래픽이 이동합니다. 이러한 트래픽 이동을 zone 페어 디렉션 (zone-pair-direction)이라고 합니다. 예를 들어, A->B, B->A로 트래픽이 이동할 경우, 2개의 zone 페어 디렉션이 있다고 정의합니다.

룰 셋은 zone 페어 디렉션 단위로 생성합니다.

본 문서에서는 zone 페어 디렉션의 룰셋 이름을 ZoneA-ZoneB와 같이 디렉션의 방향으로 정의합니다. EdgeOS에서는 중복 룰셋 이름을 허용하지 않습니다. IPv6 룰셋과 같이 이름이 중복되는 경우, 뒤에 -6을 붙여서 (LAN-DMZ-6과 같이) 혼동을 피하도록 하였습니다. 이러한 방식은 자동 완성과 유일성을 보장합니다.

본 예제에서는 4개의 zone이 있습니다:

  • LAN
  • WAN
  • DMZ
  • Local

Note: 로컬 zone은 방화벽입니다.

독자의 컴퓨터가 LAN에 연결되어 있고 EdgeOS box로 연결이 SSH로 이루어 진다면, LAN-Local 룰셋이 필요합니다. 웹 페이지에서 EdgeOS box로 접근하고자 한다면, Local-LAN 룰셋이 필요합니다.

룰의 이름을 의미있게 명명하도록 하는 것이 좋습니다. 룰의 수가 증가할 수록 이름으로 그 의미를 파악해야하기 때문입니다.

Rule 1 - State Established, Related
Rule 2 - State Invalid
Rule 100 - ICMP
Rule 200 - Web
Rule 300 - FTP
Rule 400 - NTP
Rule 500 - SMTP
Rule 600 - DNS
Rule 700 - DHCP
Rule 800 - SSH
Rule 900 - IMAPS
default-action drop
enable-default-log

기본 액션과 로깅

Zone과 룰셋은 모두 기본 액션을 포함하고 있습니다. Zone 정책을 사용할 때에는 기본 액션은 룰 10000으로 표현됩니다.

모든 트래픽을 로그에 남기는 것은 좋은 습관입니다. 연결 이슈를 처리하는 트러블 슈팅 과정에서 많은 도움을 받을 수 있습니다. enable-default-log 옵션은 기본 행위 트래픽 로그를 남길 수 있게 합니다.

기본값으로, iptables는 생성된 세션의 트래픽도 허용하지 않으므로 명시적으로 허용하도록 설정해야 합니다. Rule 1은 현재 연결된 세션과 관련있는 패킷을 처리하고, Rule 2는 유효하지 않은 상태의 패킷을 버리고, 로깅합니다. 네트워크의 가장 많은 트래픽을 담당하는 것이 현재 연결된 세션에 대한 트래픽이기 때문에 연결된 세션과 관련있는 패킷을 처리하는 룰이 Rule1으로 명명되었습니다. 유효하지 않은 패킷을 처리하는 rule은 유효하지 않은 상태의 패킷을 의도하지 않은 rule에 의해 처리되는 것을 방지하기 위함입니다. 가장 많은 트래픽을 유발하는 룰을 가장 상단에 위치시키는 방법은 볼륨이 큰 환경에서 CPU 부하를 적게 할 수 있습니다.

Important Note:* 이제 막 생성된 세션 대신, 모든 세션의 인바운드와 아웃바운드 패킷을 모두 로깅을 남기는 것을 원치는 않을 것입니다. 모든 행위를 기록할 경우 짧은 시간에 로그의 크기가 매우 커질 위험이 있습니다.*
EdgeOS에서는 반드시 zone에 할당하기 이전에 인터페이스를 생성해야만 합니다. 그리고 zone 정책에 룰셋을 만들어서 적용해야만 합니다.
  1. 인터페이스를 생성하고 설정한다.
  2. 각 zone 페어 디렉션 단위로 룰셋을 생성한다. 각 룰셋은 적어도 3개 이상의 상태 룰을 포함해야 한다.
  3. zone 정책을 설정한다.

Zone은 기본 행위로 패킷을 허용하지 않습니다. 기본 액션은 패킷을 버리거나 거절합니다. 이 기본 액션을 잘 기억하여, zone에 인터페이스를 할당하고 커밋하였으 때 커넥션이 거절되지 않도록 유의하세요. 특히:

  • EdgeOS로 SSH 연결을 하려는 경우
  • 로컬이나 zone에 연결을 하고자 하는 경우
  • SSH와 연결된 세션에 대한 룰이 존재하지 않는 경우
위와 같은 경우 커넥션을 생성할 수 없습니다.
다음 룰은 (완벽하지 않은) 예제입니다. IPv4, IPv6 모두 사용하며, 특정 IP가 명시되어 있지 않은 경우, 출발지/목적이 주소가 분명하지 않은 경우입니다.
  1. WAN – DMZ:192.168.200.200 – tcp/80
  2. WAN – DMZ:192.168.200.200 – tcp/443
  3. WAN – DMZ:192.168.200.200 – tcp/25
  4. WAN – DMZ:192.168.200.200 – tcp/53
  5. WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/80
  6. WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/443
  7. WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/25
  8. WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/53
  9. DMZ - Local - tcp/53
  10. DMZ - Local - tcp/123
  11. DMZ - Local - udp/67,68
  12. LAN - Local - tcp/53
  13. LAN - Local - tcp/123
  14. LAN - Local - udp/67,68
  15. LAN:192.168.100.10 - Local - tcp/22
  16. LAN:2001:0DB8:0:AAAA::10 - Local - tcp/22
  17. LAN - WAN - tcp/80
  18. LAN - WAN - tcp/443
  19. LAN - WAN - tcp/22
  20. LAN - WAN - tcp/20,21
  21. DMZ - WAN - tcp/80
  22. DMZ - WAN - tcp/443
  23. DMZ - WAN - tcp/22
  24. DMZ - WAN - tcp/20,21
  25. DMZ - WAN - tcp/53
  26. DMZ - WAN - udp/53
  27. Local - WAN - tcp/80
  28. Local - WAN - tcp/443
  29. Local - WAN - tcp/20,21
  30. Local - WAN - tcp/53
  31. Local - WAN - udp/53
  32. Local - WAN - udp/123
  33. Local - DMZ - tcp/25
  34. Local - DMZ - tcp/67,68
  35. Local - DMZ - tcp/53
  36. Local - DMZ - udp/53
  37. Local - LAN - tcp/67,68
  38. LAN - DMZ - tcp/80
  39. LAN - DMZ - tcp/443
  40. LAN - DMZ - tcp/993
  41. LAN:2001:0DB8:0:AAAA::10 - DMZ:2001:0DB8:0:BBBB::200 - tcp/22
  42. LAN:192.168.100.10 - DMZ:192.168.200.200 - tcp/22

Zone 룰셋

4개의 zone이 존재하므로, 다음의 룰셋을 설정해야합니다:

  1. LAN-WAN
  2. LAN-Local
  3. LAN-DMZ
  4. WAN-LAN
  5. WAN-Local
  6. WAN-DMZ
  7. Local-LAN
  8. Local-WAN
  9. Local-DMZ
  10. DMZ-LAN
  11. DMZ-WAN
  12. DMZ-Local
2개의 zone이 결코 통신하는 경우가 없다고 하여도 zone 페어 디렉션 룰셋을 생성하고 로깅을 하는 것은 좋은 습관입니다. 이와 같은 룰셋으로 의도치 않은 접근을 파악할 수 있습니다.
아래의 설정은 액션, 로그 2개의 기본 설정 예제입니다.
name wan-lan {
 default-action drop
 enable-default-log
 rule 1 {
 action accept
 state {
 established enable
 related enable
 }
 }
 rule 2 {
 action drop
 log enable
 state {
 invalid enable
 }
 }
}

아래는 IPv6 DMZ-WAN의 룰셋 설정입니다.

ipv6-name dmz-wan-6 {
 default-action drop
 enable-default-log
 rule 1 {
 action accept
 state {
 established enable
 related enable
 }
 }
 rule 2 {
 action drop
 log enable
 state {
 invalid enable
 }
 rule 100 {
 action accept
 log enable
 protocol ipv6-icmp
 }
 rule 200 {
 action accept
 destination {
 port 80,443
 }
 log enable
 protocol tcp
 }
 rule 300 {
 action accept
 destination {
 port 20,21
 }
 log enable
 protocol tcp
 }
 rule 500 {
 action accept
 destination {
 port 25
 }
 log enable
 protocol tcp
 source {
 address 2001:db8:0:BBBB::200
 }
 }
 rule 600 {
 action accept
 destination {
 port 53
 }
 log enable
 protocol tcp_udp
 source {
 address 2001:db8:0:BBBB::200
 }
 }
 rule 800 {
 action accept
 destination {
 port 22
 }
 log enable
 protocol tcp
 }
}

Zone 정책 생성

룰셋을 생성하고 난 이후에는 zone 정책을 생성해야합니다.
각 zone에 인터페이스와 기본 액션을 세팅합니다.
set zone-policy zone dmz default-action drop
set zone-policy zone dmz interface eth0.30

위의 설정은 LAN에서 DMZ로 향하는 트래픽에 대한 IPv6 룰셋을 세팅하는 경우입니다. zone 정책 방화벽의 문법은 조금 난해하지만, 거꾸로 생각하면 매우 직관적입니다.

set zone-policy zone dmz from lan firewall ipv6-name lan-dmz-6

DMZ-LAN 정책은 LAN-DMZ zone 디렉션을 의미합니다. 처음 생성할 때 이 흐름에 익숙해지도록 노력하세요.
모든 설정을 하고 난 이후에는 ZonesExampleConfigBoot 와 같은 설정을 얻게 될 것입니다. 방화벽, 인터페이스, zone 정책을 제외한 모든 부분을 설정하였습니다.

Note:해당 예제는 완성본이 아닙니다.

IPv6 터널

HE.net이나 어떤 곳에서 IPv6 터널을 사용하고자 하는 경우, 2개의 WAN 인터페이스와 IPv4, IPv6 인터페이스를 통해서 설정을 한다는 점을 제외하고는 동일합니다.
이전의 4개가 아닌 5개의 zone이 존재합니다. 추가로 터널 인터페이스와 LAN, DMZ zone의 IPv6 인터페이스의 룰셋이 필요합니다.
LAN, WAN, DMZ, Local, TUN (tunnel) IPv6 쌍은 다음과 같습니다:
  1. LAN-TUN
  2. LAN-Local
  3. LAN-DMZ
  4. TUN-LAN
  5. TUN-Local
  6. TUN-DMZ
  7. Local-LAN
  8. Local-TUN
  9. Local-DMZ
  10. DMZ-LAN
  11. DMZ-TUN
  12. DMZ-Local

Note:WAN은 IPv6 속성을 가지고 있지 않기 때문에 WAN과 관련된 정책은 존재하지 않습니다.


프로토콜 41을 사용하기 위해서는 WAN-Local의 몇개의 룰을 추가해야 합니다.
예제 설정:
rule 400 {
 action accept
 destination {
 address 172.16.10.1
 }
 log enable
 protocol 41
 source {
 address ip.of.tunnel.broker
 }
}

Note: UPNP2 서비스가 활성화되면 zone 기반 방화벽이 동작합니다.