UnixPower on Networking
  http://www.unix-power.net/

 
 Top - Solaris8 - FreeBSD ALTQ



ALTQは長氏が実装したBSD系UNIXのネットワークインターフェースでのキュー制御に関連する一連の機構です。ALTQではさまざまなキューイングの方式(FIFOQ、CBQ、PRIQ、WFQ、HFSC)が利用でき、バッファ管理方式もいくつかの実装がなされています。今回はものはためしということで比較的よく利用されるキューイング方式であるCBQを、キューバッファ管理方式としてREDを採用します。このCBQ & REDの組み合わせは他でもしばしば利用されており加えて通常の帯域制御ならば、この組み合わせで十分という理由でもあります。


CBQとはClass Based Queueingつまりクラスごとに基づいたキュー制御方式のことです。CBQを用いると階層的に構築されたクラスを利用してある回線の帯域を分割したり共有したりすることができます。この階層的に構築されたクラスそれぞれがキューを持ちクラスごとに帯域を割り当てれるような構造になっています。


REDはRandom Early Detectionの略であり平均的なキュー長に基づいてパケットを捨てたりパケットに統計的マークをつける暗黙の輻輳通知機構として動作します。REDは単独のバッファ管理機構としてみることもできるし他のパケットスケジュール機構に統合されたものとして利用すること可能です。


ALTQを利用するために、まずOSをALTQ対応にしてあげないといけません。ここではFreeBSD4.11を前提としています。以下のソフトをダウンロードしinstallします。


●kame-20050207-freebsd411-snap.tgz
ftp://ftp.kame.net/pub/kame/snap/

# mv kame-20050207-freebsd411-snap.tgz /usr/local/src
# cd /usr/local/src
# tar xvzf kame-20050207-freebsd411-snap.tgz
# cd kame
# make TARGET=freebsd4 prepare


カーネル再構築を行います。


# cd freebsd4/sys/i386/conf
# cp GENERIC.KAME ALTQ
# vi ALTQ


私のカーネルコンフィグは以下のようになっています。


#
# KAME NOTE: kernel compilation may fail if you enable any of items that are
# commented out. (to be improved in the future, but do it on your own risk.
# report results to snap-users@kame.net)
#

#
# GENERIC -- Generic kernel configuration file for FreeBSD/i386
#
# For more information on this file, please read the handbook section on
# Kernel Configuration Files:
#
#    http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.246.2.62.2.1 2005/01/14 03:07:39 scottl Exp $

machine         i386
cpu             I686_CPU
ident           ALTQ
maxusers        256

makeoptions     DEBUG=-g                #Build kernel with gdb(1) debug symbols
options         DDB

options         MATH_EMULATE            #Support for x87 emulation
options         INET                    #InterNETworking
options         INET6                   #IPv6 communications protocols
options         FFS                     #Berkeley Fast Filesystem
options         FFS_ROOT                #FFS usable as root device [keep this!]
options         SOFTUPDATES             #Enable FFS soft updates support
options         UFS_DIRHASH             #Improve performance on big directories
options         MFS                     #Memory Filesystem
options         MD_ROOT                 #MD is a potential root device
#options        NFS                     #Network Filesystem
#options        NFS_ROOT                #NFS usable as root device, NFS required
#options        MSDOSFS                 #MSDOS Filesystem
options         CD9660                  #ISO 9660 Filesystem
options         CD9660_ROOT             #CD-ROM usable as root, CD9660 required
options         PROCFS                  #Process filesystem
options         COMPAT_43               #Compatible with BSD 4.3 [KEEP THIS!]
options         SCSI_DELAY=15000        #Delay (in ms) before probing SCSI
options         UCONSOLE                #Allow users to grab the console
options         USERCONFIG              #boot -c editor
options         VISUAL_USERCONFIG       #visual boot -c editor
options         KTRACE                  #ktrace(1) support
options         SYSVSHM                 #SYSV-style shared memory
options         SYSVMSG                 #SYSV-style message queues
options         SYSVSEM                 #SYSV-style semaphores
options         P1003_1B                #Posix P1003_1B real-time extensions
options         _KPOSIX_PRIORITY_SCHEDULING
options         ICMP_BANDLIM            #Rate limit bad replies
options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options         AHC_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~128k to driver.
options         AHD_REG_PRETTY_PRINT    # Print register bitfields in debug 
                                        # output.  Adds ~215k to driver.

options         NMBCLUSTERS=65536
options         MAXFILES=65535

options         DUMMYNET
options         BRIDGE
options         IPFIREWALL              #firewall
options         IPFIREWALL_VERBOSE      #print information about
                                        # dropped packets
