Zone-Policy例子

本地IPv4和IPv6

我们有三个网络。

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

这个具体的例子是一个路由器在棍子上,但非常容易适应无论你有多少网卡:

  • 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

  • VyOS可作为DHCP、DNS转发器、NAT、路由器和防火墙。

  • 192.168.200.200/2001:0DB8:0:BBBB::200是内部/外部DNS、web和mail (SMTP/IMAP)服务器。

  • 192.168.100.10/2001:0DB8:0:AAAA::10为管理员控制台。它可以SSH到VyOS。

  • LAN和DMZ主机有基本的出站访问:Web、FTP、SSH。

  • LAN可以访问DMZ资源。

  • DMZ不能访问LAN资源。

  • 入站WAN连接到DMZ主机。

Network Topology Diagram

VyOS接口被分配了他们各自网络的。1/:1地址。WAN在VLAN 10上,LAN在VLAN 20上,DMZ在VLAN 30上。

它看起来是这样的:

interfaces {
    ethernet eth0 {
        duplex auto
        hw-id 00:53:ed:6e:2a:92
        smp_affinity auto
        speed auto
        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
        }
    }
    loopback lo {
    }
}

Zones Basics

每个接口都被分配到一个安全区域。接口可以是物理的,也可以是虚拟的,如隧道(VPN、PPTP、GRE等),并且被完全相同的对待。

从A区域到b区域的交通流就是我所说的区域对方向。如。A->B和B->A是两个区域对目的地。

规则集是根据每个区域对-方向创建的。

我将规则集命名为表示它们所代表的区域对方向。如。ZoneA-ZoneB或ZoneB-ZoneA。LAN-DMZ DMZ-LAN。

在VyOS中,必须有唯一的规则集名称。如果出现重叠,我将在v6规则集的末尾添加一个“-6”。如。LAN-DMZ LAN-DMZ-6。这允许每个自动完成和唯一性。

在本例中,我们有4个区域。LAN, WAN, DMZ, Local。本地区域是防火墙本身。

如果您的计算机在LAN上,并且您需要SSH到您的VyOS框中,那么您需要一条规则在LAN- local规则集中允许它。如果您想从VyOS框访问一个网页,您需要一条规则在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

前两条规则用于处理VyOS和iptables的特性。

区域和规则集都有一个默认的动作语句。使用zone-policy时,缺省动作由zone-policy语句设置,由规则10000表示。

记录接受和拒绝的流量是很好的做法。当您试图排除连接问题时,它可以为您节省大量的麻烦。

要将日志记录添加到默认规则,执行以下操作:

set firewall name <ruleSet> enable-default-log

默认情况下,iptables不允许已建立会话的流量返回,因此必须显式允许返回。为此,我向每个规则集添加了两条规则。1允许建立的和相关的状态包通过,规则2丢弃并记录无效的状态包。我们将已建立的/相关的规则放在顶部,因为网络上的绝大多数流量都已建立,而无效规则是为了防止无效状态包被错误地与其他规则匹配。在高容量环境中,先列出最匹配的规则可以减少CPU负载。注意:我已经提交了一个bug,将此添加为默认操作。

“需要注意的是,您不希望将日志记录添加到已建立的状态规则中,因为您将记录每个会话的入站和出站包,而不仅仅是会话的启动。你的日志在很短的时间内就会非常庞大。”

在VyOS中,在将接口应用到zone-policy之前,必须先创建接口,在将其应用到zone-policy之前,必须创建规则集。

我首先创建/配置接口。为每个区域对方向(zone-pair-direction)构建规则集,其中至少包括三种状态规则。然后设置zone- policy。

区域不允许默认的accept动作;要么放弃,要么拒绝。记住这一点非常重要,因为如果您将接口应用到一个区域并提交,任何活动的连接都将被删除。具体来说,如果您通过SSH进入VyOS,并添加本地或连接到某个区域的接口,并且没有允许SSH和已建立会话的规则集,那么您将无法连接。

