This is an old revision of the document!
Правила для фильтрации:
Действия которые можем применять:
FlowSpec правила определяются в routing-options flowspec и применяются для всего джунипера.
set routing-options flowroute block-10.131.1.1 match destination 10.131.1.1/32 set routing-options flow route block-10.131.1.1 match protocol icmp set routing-options flow route block-10.131.1.1 match icmp-type echo-request set routing-options flow route block-10.131.1.1 then discard set routing-options flow term-order standard
Если мы хотим чтобы правила фильтрации не применялись на нашем оборудовании нужно добавить:
firewall-install-disable
Для пира которому мы хотим анонсировать FlowSpec нужно добавить в BGP сессию flow
set protocol bgp group TestFlowBgp neighbor 111.222.333.444 family inet unicast set protocol bgp group TestFlowBgp neighbor 111.222.333.444 family inet flow
Проверить список правил которые мы добавили в FlowSpec
show route table inetflow.0 detail
Посмотреть нагрузку на FPC картах
show system resource-monitor fpc
set-flow-routes.py
# $Id$
# Simple Python script using YAML and Junos PyEz
# to configure local flow routes as per template
from jnpr.junos.utils.config import Configfrom
jnpr.junos import Device
from pprint import pprint
from jnpr.junos.factory import loadyaml
from jnpr.junos.op import *
import yaml
import sys
from glob import glob
from jinja2 import Template
# YAML file.
with open(glob('set-flow-route.yml')[0]) as fh:
    data = yaml.load(fh.read())
# Jinja2 template file.
with open(glob('set-flow-route.j2')[0]) as t_fh:
    t_format = t_fh.read()
routesnippet = Template(t_format)
print (routesnippet.render(data))
Set-flow-routes.py (contd)
# Open netconf connection with RR dev = Device(host='r6', user='juniper', password='Clouds') dev.open() # Bind and lock configuration and load it dev.bind(cfg=Config) dev.cfg.lock() dev.cfg.load(template_path='set-flow-route.j2', template_vars=data, format='text', merge=True) # Commit and unlock dev.cfg.commit() dev.cfg.unlock() # Close netconf connection dev.close()
Set-flow-route.yml
--- # $Id$ # YAML file covering all possible variables # Name of flow route flow_route_name: foo2 # Destination prefix and mask in format: A.B.C.D/Z destination_address_and_mask: 198.51.100.1/32 # DSCP in decimal format dscp: # Destination port as alias or in decimal format destination_port: 53 # Fragment Junos OS knobs fragment: # ICMP code as alias or in decimal format icmp_code: # ICMP type as alias or in decimal format icmp_type:
Set-flow-route.yml (contd)
# Full L3 length in bytes packet_length: # Source or destination port as alias or in decimal format port: # Protocol as alias or in decimal format protocol: udp # Source prefix and mask in format: A.B.C.D/Z source_address_and_mask: # Source port as alias or in decimal format source_port: # TCP flags with Junos OS knobs tcp_flags: # Include 'accept' action accept: # Include existing community to be tagged action community_name: # Include 'discard' action discard: discard # Include 'next-term' action next_term: # Include policer name to be applied as action rate_limit: # Include existing RT community to select VRF for redirection redirect_RT: # Include 'sample' action sample:
set-flow-route.j2
# Flow-route configure via vRR
routing-options {
  flow {
    route {{flow_route_name}} {
      match {
        destination {{destination_address_and_mask}};
        {%-if destination_port is defined and destination_port !=None %}
        destination-port {{ destination_port }};
        {%-endif %}
        {%-if dscp is defined and dscp !=None %}
        dscp {{dscp}};
        {%-endif %}
        {%-if fragment is defined and fragment !=None %}
        fragment {{fragment}};
        {%-endif %}
        {%-if icmp_code is defined and icmp_code !=None %}
        icmp-code {{icmp_code}};
        {%-endif %}
        {%-if icmp_type is defined and icmp_type !=None %}
        icmp-type {{icmp_type}};
        {%-endif %}
        {%-if packet_length is defined and packet_length !=None %}
        packet-length {{packet_length}};
        {%-endif %}
        {%-if port is defined and port !=None %}
        port {{port}};
        {%-endif %}
        {%-if protocol is defined and protocol !=None %}
        protocol {{protocol}};
        {%-endif %}
        {%-if source_address_and_mask is defined and source_address_and_mask !=None %}
        source {{source_address_and_mask}};
        {%-endif %}
        {%-if source_port is defined and source_port !=None %}
        source-port {{source_port}};
        {%-endif %}
        {%-if tcp_flags is defined and tcp_flags !=None %}
        tcp-flags {{tcp_flags}};
        {%-endif %}
      }
    then {
      {%-if accept is defined and accept !=None %}
      {{accept}};
      {%-endif %}
      {%-if community_name is defined and community_name !=None %}
      community {{community_name}};
      {%-endif %}
      {%-if discard is defined and discard !=None %}
      {{discard}};
      {%-endif %}
      {%-if next_term is defined and next_term !=None %}
      {{next_term}};
      {%-endif %}
      {%-if rate_limit is defined and rate_limit !=None %}
      rate-limit {{rate_limit}};
      {%-endif %}
      {%-if redirect_RT is defined and redirect_RT !=None %}
      routing-instance {{redirect_RT}};
      {%-endif %}
      {%-if sample is defined and sample !=None %}
      {{sample}};
      {%-endif %}
    }
  }
}
}
9002:666 - традиционный blackhole для префикса, и 
9002:667 для фильтрации всего udp трафика 
9002:668 фильтрафия известных амплифаеров (source-port 19,53,123,161,1900)