options         IPFIREWALL_FORWARD      #enable transparent proxy support
options         IPFIREWALL_VERBOSE_LIMIT=100 #limit verbosity
options         IPFIREWALL_DEFAULT_TO_ACCEPT #allow everything by default
options         IPDIVERT                #divert sockets
options         TCP_DROP_SYNFIN

# To make an SMP kernel, the next two are needed
#options        SMP                     # Symmetric MultiProcessor Kernel
#options        APIC_IO                 # Symmetric (APIC) I/O

device          isa
device          eisa
device          pci

# Floppy drives
device          fdc0    at isa? port IO_FD1 irq 6 drq 2
device          fd0     at fdc0 drive 0
device          fd1     at fdc0 drive 1
#
# If you have a Toshiba Libretto with its Y-E Data PCMCIA floppy,
# don't use the above line for fdc0 but the following one:
#device         fdc0

# ATA and ATAPI devices
device          ata0    at isa? port IO_WD1 irq 14
device          ata1    at isa? port IO_WD2 irq 15
device          ata
device          atadisk                 # ATA disk drives
device          atapicd                 # ATAPI CDROM drives
#device         atapifd                 # ATAPI floppy drives
#device         atapist                 # ATAPI tape drives
options         ATA_STATIC_ID           #Static device numbering

# SCSI Controllers
#device         ahb             # EISA AHA1742 family
#device         ahc             # AHA2940 and onboard AIC7xxx devices
#device         ahd             # AHA39320/29320 and onboard AIC79xx devices
#device         amd             # AMD 53C974 (Tekram DC-390(T))
#device         isp             # Qlogic family
#device         mpt             # LSI-Logic MPT/Fusion
#device         ncr             # NCR/Symbios Logic
#device         sym             # NCR/Symbios Logic (newer chipsets)
#options        SYM_SETUP_LP_PROBE_MAP=0x40
                                # Allow ncr to attach legacy NCR devices when 
                                # both sym and ncr are configured

#device         adv0    at isa?
#device         adw
#device         bt0     at isa?
#device         aha0    at isa?
#device         aic0    at isa?

#device         ncv             # NCR 53C500
#device         nsp             # Workbit Ninja SCSI-3
#device         stg             # TMC 18C30/18C50

# SCSI peripherals
#device         scbus           # SCSI bus (required)
#device         da              # Direct Access (disks)
#device         sa              # Sequential Access (tape etc)
#device         cd              # CD
#device         pass            # Passthrough device (direct SCSI access)

# RAID controllers interfaced to the SCSI subsystem
#device         asr             # DPT SmartRAID V, VI and Adaptec SCSI RAID
#device         dpt             # DPT Smartcache - See LINT for options!
#device         iir             # Intel Integrated RAID
#device         mly             # Mylex AcceleRAID/eXtremeRAID
#device         ciss            # Compaq SmartRAID 5* series
#device         twa             # 3ware 9000 series PATA/SATA RAID

# RAID controllers
#device         aac             # Adaptec FSA RAID, Dell PERC2/PERC3
#device         aacp            # SCSI passthrough for aac (requires CAM)
#device         ida             # Compaq Smart RAID
#device         ips             # IBM/Adaptec ServeRAID
#device         amr             # AMI MegaRAID
#device         mlx             # Mylex DAC960 family
#device         pst             # Promise Supertrak SX6000
#device         twe             # 3ware Escalade

# atkbdc0 controls both the keyboard and the PS/2 mouse
device          atkbdc0 at isa? port IO_KBD
device          atkbd0  at atkbdc? irq 1 flags 0x1
device          psm0    at atkbdc? irq 12

device          vga0    at isa?

# splash screen/screen saver
pseudo-device   splash

# syscons is the default console driver, resembling an SCO console
device          sc0     at isa? flags 0x100

# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
#device         vt0     at isa?
#options        XSERVER                 # support for X server on a vt console
#options        FAT_CURSOR              # start with block cursor
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
#options        PCVT_SCANSET=2          # IBM keyboards are non-std

device          agp             # support several AGP chipsets

# Floating point support - do not disable.
device          npx0    at nexus? port IO_NPX irq 13

# Power management support (see LINT for more options)
#device         apm0    at nexus? disable flags 0x20 # Advanced Power Management

# PCCARD (PCMCIA) support
#device         card
#device         pcic0   at isa? irq 0 port 0x3e0 iomem 0xd0000
#device         pcic1   at isa? irq 0 port 0x3e2 iomem 0xd4000 disable