下面是在IPv4和IPv6中为这个例子创建的规则(可能不完整)。如果没有指定IP地址,则不显示源/目的地址。

WAN – DMZ:192.168.200.200 – tcp/80
WAN – DMZ:192.168.200.200 – tcp/443
WAN – DMZ:192.168.200.200 – tcp/25
WAN – DMZ:192.168.200.200 – tcp/53
WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/80
WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/443
WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/25
WAN – DMZ:2001:0DB8:0:BBBB::200 – tcp/53

DMZ - Local - tcp/53
DMZ - Local - tcp/123
DMZ - Local - tcp/67,68

LAN - Local - tcp/53
LAN - Local - tcp/123
LAN - Local - tcp/67,68
LAN:192.168.100.10 - Local - tcp/22
LAN:2001:0DB8:0:AAAA::10 - Local - tcp/22

LAN - WAN - tcp/80
LAN - WAN - tcp/443
LAN - WAN - tcp/22
LAN - WAN - tcp/20,21

DMZ - WAN - tcp/80
DMZ - WAN - tcp/443
DMZ - WAN - tcp/22
DMZ - WAN - tcp/20,21
DMZ - WAN - tcp/53
DMZ - WAN - udp/53

Local - WAN - tcp/80
Local - WAN - tcp/443
Local - WAN - tcp/20,21

Local - DMZ - tcp/25
Local - DMZ - tcp/67,68
Local - DMZ - tcp/53
Local - DMZ - udp/53

Local - LAN - tcp/67,68

LAN - DMZ - tcp/80
LAN - DMZ - tcp/443
LAN - DMZ - tcp/993
LAN:2001:0DB8:0:AAAA::10 - DMZ:2001:0DB8:0:BBBB::200 - tcp/22
LAN:192.168.100.10 - DMZ:192.168.200.200 - tcp/22

因为我们有4个区域,所以需要设置以下规则集。

Lan-wan
Lan-local
Lan-dmz
Wan-lan
Wan-local
Wan-dmz
Local-lan
Local-wan
Local-dmz
Dmz-lan
Dmz-wan
Dmz-local

即使这两个区域永远不会通信,创建区域对-方向规则集并设置enable-default-log也是一个好主意。这将允许您记录访问网络的尝试。如果没有它,您将永远看不到连接尝试。

这是三个基本规则的一个例子。

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-policy。

首先为每个区域设置接口和缺省动作。

set zone-policy zone dmz default-action drop
set zone-policy zone dmz interface eth0.30

在本例中,我们正在设置v6规则集,该规则集表示来自LAN的、目的地为DMZ的流量。由于zone-policy防火墙的语法有点笨拙,所以我把它向后考虑,以保持它的清晰。

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

DMZ-LAN策略是LAN-DMZ。 一次堆砌一堆时,您会感到有节奏。

最后,您将获得类似此配置的内容。 我删除了防火墙,接口和区域策略部分中的所有内容。 它足够长了。

IPv6隧道

如果您使用的是来自HE.net或其他网站的IPv6隧道,则除了具有两个WAN接口外,其基础是相同的。 一个针对v4,另一个针对v6。

您将拥有5个区域而不是4个区域,并且可以在隧道接口与LAN / DMZ区域(而不是WAN)之间配置v6规则集。

LAN, WAN, DMZ, local and TUN (隧道)

v6对将是:

lan-tun
lan-local
lan-dmz
tun-lan
tun-local
tun-dmz
local-lan
local-tun
local-dmz
dmz-lan
dmz-tun
dmz-local

请注意,没有人会去WAN,因为WAN上没有v6地址。

您必须在wan-local规则集上添加几个规则,以允许使用协议41。

就像是:

rule 400 {
  action accept
  destination {
    address 172.16.10.1
  }
  log enable
  protocol 41
  source {
    address ip.of.tunnel.broker
  }
}