フェイルセーフデータノード

各ブロードバンド事業者は、ユーザーをインターネットに解放し、利用可能な料金プランに従ってネットワークの速度を適切に制限し、機器の故障または機器のシャットダウンに関連する作業の場合に備えて準備を整える方法について考えます。 これがどのように実装されているかを例を挙げて説明します(3000人以上のユーザーが私たちに接続しており、説明したオプションは非常にうまく機能します)





はじめに、次のものが与えられました。

1)1Uラックマウントサーバー(Intel Xeon E5335、1GB Ram、デュアルポートNIC Intel PRO / 1000 EB)、2つあります。 何のために-私は記事のテキストで伝えます

2)境界ルーター(私の場合、Juniper j4350、2個)

3)BGPまたはOSPFをサポートするL3スイッチ

4)タスクと同様に:A)インターネット上でユーザーを解放するためにこのすべての経済を持っている。

B)予備を作成します。これは、事故の場合に関係します

自動的かつ参加なし



エッジルーター(推奨事項)



エッジルーターをセットアップすることから始めましょう。

それは、FreeBSD / Linuxで有名なQuaggaパッケージを搭載したPCでも、何でもかまいません。また、シスコまたはジュニパーのメーカーの機器でもかまいません。 クアガまたはciscoベースのPCでエッジルーターを構成する方法インターネットに関する多くの記事と多くの詳細なドキュメントがあります(はい、quagi構成はcisco構成と同じです)。 ジュニパーに関する情報もありますが、それほど多くはありませんが、あります。 また、この記事のトピックは、エッジルーターとその上にBGPをセットアップすることではなく、他の何かについて少し説明しています。



私の場合、2台のジュニパーj4350が境界ルーターとして使用されています。ハードウェアはそれほど強力ではありませんが、現在のタスクと予算にぴったりです。

これらのルーターはそれぞれ独自のノード(異なる場所にあるノード)にインストールされ、それぞれに個別のアップリンクが接続されます。 bgpプロトコル経由のアップリンクから、フルビューを受け入れ、ネットワークをアナウンスします。 シェーパーの場合は、これに特別に割り当てられたvlan-eで、デフォルトルート(デフォルトルート)のみを内部bgpに渡します。

ジュニパーの場合、これらは構成内の行です。

protocols bgp

neighbor 195.xxx.xxx.226 { export [ default-originate reject ];



policy options

policy-statement default-originate {

from {

route-filter 0.0.0.0/0 exact;

}

then accept;

},

policy-statement reject {

then reject;

} , .








境界ルーターが構成され、それぞれがアップリンクから全景を取得し、ネットワークを提供します。 次に、内部bgp用にvlanを構成します。内部で、境界ルーター間のbgp通信を発生させて、それらの間でルートを交換します。 将来のシェーパー用にIPアドレスを選択しますが、NATに使用される外部IPアドレスのプール用に1つではなく複数にすることが望ましいです。 私の場合、各シェーパーには4つのアドレスがありますが、多かれ少なかれ可能です。 ネットワークのサイズと加入者の数に応じて。



FreeBSDでのシェーピングとNATのためのサーバーの構成



サーバーを箱から取り出して、最新の安定バージョンよりも優れたFreeBSDのインストールを開始します。 ポートとカーネルソースツリーに注意することを忘れずに、最小限の構成でFreeBSDをインストールすることが望ましいです(構成後に削除できます)。



FreeBSDのインストール後、ネットワークの構成を開始します。 /etc/resolv.confでDNSサーバーのアドレスを設定し、デフォルトルートとIPアドレスを/etc/rc.confファイルに書き込みます(bgpが存在するにもかかわらず、設定するクオガに問題がある場合、デフォルトルートは決して冗長ではありません)さらに)

------ / etc / rc.conf ----

defaultrouter="195.xxx.xxx.225" #

gateway_enable="YES" #

hostname="gw2.xxx.ru" #

# em0 – c bgp

ifconfig_em0="up"

ifconfig_em0="inet 195.xxx.xx.231 netmask 255.255.255.240" # IP

ifconfig_em0_alias0="inet 195.xxx.xxx.232 netmask 255.255.255.255" # IP.

ifconfig_em0_alias1="inet 195.xxx.xxx.233 netmask 255.255.255.255" #

ifconfig_em0_alias2="inet 195.xxx.xxx.234 netmask 255.255.255.255"

#em1 – , vlan l3

ifconfig_em1="up"