# Serial (COM) ports
#device         sio0    at isa? port IO_COM1 flags 0x80 irq 4
#device         sio1    at isa? port IO_COM2 irq 3
#device         sio2    at isa? disable port IO_COM3 irq 5
#device         sio3    at isa? disable port IO_COM4 irq 9

# Parallel port
#device         ppc0    at isa? irq 7
#device         ppbus           # Parallel port bus (required)
#device         lpt             # Printer
#device         plip            # TCP/IP over parallel
#device         ppi             # Parallel port interface device
#device         vpo             # Requires scbus and da


# PCI Ethernet NICs.
#device         de              # DEC/Intel DC21x4x (``Tulip'')
#device         em              # Intel PRO/1000 adapter Gigabit Ethernet Card (``Wiseman'')
#device         txp             # 3Com 3cR990 (``Typhoon'')
#device         vx              # 3Com 3c590, 3c595 (``Vortex'')

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device          miibus          # MII bus support
#device         dc              # DEC/Intel 21143 and various workalikes
device          fxp             # Intel EtherExpress PRO/100B (82557, 82558)
#device         pcn             # AMD Am79C97x PCI 10/100 NICs
#device         rl              # RealTek 8129/8139
#device         sf              # Adaptec AIC-6915 (``Starfire'')
#device         sis             # Silicon Integrated Systems SiS 900/SiS 7016
#device         ste             # Sundance ST201 (D-Link DFE-550TX)
#device         tl              # Texas Instruments ThunderLAN
#device         tx              # SMC EtherPower II (83c170 ``EPIC'')
#device         vr              # VIA Rhine, Rhine II
#device         wb              # Winbond W89C840F
#device         xl              # 3Com 3c90x (``Boomerang'', ``Cyclone'')
#device         bge             # Broadcom BCM570x (``Tigon III'')

# ISA Ethernet NICs.
# 'device ed' requires 'device miibus'
#device         ed0     at isa? disable port 0x280 irq 10 iomem 0xd8000
#device         ex
#device         ep
#device         fe0     at isa? disable port 0x300
# Xircom Ethernet
#device         xe
# PRISM I IEEE 802.11b wireless NIC.
#device         awi
# WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
# exists only as a PCMCIA device, so there is no ISA attachment needed
# and resources will always be dynamically assigned by the pccard code.
#device         wi
# Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
# work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
# mode (the factory default). If you set the switches on your ISA
# card for a manually chosen I/O address and IRQ, you must specify
# those parameters here.
#device         an
# The probe order of these is presently determined by i386/isa/isa_compat.c.
#device         ie0     at isa? disable port 0x300 irq 10 iomem 0xd0000
#device         le0     at isa? disable port 0x300 irq 5 iomem 0xd0000
#device         lnc0    at isa? disable port 0x280 irq 10 drq 0
#device         cs0     at isa? disable port 0x300
#device         sn0     at isa? disable port 0x300 irq 10

# Pseudo devices - the number indicates how many units to allocate.
pseudo-device   loop            # Network loopback
pseudo-device   ether           # Ethernet support
#pseudo-device  sl      1       # Kernel SLIP
#pseudo-device  ppp     1       # Kernel PPP
#pseudo-device  tun             # Packet tunnel.
pseudo-device   pty             # Pseudo-ttys (telnet etc)
pseudo-device   md              # Memory "disks"
#pseudo-device  gif             # IPv6 and IPv4 tunneling
#pseudo-device  faith   1       # IPv6-to-IPv4 relaying (translation)

# The `bpf' pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device   bpf             #Berkeley packet filter

# USB support
#device         uhci            # UHCI PCI->USB interface
#device         ohci            # OHCI PCI->USB interface
#device         usb             # USB Bus (required)
#device         ugen            # Generic
#device         uhid            # "Human Interface Devices"
#device         ukbd            # Keyboard
#device         ulpt            # Printer
#device         umass           # Disks/Mass storage - Requires scbus and da
#device         ums             # Mouse
#device         uscanner        # Scanners
#device         urio            # Diamond Rio MP3 Player
# USB Ethernet, requires mii
#device         aue             # ADMtek USB ethernet
#device         axe             # ASIX Electronics USB ethernet
#device         cue             # CATC USB ethernet
#device         kue             # Kawasaki LSI USB ethernet

# FireWire support
#device         firewire        # FireWire bus code
#device         sbp             # SCSI over FireWire (Requires scbus and da)
#device         fwe             # Ethernet over FireWire (non-standard!)
# Serial adapters
#device         ucom            # Modem and com serial port (generic)
#device         uplcom          # I/O DATA USB-RSAQ2 serial adapter
#device         uvscom          # SUNTAC serial adapter


