絶対に複雑なことは想定されていませんでしたが、それでも少しドキュメントを読む必要がありました。
実際のタスク:
1. 2つのインターネット接続(1つはプライマリ、もう1つはバックアップ)を備えたゲートウェイを作成します。
2.バックチャネルへの変更への人間の参加を最小限に抑えます。
ツール:
OS FreeBSD 6.x、PF、perl
解決策:
FreeBSDは最小限のインストールで出荷されていて、必要な変更はあなただけです
これにより、PFモジュールがカーネルに追加されます。 これはすべて複雑ではありません。
cp / usr / src / sys / i386 / conf / GENERIC / usr / src / sys / i386 / conf / PF
ee / usr / src / sys / i386 / conf / PF
行を追加します。
#Pf
デバイスpf
デバイスpflog
デバイスpfsync
#ALTQ
オプションALTQ
オプションALTQ_CBQ
オプションALTQ_RED
オプションALTQ_RIO
オプションALTQ_HFSC
オプションALTQ_PRIQ
オプションALTQ_NOPCC
次に、カーネルを保存して再構築する必要があります。
cd / usr / src
buildkernelを作成KERNCONF = PF
installkernelを作成KERNKONF = PF
再起動
システムを起動した後、/ etc / rc.confを修正する必要があります
以下を追加します。
gateway_enable = "YES"
pf_enable = "YES"#PFを有効にする(必要に応じてモジュールをロードする)
pf_rules = "/ etc / pf.conf"#pfのルールの定義
pf_flags = ""#pfctlを実行するための追加のフラグ
pflog_enable = "YES"#pflogdを実行(8)
pflog_logfile = "/ var / log / pflog"#pflogdはプロトコルを保存する必要があります
pflog_flags = ""#pflogdを実行するための追加フラグ
保存します。
次に、PFのルールを書き留める必要があります。
ee /etc/pf.conf
#メイン設定
ext_if_1 = "rl0"#IPS_1-最初のチャネルのインターフェース
ext_if_2 = "rl1"#IPS_2-2番目のチャネルのインターフェース
int_if = "ae0"#lan-内部ネットワークインターフェイス
lo = "lo0"#ループバック
int_net = "172.21.0.0/16"#LANネットワーク
ext_addr_1 = "222.0.0.2"#IPS_1 wan
ext_addr_2 = "223.0.0.2"#IPS_2 wan
int_addr = "172.21.0.1"#LAN IP
gw_1 = "222.0.0.1"#IPS_1 gw
gw_2 = "223.0.0.1"#IPS_2 gw
#サービス
tcp_svc =“ ssh”-外部インターフェイスの許可されたポート。
#log-パケットロギング
loginterface ae0を設定します
loginterface rl0を設定します
loginterface rl1を設定します
#ifaceをスキップ-ループバックをフィルタリングしない、
#多くのサービスがシステムの事柄にこのインターフェースを使用しています。
lo0にスキップを設定します
#スクラブ
すべてスクラブ
#NAT
#外部インターフェイスを作成します
from ext_if_1 inet from!(self)->($ ext_if_1:0)#IPS_1 nat
nat from $ ext_if_2 inet from!(self)->($ ext_if_2:0)#IPS_2 nat
#すべてをブロック
#まず、すべての着信トラフィックをブロックする必要があります
ブロックイン
#なりすまし
$ int_ifのクイックスプーフィング対策
#ICMP
#外部インターフェイスでicmpを許可し、ゲートウェイを介してルーティングします
#状況がないように、1つの外部アドレスにpingを実行すると、2番目のゲートウェイに回答が送られます。
#IPS_1
$ ext_if_1 reply-to($ ext_if_1 $ gw_1)inet proto icmp to($ ext_if_1)tag EXT_IF_A icmp-type echoreq code 0を渡す
($ ext_if_1:network)から($ ext_if_1)icmp-type echoreq code 0に$ ext_if_1 inet proto icmpを渡す
#IPS_2
$ ext_if_2 reply-to($ ext_if_2 $ gw_2)inet proto icmp to($ ext_if_2)tag EXT_IF_B icmp-type echoreq code 0を渡す
($ ext_if_2:network)から($ ext_if_2)icmp-type echoreq code 0に$ ext_if_2 inet proto icmpを渡す
#TCPポートを許可
#外部インターフェイスとそのルーターでサービスを許可、上記ではsshのみ許可
#udpの場合、proto tcpのみをproto udpに変更した後の同様のエントリ
#IPS_1
$ ext_if_1 reply-to($ ext_if_1 $ gw_1)inet proto tcpを($ ext_if_1)port {$ tcp_svc}に渡す
($ ext_if_1:network)から($ ext_if_1)ポート{$ tcp_svc}に$ ext_if_1 inet proto tcpを渡す
#IPS_2
$ ext_if_2 reply-to($ ext_if_2 $ gw_2)inet proto tcpを($ ext_if_2)port {$ tcp_svc}に渡す
($ ext_if_2:network)から($ ext_if_2)ポート{$ tcp_svc}に$ ext_if_2 inet proto tcpを渡す
#着信ルート
#ルーターがすべての着信トラフィックを、その条件下で、そのインターフェースに到達した場合、
#そのゲートウェイから回答を送信する必要があります
#プラスタグを置きます。 タグは、ポートを正しく転送するのに役立ちます。
#ターミナルサーバーがあるとします。次のように転送できます
#anyから$ ext_addr_2ポート3389タグEXT_IF_B-> 172.21.0.1ポート3389への$ ext_if_2 proto tcpのrdr
#anyから$ ext_addr_1ポート3389までの$ ext_if_1 proto tcpのrdrタグEXT_IF_A-> 172.21.0.1ポート3389
#IPS_1
タグ付けされたEXT_IF_Aの状態を保持する($ ext_if_1:network)からすばやく渡す
EXT_IF_Aタグ付き状態を保持するクイック返信($ ext_if_1 $ gw_1)を渡す
#IPS_2
($ ext_if_2:network)タグ付きのEXT_IF_Bから状態を維持する
EXT_IF_Bタグ付き状態を保持するクイック返信($ ext_if_2 $ gw_2)を渡す
#ファイアウォール
#ゲートウェイの内部空間のすべてを許可する
(自己:ネットワーク)からinetを渡す
inet proto icmpを(self:network)に渡します
#ローカルネットワーク
#すべてのトラフィックがローカルネットワークを出るようにする
$ int_ifをすばやく渡す
#発信ルート
#ルーターの発信トラフィック
ルートを($ ext_if_1 $ gw_1)inetから($ ext_if_1)keep stateに渡す
ルートを($ ext_if_2 $ gw_2)inetから($ ext_if_2)keep stateに渡す
{$ ext_if_1 $ ext_if_2}からinetを(self:network)に渡します
これらのルールは、正しいルーティングで、2つのチャネルの循環を保証するのに十分です。
各ルールの意味を確認したい場合は、PFのドキュメントを読んで詳細を説明しません。
次に、メインゲートウェイをrc.confに追加する必要があります。
ee /etc/rc.conf
defaultrouter = "222.0.0.1"
保存します。
次に、 NET_PING真珠のパケットを配置する必要があります。
cd / usr / ports / net / p5-Net-Ping
インストールする
Dalleは、メインが低下した場合にチャネルを切り替えるスクリプト自体を記述し、上昇した場合はその逆を行います。
スクリプトを保存し、実行可能にし、1分に1回実行するためにクラウンにドロップします。
それだけです 再起動すると、すべてが機能するはずです。
#!/usr/bin/perl -w
use strict;
use warnings;
use Net::Ping;
# 1 -
# 2 - .
my $action = 1;
my $p = Net::Ping->new("icmp");
my $host_gw = "222.0.0.1"; # default gw
my $gw = "223.0.0.1";
my $now = localtime time;
if($action == 1){
my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);
if ($p->ping($host_gw,0.05)){
print "host $host_gw is ok\n";
if($b[1] ne $host_gw){
if($b[1] eq ""){
`route add default 222.0.0.1`;
}else{
`route change default 222.0.0.1`;
open(LOG,">>/change_route.log");
print LOG "[!] $now Route change to 222.0.0.1\n";
close(LOG);
}
}
}else{
print "host $host_gw is bad.\n";
if($b[1] ne $gw){
`route change default 223.0.0.1`;
open(LOG,">>/change_route.log");
print LOG "[!] $now Route change to 223.0.0.1\n";
close(LOG);
}
}
$p->close();
}
if($action == 2){
my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);
if($b[1] ne $gw){
if($b[1] eq ""){
`route add default 223.0.0.1`;
}else{
`route change default 223.0.0.1`;
open(LOG,">>/change_route.log");
print LOG "[!] $now Route change to 223.0.0.1\n";
close(LOG);
}
}
}
オリジナル記事