ifconfig_em1="inet 195.xxx.xxx.193 netmask 255.255.255.248"






-ネットワークが立ち上がり、Yandexがpingを実行しました。 次に、ポートツリーを更新します

ポートツリーは、portsnapまたはcsupを使用して更新できます。

この場合、portsnapを介して更新します。 これを行うには、次のコマンドを作成します。

portsnap fetch。これにより、完全なポートツリーが/ var / db / portsnapディレクトリにロードされます。

portsnap extract、このコマンドを使用して、新しいポートツリーを/ usr / portsディレクトリに展開します。



ポートを更新した後、独自のカーネルを構築することは理にかなっていますが、これは必須ではありませんが、ipfw、dummynet、pfにモジュールをロードでき、再構築されたカーネルのパフォーマンスは特に影響を受けません。 この場合、HZオプションのためにカーネルの再構成が必要です。これはタイマー間隔です。 デフォルトでは100です。これは高速にはあまり適していません。そのため、2000に変更します。



ディストリビューションカーネル設定を別のファイルにコピーします

cp / usr / src / sys / i386 / conf / GENERIC / usr / src / sys / i386 / conf / router-001

router-001ファイルをテキストエディター(vi、nano)で開き、編集を開始します。 必要に応じてカーネルを編集した後、次のパラメーターをカーネル構成に追加することを忘れないでください:



#ipfw firewall ,

options IPFIREWALL

options IPFIREWALL_VERBOSE

options IPFIREWALL_VERBOSE_LIMIT=100

options IPFIREWALL_FORWARD

options DUMMYNET

options HZ=2000



# pf, NAT- IP

device pf

device pflog

device pfsync








次に、make buildkernelおよびmake installkernelコマンドを使用して、カーネルをビルドおよびインストールします



カーネルを構築した後、ipfwファイアウォールの構成に進みます

/etc/rc.confファイルに次の行を追加します。

firewall_enable="YES"

pf_enable="YES"

pf_rules="/etc/pf.conf"







/etc/rc.firewallファイルを完全にクリアし、独自のルールの書き込みを開始します。複雑なものはないため、rc.firewallはipfwの起動時に起動する最も一般的なシェルスクリプトです



新しい/etc/rc.firewallに追加される行

#!/bin/sh ,



/sbin/ipfw -q flush

/sbin/ipfw -q pipe flush , dummynet

fwcmd="/sbin/ipfw -q" , ipfw . –q ,



WAN_IP = 195.xxx.xxx.231, IP

IBGP_NET = 195.xx.xx.224/xx

LAN_IP = 10.249.0.0/16 ,



${fwcmd} add 10 allow ip from any to any via lo0 ,

loopback e



${fwcmd} add 11 allow ip from me to me ,



${fwcmd} add 12 allow icmp from any to me, icmp



${fwcmd} add 20 allow tcp from table(1) to me dst-port 22 ,

ssh IP 1.

ipfw table 1 add <ip_address>



${fwcmd} add 21 deny tcp from any to me dst-port 22 , ssh.

, 1



${fwcmd} add 30 pipe tablearg ip from any to table(2) out via em1

${fwcmd} add 31 pipe tablearg ip from table(3) to any in via em1 , 2 3 . , (2 , 3 – ). ipfw table 2 add <ip > < > ipfw table 2 add <ip > < >



,

- ( nginx)

${fwcmd} add 38 fwd 127.0.0.1,3128 tcp $LAN_NET to not me dst-port 80

${fwcmd} add 39 allow tcp from any $LAN_NET src-port 80



${fwcmd} add 40 deny all from $LAN_NET to not me

${fwcmd} add 41 deny all from not me to $LAN_NET , . 2 3



${fwcmd} add 50 allow ip from me to any keep-state , .



${fwcmd} add 51 allow tcp from $IBGP_NET to $WAN_IP dst-port 179 , vlan BGP 179 (bgp )



${fwcmd} add 52 allow ospf from 195.xxx.xxx.192/29 to any , ospf

,

:

#Speed 15Mbps,

${fwcmd} pipe 1 config mask dst-ip 0xffffffff bw 16000Kbit/s

${fwcmd} pipe 101 config mask src-ip 0xffffffff bw 16000Kbit/s



#Speed 20Mbps,

${fwcmd} pipe 2 config mask dst-ip 0xffffffff bw 21000Kbit/s

${fwcmd} pipe 102 config mask src-ip 0xffffffff bw 21000Kbit/s