# KAME extensions
#

#options        IPSEC                   #IP security
#options        IPSEC_ESP               #IP security (crypto; define w/ IPSEC)
#options        IPSEC_DEBUG             #debug for IP security
#options        NATM                    #native mode ATM
#options        ENABLE_DEFAULT_SCOPE

#options        ND6_DEBUG       # net.inet6.icmp6.nd6_debug=1 by default

options         NEW_STRUCT_ROUTE        # mandatory

#options        RADIX_MPATH     # equal cost multipath

#options        SCTP            # adds SCTP stack to kernel - requires INET6
#options        SCTP_DEBUG      # adds debugging support for SCTP
#options        SCTP_TCP_MODEL_SUPPORT  # adds TCP model support
#options        SCTP_USE_ADLER32        # use obsolete Adler32 checksum,

# Router Preference on host side
#options        RTPREF

# IPv6 firewall
#options        "IPV6FIREWALL"
#options        "IPV6FIREWALL_VERBOSE"
#options        "IPV6FIREWALL_DEFAULT_TO_ACCEPT"

# RANDOM_IP_ID is needed to support pf
#options        RANDOM_IP_ID

# ALTQ
options         ALTQ            #alternate queueing
options         ALTQ_CBQ        #class based queueing
options         ALTQ_WFQ        #weighted fair queueing
options         ALTQ_FIFOQ      #fifo queueing
options         ALTQ_RED        #random early detection
options         ALTQ_FLOWVALVE  #flowvalve for RED (needs RED)
options         ALTQ_RIO        #triple red for diffserv (needs RED)
options         ALTQ_LOCALQ     #local use
options         ALTQ_HFSC       #hierarchical fair service curve
options         ALTQ_JOBS       #joint buffer management and scheduling
options         ALTQ_IPSEC      #check ipsec in IPv4
options         ALTQ_CDNR       #diffserv traffic conditioner
options         ALTQ_BLUE       #blue by wu-chang feng
options         ALTQ_PRIQ       #priority queue
options         ALTQ_NOPCC      #don't use processor cycle counter
options         ALTQ_DEBUG      #for debugging
# you might want to set kernel timer to 1kHz if you use CBQ,
# especially with 100baseT
#options        HZ=1000

options         TCP_ECN         # ECN support in TCP

# Network Address Translation - Protocol Translation (NAT-PT)
#options        NATPT           # IPv6 -> IPv4 translation.
#options        NATPT_NAT       # IPv4 -> IPv4 NAT.
                                # Valid only when "options NATPT" is defined.

# Source-Specific Multicast (SSM)
#options        IGMPV3          # IPv4
#options        MLDV2           # IPv6

#pseudo-device  atm
#pseudo-device  dummy   1
#pseudo-device  stf
#pseudo-device  ist     1

# Mobile IPv6
#options        MIP6                    # required for all node types
#pseudo-device  mip     1               # required for a mobile node
#options        MIP6_DEBUG

pseudo-device   pf
pseudo-device   pflog
#pseudo-device  pfsyncY
#pseudo-device  altq

# Datagram Congestion Control Protocol
options         DCCP
#options        DCCP_TFRC


実際にコンパイルし、インストールします。


# config ALTQ
# cd ../../compile/ALTQ
# make depend;make
# make install
# reboot


後はUser LANDをインストールします


# cd /usr/local/src/kame/freebsd4
# make includes
# make install-includes
# make
# make install


これで/usr/local/v6が作られALTQを含んだコマンドがガサっとインストールされます。そしてALTQデバイスを作成します。


# cd /usr/local/src/kame/kame/kame/etc
# sh MAKEDEV.altq all


以上で下準備は完了です。これからALTQの設定に入ります。


ALTQを利用するためにはポリシーを設定する必要があるためkernelの設定だけでは不十分です。ポリシーは人間が決めるの物である以上自動で処理できるものではありません。下の図をもとに以下のポリシーをRouter1に設定します。


  1. InternetとRouter、およびその内側のICMPパケットを64Kbpsに絞る
  2. InternetとServer1の間のhttp通信を回線帯域の50%に絞る
  3. InternetとServer3のssh通信に最低64Kの帯域を確保する


いずれも内側から外側へ、の方向で制御をかけます。上記実際に3つポリシーを設定してみます。設定ファイルの基本としては/etc/altq.confが参照されます。


●interface文


まず最初にInterface文を記述します。構文は以下のようになります。


interface インターフェース名 [bandwidth 帯域幅] [制御方式]