#Speed 3Mbps,

${fwcmd} pipe 3 config mask dst-ip 0xffffffff bw 3500Kbit/s

${fwcmd} pipe 103 config mask src-ip 0xffffffff bw 3500Kbit/s







いずれの場合も、これらの推奨事項に従って、すべてが自分自身のためにルールを設定します(パケットが最初にipfwの影響を受けることを忘れずに、次にpf処理に進みます)。 原則として、tableargを使用したくない場合は使用できません。 クライアントごとのパイプまたは関税用の個別のテーブルのオプションがまだあります。 機器の負荷が高い(クライアントごとのパイプ)と不便(関税表)のため、これらのオプションは考慮しません



図を完成させるには、pfを使用してNATを構成するだけです。

ファイル/etc/pf.confを作成し、次の行を入力します



WAN_IF = "em0"、これは内部bgpを使用したvlanの外部インターフェイスです。 NATを生成するのはその上にあります



LOCAL_NET = "10.249.0.0/16"、これはNATするローカルネットワークの範囲です



$ LOCAL_NETから$ WAN_IFにnat! $ LOCAL_NET->($ WAN_IF)ラウンドロビンスティッキーアドレス。これは、内部ネットワークから外部インターフェイスへのNATのルールです。

ラウンドロビンパラメーターは、プールアドレスを円で使用することを意味します。

sticky-addressパラメータは、同じ送信元アドレスが常にプールアドレスに割り当てられるようにするために使用されます。



今、quaggaパッケージの構成を開始しています

私の場合、彼からbgpサポートとospfサポートが必要です



Zebra.confは公開しません。すべてがシンプルで同じです。 インターフェースと静的ルートについて説明します。ここからの抜粋です。



nterface em0

ip address 195.xx.xxx.231/xxx

description ibgp

!

interface em1

ip address 195.xxx.xxx.193/29

description ospf

!

! Static routes.

!

ip route 10.0.0.0/8 Null0 254

ip route 79.142.80.132/30 195.xxx.xxx.238

ip route 94.124.180.57/30 195.xxx.xxx.225




nterface em0

ip address 195.xx.xxx.231/xxx

description ibgp

!

interface em1

ip address 195.xxx.xxx.193/29

description ospf

!

! Static routes.

!

ip route 10.0.0.0/8 Null0 254

ip route 79.142.80.132/30 195.xxx.xxx.238

ip route 94.124.180.57/30 195.xxx.xxx.225








bgp構成をこのようなものにします。 つまり、境界ルーターからのデフォルトルートを受け入れ、特定のルートを指定します



hostname gw2.xxx.ru

password rxxxx

enable password rxxxxx

log file /var/log/quagga/bgpd.log

!

router bgp 3333

bgp router-id 195.xxx.xxx.231

bgp log-neighbor-changes

network 195.xxx.xxx.192/29

neighbor 195.xxx.xxx.225 remote-as 3333

neighbor 195.xxx.xxx.225 description j4350-1

neighbor 195.xxx.xxx.225 next-hop-self

neighbor 195.xxx.xxx.238 remote-as 3333

neighbor 195.xxx.xxx.238 description j4350-2

neighbor 195.xxx.xxx.238 next-hop-self

!







次に、OSPFプロトコルを構成します(Dlink DGS-3612はCisco Catalyst 3560と並行してインストールされるため、私の場合に使用)。



Hostname gw2.xxx.ru

password xxx

enable password xxxx

log file /var/log/quagga/ospfd.log

!

interface em1

!

router ospf

ospf router-id 195.xxx.xxx.193

network 195.xxx.xxx.192/29 area 0.0.0.0

default-information originate metric 100

!

line vty








BGPを使用する方法を知っているスイッチがある場合は、OSPFの使用を拒否し、これらの目的でBGPプロトコルを使用することをお勧めします。 その場合、

bgpd.conf次の行を作成する必要があります



neighbor 195.xxx.xxx.195 remote-as 3333

neighbor 195.xxx.xxx.195 description sw-c3560-xxx.ru

neighbor 195.xxx.xxx.195 default-originate








誰もがチューニングを行ったようです。今、主なことは、sysctlのチューニングを少し忘れないことです。

既存の/etc/sysctl.confに次の行を追加します

net.inet.ip.forwarding=1 #

net.inet.ip.fw.one_pass=1 # ipfw

net.inet.icmp.bmcastecho=0 #

net.inet.tcp.blackhole=2 # ( )

net.inet.udp.blackhole=1 # ( )

net.inet.ip.dummynet.io_fast=1 # dummynet( )

net.inet.icmp.drop_redirect=1 # icmp

net.inet.icmp.log_redirect=1 # icmp log,

net.inet.ip.redirect=0 # 0, ICMP REDIRECT

net.inet.ip.dummynet.expire=0 #

#

net.inet.ip.dummynet.hash_size=16384 # -, dummynet

# .

#dummynet # ,

#








これについては、シェーパーが完成したと考えています。以前は課金システムとの統合を省略していました。それぞれ独自の方法と独自の方法があるためです

再起動コマンドを安全に記述でき、すべてが正しく構成されていれば、第3レベルスイッチ(l3)の構成に進むことができます。



また、インターネットへのアクセスを許可されていないユーザーをブロックに関する情報を含む特定のページにリダイレクトする場合は、nginx Webサーバーを配置し、構成ファイル(nginx.conf)に次のテキストを書き込みます。



user nobody;

worker_processes 2;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 35;

server {

listen 3128;

server_name wkt_router;

charset windows-1251;

access_log /dev/null;

rewrite ^(.*) blocked.wktnet.ru/index.htm permanent;

}

}







レイヤー3スイッチの構成



私のネットワークはCisco WS-C3560G-24-TS-Sを使用しています。そこではすべてがシンプルです

構成モードに移動します:conf t

ospfが実行されるvlanインターフェイスにIPアドレスを割り当てます(em1インターフェイスのシェーパーと同じネットワーク)

そして、ospfを構成します



router ospf 1

router-id 195.xxx.xxx.195

log-adjacency-changes

network 10.249.33.0 0.0.0.255 area 0.0.0.0

network 10.249.42.0 0.0.0.255 area 0.0.0.0

network 10.249.51.0 0.0.0.255 area 0.0.0.0

network 10.249.55.0 0.0.0.255 area 0.0.0.0








wrコマンドで設定を保存し、結果を喜ぶ



ospfプロトコルの代わりにbgpを使用することにした場合、スイッチ構成で次の行を追加する必要があります



router bgp 3333

bgp log-neighbor-changes

network 10.249.33.0 255.255.255.0

redistribute ospf 1

neighbor 195.xxx.xxx.193 remote-as 3333

neighbor 195.xxx.xxx.193 description gw









l3 Dリンクスイッチを使用する場合は、次のコマンドでOSPFを構成します



ospfを有効にし、スイッチでospfを有効にします

config ospf router_id 195.xxx.xxx.196、ルーターのIDを指定します

config ospf ipif <interface> area 0.0.0.0 state enable、enable ospf on the interface



そしてsaveコマンドで設定を保存します



バックアップサーバーを構成する



隣接(バックアップシェーパー)で、ospf configとIPアドレスを除いて同じ設定を実行します

違いは、デフォルト情報の発信元を200に設定し、それがバックアップになることです。 メトリック100のままにしてシェーパー間で負荷分散を行うことはできますが、この設定ではクライアントは倍速になります(各シェーパーの関税速度に応じて)ので、ネットワークではこのオプションを使用しません。



おわりに



その結果、動的ルーティングを備えたシステムが得られます(シェーパーまたは境界ルーターの1つに障害が発生した場合、隣接するルーターの使用が自動的に開始され、レベル3スイッチに登録されたすべてのネットワークルートがシェーパーのルーティングテーブルに自動的に表示されます)。 アイドル状態のサーバーのアイデアを恐れている場合は、設定をいじって、ospfをbgpに変更し、別のL3スイッチを追加して、ネットワークの一部をそれを通して解放できます。



結果のノードのスキーム:

画像



たとえば、rc.firewallを指定します



cat /etc/rc.firewall

#!/bin/sh

#Flush all firewall rules

/sbin/ipfw -q flush

/sbin/ipfw -q pipe flush

#Setting firewall path and options for working with rules

fwcmd="/sbin/ipfw -q"

#variables

IBGP_NET="195.93.xxx.xxx/28" #iBGP network (vlan9)

WAN_IP="195.93.xxx.xxx" #Primary WAN ip address

LAN_IP="195.93.xxx.xxx" #Primary LAN ip address



###System rules

${fwcmd} add 10 allow ip from any to any via lo0 #do not filter loobpack

${fwcmd} add 11 allow ip from me to me #allow packets from this host to this host

${fwcmd} add 12 allow icmp from any to me #allow ICMP