基本的な構文の書き方は上記のようになります。他にも細かなオプションを設定することが可能なようですが、ここではそれは行いません。これを実際上記の構成にあてはめると以下のようになります(CBQベース)。


interface fxp0 bandwidth 100M cbq


●class文


class文もinterface制御方式によって変化しますが、ここではCBQをベースに考えます。基本的な構文は以下のようになります。


class 制御方式 インターフェース名 クラス名 親クラス名
 [priority 優先度] [pbandwidth 帯域%]
 [exactbandwidth 保証帯域] [borrow] [default] [red]


インターフェース名はその名のとおり。クラス名は定義したクラスの名前であり親クラス名は、そのクラスが所属している親クラスの名前です。もし親クラスが存在しないのであれば明示的にNULLと指定してあげる必要があります。


priorityキーワードはクラスの優先度を決定します。指定しない場合は優先度が1に設定され値が大きくなるほど優先度が高くなり最大値は7までになっています。特に設定しなければ全てのクラスは平等に扱われます。


pbandwidthキーワードはinterface文で設定した帯域に対する%を設定することにより決定するためのキーワードです。したがってpbandwidth 100と設定すればinterface文で指定した帯域全てを意味することになります。


exactbandwidthキーワードはそのクラスに割り当てる帯域を記載するためのもの。pbandwidthとexactbandwithは帯域を指定という意味で同じようなキーワードなので同時使用するべきものではありません。


borrowキーワードをしようすると、そのクラスは帯域が足りなくなった場合に自信の所属する親クラスからあまっている帯域を借りうけることができます。帯域保証と同時に帯域制御を行おうとする場合はこれは使用すべきではありません。


defautキーワードは他のクラスに割り当てられなかった全てのパケットがdefaultで設定されているクラスに割り当てられます。


redキーワードは指定されたクラスにおけるバッファの管理にredを使用する場合に設定します。


これを実際の上記のポリシーにそって書いてみると以下のようになります。


# 親クラスの定義
class cbq fxp0 root NULL priority 0 pbandwidth 100
class cbq fxp0 def_class root pbandwidth 95 default

# ポリシー1
class cbq fxp0 icmp_class def_class exactbandwidth 64K red

# ポリシー2
class cbq fxp0 http_class def_class pbandwidth 50 red

# ポリシー3
class cbq fxp0 ssh_class def_class exactbandwidth 64K borrow


●filter文


filter文の基本構成は以下のようになります。


filter インターフェース名 クラス名 [name フィルタ名] [ruleno 番号]
 dst_addr [netmask mask] dport
  src_addr [netmask mask] sport
  proto 


nameキーワードはその設定を見直す際に利用するフィルタの名前です。またrulenoは同一のクラスに適用する複数のフィルタがある場合の解釈の順序を記載します。


src_addr,dst_addr,netmaskはそれぞれの発信元アドレス、受信者アドレス、ネットマスクを記載します。またsport,dportは発信元ポート、受信先ポートを指定します。いずれも0を指定すると任意という意味になります。またnetmaskは16進表記でないといけません。


protoはプロトコル番号を記載します。たとえばICMPなら1、TCPなら6、UDPなら17になります。詳しくは/etc/protocolsを参照すれば良いと思います。

これを実際の上記のポリシーにそって書いてみると以下のようになります。


# ポリシー1
filter fxp0 icmp_class 0 0 Router netmask 0xffffffff 0 1

# ポリシー2
filter fxp0 http_class 0 0 Server1 netmask 0xffffffff 80 6

# ポリシー3
filter fxp0 ssh_class 0 0 Server3 netmask 0xffffffff 22 6


以上、3つの文をまとめてひとつにしたのが/etc/altq.confになります。ファイルの中身は以下のようになります。


interface fxp0 bandwidth 100M cbq

class cbq fxp0 root NULL priority 0 pbandwidth 100
class cbq fxp0 def_class root pbandwidth 95 default

# ポリシー1
class cbq fxp0 icmp_class def_class exactbandwidth 64K red
filter fxp0 icmp_class 0 0 Router netmask 0xffffffff 0 1

# ポリシー2
class cbq fxp0 http_class def_class pbandwidth 50 red
filter fxp0 http_class 0 0 Server1 netmask 0xffffffff 80 6

# ポリシー3
class cbq fxp0 ssh_class def_class exactbandwidth 64K borrow
filter fxp0 ssh_class 0 0 Server3 netmask 0xffffffff 22 6



 
 Copyright(C) 2003-2015 UnixPower on Networking All rights reserved.