#allow ssh connections

${fwcmd} add 20 allow tcp from table\(6\) to me dst-port 22 #Allow SSH connections (table 6)

${fwcmd} add 29 deny tcp from any to me dst-port 22



#allowing users and add his ip to shaping pipe

${fwcmd} add 30 pipe tablearg ip from any to table\(1\) out via em1

${fwcmd} add 31 pipe tablearg ip from table\(2\) to any in via em1



#Block spammerss

${fwcmd} add 34 deny ip from table\(3\) to any dst-port 25 #for auto block spammers



#allow connections to this networsk

${fwcmd} add 40 allow all from table\(7\) to any

${fwcmd} add 41 allow all from any to table\(7\)



#allow active users

${fwcmd} add 45 allow all from not me to table\(1\)

${fwcmd} add 46 allow all from table\(2\) to not me



#By default block users

${fwcmd} add 48 fwd 127.0.0.1,3128 tcp from table\(8\) to not me dst-port 80

${fwcmd} add 49 allow tcp from any to table\(8\) src-port 80

${fwcmd} add 50 deny all from table\(8\) to not me

${fwcmd} add 51 deny all from not me to table\(8\)



###Access rules

#allow outgoing connections

${fwcmd} add 60 allow ip from me to any keep-state #allow all ougoing packets and keep state



#Rules allowing SNMP

${fwcmd} add 61 allow udp from table\(6\) to $WAN_IP dst-port 161 #Allow SNMP



#Rules allowing bgp

${fwcmd} add 64 allow tcp from $IBGP_NET to $WAN_IP dst-port 179 #Allow BGP from iBGP network (vlan 9)



###############################################

# 6 - ssh,telnet snmp

${fwcmd} table 6 add 195.93.xxx.xxx #wkt office

${fwcmd} table 6 add 89.xxx.xxx.1 #

${fwcmd} table 6 add 93.xx.xxx.xxx #



# 7 - IP

${fwcmd} table 7 add 195.xxx.xx.0/25 #binat

${fwcmd} table 7 add 195.xx.xx.0/26 #servers dmz

${fwcmd} table 7 add 195.xx3.xx.192/29 #int net

${fwcmd} table 7 add 195.xx.xxx.xxx #c3560-b51

${fwcmd} table 7 add 10.88.88.1

# 8 -

${fwcmd} table 8 add 10.87.0.0/16

${fwcmd} table 8 add 10.88.0.0/16

${fwcmd} table 8 add 10.249.0.0/16

${fwcmd} table 8 add 10.90.0.0/16

${fwcmd} table 8 add 195.93.xxx.0/25

${fwcmd} table 8 add 195.93.xxx.128/25

${fwcmd} table 8 add 195.93.xxx.64/26

${fwcmd} table 8 add 195.93.xxx.200/28



# 1 2 -

##WKT tech

${fwcmd} table 1 add 10.87.xx.250/32 55

${fwcmd} table 2 add 10.87.xx.250/32 255

${fwcmd} table 1 add 10.87.xx.251/32 55

${fwcmd} table 2 add 10.87.xx.251/32 255








そしてbgpd.conf



hostname gw2.xxxx

password rxxxx

enable password xxx

log file /var/log/quagga/bgpd.log

!

router bgp 44xxx

bgp router-id 195.93.xxx.xxx

bgp log-neighbor-changes

network 195.93.2xx.xxx/29

neighbor 195.93.206.xx remote-as 44380

neighbor 195.93.206.xx description j4350-b51

neighbor 195.93.206.xx next-hop-self

neighbor 195.93.206.xx remote-as 44380

neighbor 195.93.206.xx description j4350-k18

neighbor 195.93.206.xx next-hop-self

neighbor 195.93.206.xx remote-as 65000

neighbor 195.93.206.xxdefault-originate

neighbor 195.93.206.xx description sw-c3560g-24ts-b51

neighbor 195.93.206.xx route-map c3560g-b51-in in

neighbor 195.93.206.xx remote-as 65001

neighbor 195.93.206.xx default-originate

neighbor 195.93.206.xx description sw-c3560g-24ts-k18

neighbor 195.93.206.xx route-map c3560g-k18-in in

!

route-map c3560g-k18-in permit 10

set local-preference 200

!

route-map c3560g-b51-in permit 10

set local-preference 300









UPD:kernels.hz = "2000"を/boot/loader.confに登録するために、カーネルを再構築する必要はありません。



All Articles