![]() |
![]() |
| |||||||
|
巻き戻し中。
|
|
2020-07-05(日)
一周回って [長年日記]
_
冗長化?
freevrrpdとrelayd組み合わせてWebと外向けDNSの冗長化が何とかならんかと時間を見つけては格闘していたのだけど、諦めた。
1.freevrrpdはルータ越えるとゴキゲンがよろしくない
2.relaydだと、DNSはプロキシモードじゃ無いとちゃんと動かないがそれだと問い合わせ元が全部プロキシになっちゃうのでaxfrとかの制御がアレ
3.DSRモードならアクセス元制御できそうなので色々試したけどbindはDSR方式には対応出来なさそう
なので、鯖2台+LB2台のトラディショナルな冗長構成はどうやら無理。
Linuxで別のLB建てるのも面倒だしなぁ。
内部から外向きのDNSとか串はrelaydで問題ないと思うし、DNSは実際そうしてる。
_
でもって
余計な事をしないでaliasだけを切り替える「なんちゃってvrrpd」を作ったついでに、FreeBSDで完全にdaemonとして動くようにしてみた。
#!/bin/sh # This is "Fake VRRP daemon" # By H.Uekusa 20200705 # Put "fakevrrpd" into /usr/local/etc/rc.d # such as below # and do # "service fakevrrpd enable" # "service fakevrrpd enabled" # "service fakevrrpd start" #---------------------------------------------------- # #!/bin/sh # # -*- coding: utf-8; mode: shell-script; -*- # # insert `fakevrrpd_enable="YES"' in /etc/rc.conf # # Use with fvrrpd # # By H.Uekusa 20200630 # # # # PROVIDE: fakevrrpd # # PROG="/usr/local/etc/fvrrpd" # # . /etc/rc.subr # # name=fakevrrpd # rcvar=fakevrrpd_enable # procname=/bin/sh # pidfile=/var/run/fvrrpd.pid # # start_cmd="${name}_start" # stop_cmd="${name}_stop" # # load_rc_config $name # : ${fakevrrpd_enable:="NO"} # # fakevrrpd_start () { # echo "Starting fakevrrpd" # $PROG -d # } # # fakevrrpd_stop () { # echo "Stopping fakevrrpd" # $PROG -k # } # # run_rc_command "$1" #---------------------------------------------------- # ############### configuration valiables ################ CAT="/bin/cat" GREP="/usr/bin/grep" IFCONFIG="/sbin/ifconfig" KILLA="/usr/bin/killall" LOGGER="/usr/bin/logger" PING="/sbin/ping" NC="/usr/bin/nc -z -w 1 " # and $MASTER and port RESTART_NAMED="/usr/sbin/service named restart" # VIP="10.2.3.4" MASK="netmask 255.0.0.0" MASTER="10.2.3.5" #Actual master IP address IF="vmx0" #Physical interface name in ifconfig PORT="80" #Monitor for back up the master WAIT_LIMIT="60" #Seconds # PIDFILE="/var/run/fvrrpd.pid" LOGNAME="fake_vrrpd" ######################################################## # ######## main module ######## main () { STAT_PREV="0" PID=`echo $$` echo $PID > $PIDFILE if [ "$1" == "verbose" ];then LOG="echo" elif [ "$1" == "daemon" ];then LOG=`echo $LOGGER -is -t $LOGNAME` else exit 3 fi $LOG "Fake vrrpd PID is $PID" while [ 1 ]; do #Infinite loop $PING -c1 -t1 $MASTER >/dev/null 2>&1 STAT_NOW=`echo $?` if [ $STAT_NOW != $STAT_PREV ];then #Found change if [ $STAT_NOW != 0 ];then #Change is master down $LOG "Master $MASTER down detected! I will become the Master" $IFCONFIG $IF |$GREP $VIP >/dev/null 2>&1 MY_VIP_ENABLED=`echo $?` if [ $MY_VIP_ENABLED != 0 ];then #My VIP is not set $PING -c1 -t1 $VIP >/dev/null 2>&1 STAT_VIP=`echo $?` if [ $STAT_VIP != 0 ];then #Another VIP is not found $LOG "I become the Master!" $IFCONFIG $IF alias $VIP $MASK $LOG "Restarting named" $RESTART_NAMED else $LOG "The Master seems down, but there is another Master ??" $LOG "To avoid conflict, do nothing." fi fi else #Change is master back up $LOG "Master $MASTER interface back up detected! Waiting for enabling service at $PORT." NC_STAT="1" STAT_COUNT="0" while [ $NC_STAT != 0 ];do $NC $MASTER $PORT NC_STAT=`echo $?` echo "Status $NC_STAT" echo "Count $STAT_COUNT" if [ $STAT_COUNT -gt $WAIT_LIMIT ];then $LOG "Waiting for enabling service at $PORT timed out $WAIT_LIMIT sec, aborting." exit 5 fi STAT_COUNT=`expr $STAT_COUNT + 1` sleep 1 done $LOG "Master $MASTER service back up detected! I will become the standby" $IFCONFIG $IF |$GREP $VIP >/dev/null 2>&1 MY_VIP_ENABLE=`echo $?` if [ $MY_VIP_ENABLE = 0 ];then #My VIP was set $LOG "I become the standby! Removing alias $VIP" $IFCONFIG $IF -alias $VIP $LOG "Restarting named" $RESTART_NAMED else $LOG "VIP $VIP is already removed or not set, Nothing to do." fi fi fi echo "IF Status $STAT_PREV->$STAT_NOW" STAT_PREV=`echo $STAT_NOW` sleep 1 done rm -f $PIDFILE exit 4 } ############################# # ###### check arguments ###### if [ "$1" == "-d" ];then #Run as daemon LOG=`echo $LOGGER -is -t $LOGNAME` $LOG "Fake vrrpd is starting as daemon" if [ -f "$PIDFILE" ];then #Exist PID file? $LOG "There is PID file at $PIDFILE,I'm exiting" $LOG "If you would like to start forcibly, Use -k option first" exit 2 fi $0 -vd >/dev/null 2>&1 & elif [ "$1" == "-h" ];then #Display help echo "Usage" echo " -d : Run as daemon" echo " -h : Display help" echo " -v : Run on foreground" echo " -k : Kill daemon" elif [ "$1" == "-k" ];then #Killing existing process LOG=`echo $LOGGER -is -t $LOGNAME` if [ -f "$PIDFILE" ];then #Exist PID file? PIDKILL=`$CAT $PIDFILE` $LOG -is -t $LOGNAME "Killing fake vrrpd $PIDKILL" kill -9 $PIDKILL rm -f $PIDFILE $LOG -is -t $LOGNAME "removing PID file" else $LOG -is -t $LOGNAME "PID file not found, killing with killall" $KILLA $0 fi $IFCONFIG $IF |$GREP $VIP >/dev/null 2>&1 MY_VIP_ENABLE=`echo $?` if [ $MY_VIP_ENABLE = 0 ];then #My VIP was set $LOG -is -t $LOGNAME "Removing alias $VIP for master" $IFCONFIG $IF -alias $VIP else $LOG "VIP $VIP is already removed or not set, Nothing to do." fi $LOG -is -t $LOGNAME "Restarting named" $RESTART_NAMED exit 1 elif [ "$1" == "-v" ];then #Run on foreground LOG="echo" if [ -f "$PIDFILE" ];then #Exist PID file? $LOG "There is PID file at $PIDFILE,I'm exiting" $LOG "If you would like to start forcibly, Use -k option first" exit 2 fi main verbose elif [ "$1" == "-vd" ];then #Run as daemon main daemon else echo "Usage" echo " -d : Run as daemon" echo " -h : Display help" echo " -v : Run on foreground" echo " -k : Kill daemon" fi exit 0 #############################
_
使い方
これ、マスター側はaliasにVIPを設定する以外は全部スタンバイ側の設定で良い。
コメントの通り/usr/local/etc/rc.dに「fakevrrpd」を置いて、本体*1は/usr/local/etc/に実行権付けておけばおk。
忘れずに冒頭の変数を環境に合わせて変更すること。
あとは
service fakevrrpd enable
service fakevrrpd enabled
service fakevrrpd start
で起動する。
ログはmessagesに吐かれるし、デバッグモード的に確認したければ「-v」オプションで直接叩くとフォアグラウンドで動くよ。
CTRL+Cで止めることになるので、最後に「-k」で状態をクリアしておくこと。
なお、マスターのIF起動検知後にWAIT_LIMIT秒待っても目的のサービスのポートが開かないとアボートして終了するので、手動対処。
これは、サービスの停止時間を削るためにマスターのIF起動時点ではまだaliasを止めないでサービスが動くまで粘る仕様。*2
あまりにも長いと「IPが衝突している状態」なので各所によろしくないからだ。
2020-06-11(木)
KVM [長年日記]
_
念願のIP-KVM?
10マソ円入ったので、殿お勧めのATENのCV211CPポチったの実装した(・∀・)
ESXi鯖の隣にあるRasPiからVirtualHereでUSBデバイスとしてリモートのWindowsに飛ばして何となくIP-KVMの完成である。*1
あと、「電源ボタンぽちー」用にSwitchbotも仕入れてRasPiから駆動できてるので、地球の裏側に出張していて基盤が死んでもなんとかなる(;^ω^)*2
実はあと1-2マソ出せば安いIP-KVM買えるのでどうなのか微妙ではあるのだが、殿が書いてたとおり、「直接ノートPCをモニタ/キーボードにする使い方"も"できるので便利」と自分に言い聞かせて。。。w
ちなみに今回のこれ、帯域制限のある無償版のVirtualHereで飛ばしても、ESXiのスクリーン程度に解像度低ければ使いモノにはなるレベル。
これでガリガリ作業すると言うよりは出張時などにパープルスクリーンとか出たときの対処が出来れば良いので、まぁ許容範囲。*3
2020-05-24(日)
引き続き工事中 [長年日記]
_
冗長化
ルータの次はDNS鯖。
carpかvrrpか悩んだが、freevrrpdの切り替わり時にキックするスクリプトがpreかpostか分からないので、bindをインターフェース確立後に再起動したいけど上手くなさそう。
で、carp試してみたのだけど、どうやらNICにプロミスキャスモード設定してあると、マスターになろうと「俺マスター!」パケット出した瞬間に、自分のパケットを検知して「誰かおる!わしバックアップ」ってループするドリフのコントみたいな事になったので、やっぱvrrpにするw
_
freevrrpd
まず、「224.0.0.18」にipfw開けてないとダメだな。
ガッツリ閉じていた*1ので、socketに書けないってエラーで起動失敗してた。
bindを叩くスクリプトは、ifconfigでインターフェースにIPが付いたのを確認したら再起動するのをmaster_script.shからバックグラウンドで投げるようにした。
#!/bin/sh TIMER=0 LIMIT=10.0 STEP=0.1 VIP="inet hoge.hoge.hoge.hoge" IF_CMD="/sbin/ifconfig" IF_NAME="ngeth0" GREP_CMD="/usr/bin/grep" BC_CMD="/usr/bin/bc" NAMED_RESTART="/etc/namedb/restart-named.sh" while [ "$TIMER" != "$LIMIT" ]; do $IF_CMD $IF_NAME | $GREP_CMD "$VIP" STAT=`echo $?` if [ $STAT = 0 ];then $NAMED_RESTART logger -is -t named_restarter2 "named delayed restart at $TIMER sec" exit fi sleep $STEP TIMER=`echo "scale=1; $TIMER + $STEP" | $BC_CMD` # echo $TIMER done logger -is -t named_restarter2 "could not restart named within time limit $LIMIT sec"
*1 デフォルトクローズなんで
_
ついでに
いままですっとTCPフォールバックがコネクションリセットされていた件を切り分けて解消。
ルータの前後に仮想端末付けて
「dig @鯖IP uekusa.jp +norec +dnssec +multi +vc +edns +noad」
で誰が引けて引けないのか確認。
結局ルータ跨がないやつしか引けないことが分かって、鯖のfirewallは無罪。
で、「貧者のCisco」Cisco841MのACLを何度眺めてもちゃんとTCP通してるのですよこれ。
でも、切り分けで敢えて明示的に先頭に「permit tcp any any eq 53 log」入れたら通るじゃん。
なんだこれ?
で、通ったなら一端logは大量になるのいやなので止めようと「permit tcp any any eq 53」に置き換えたら通らない。
え?おまえ、log止めると通さないってバグじゃんかよ!*1
しかも拡張ACLで53/tcpだけ引っ掛かってるぽい。
サポートに問い合わせてもいいのだけど、もうサポート期間切れてるし、わざわざお金払ってバグの報告してやるのもしゃくに障るw
ログ吐くの我慢すれば使えるし。
これが分かったおかげでここ一年悩んでた公開DNS鯖がTCPでクエリ受けられない問題が解消。
ようやく今年の DNS flag dayを生き残ることが出来るようになったw
*1 src/dstは指定もしてみたけどanyは関係なかった。
_
もういっちょ
バグ。
新しくしてもらったみかかルータのRX-600MIもACL変更すると予期しない行もしくはポートがdenyになるっぽくて再起動が必要。
たぶん、RT-S300SEのコンフィグを読み込ませてから変更したので、不整合もあるんだと思うのだけど、そもそも違う機種の設定ファイル読めちゃうのダメでしょ?
2020-05-23(土)
ゴキゲン [長年日記]
_ BGM
今週は、密林で入手したKeyの「Modification of Key Sounds Label VOL.2」*1(3枚組)をBGMにお仕事。
全体的に聞きやすいMIXである。
LightColorsはいままで色々mixあったけど、このmixが一番カコ(・∀・)イイ!!
なお、鳥の詩もいいのだけど後半のタイミングの良い「Are-you-ready?」でなんか笑ってまう。
国歌やぞwww
個人的には「サンブライト」がお気に入り。*2
_
切り分け
ルータを仮想化したおかげで、みかかルータ配下のWANセグメントにも仮想マシンからのNICが伸びた。
更に、DS-liteやPPPoEの別セッションで外から回って自宅鯖のグローバルIPを試験できるようになった。
いままで、LAN側とDMZ内で確認して「うーん、プロバイダのルータがへぼいんじゃね?」って思ってたDNS鯖にTCPのクエリが届かない問題を切り分けることに。
一応UDPのEDNS0はちゃんと動いてるので実害はまだ無いが、今後ダメになるヤツだ。
2020-05-18(月)
vrrp [長年日記]
_
ルータの冗長化
FreeBSDで建てたDS-liteのルータとCisco841Mの間でvrrpによる冗長化、あっという間に出来た。
概ねデフォルトの設定。
----vrrpd側----
[VRID]
serverid = 1
interface = vmx0
carriertimeout = 10
spanningtreelatency = 0
priority = 255
addr = 192.168.VIPの.IP/32
monitoredcircuits = yes
MCClearErrorsCount = 3600
masterscript = /usr/local/bin/master_script.sh
backupscript = /usr/local/bin/backup_script.sh
vridsdep =
password = hogehoge
----Cisco側----
vrrp 1 description VRRP_with_IPv6-router
vrrp 1 ip 192.168.VIPの.IP
vrrp 1 priority 101*1
vrrp 1 authentication hogehoge
vrrp 1 track 1
---------------
*1 デフォルトは100だけど、わざとconfigに表示されるように101 にした
_
動作は
基本的には速度の速いDS-liteのFreeBSDがマスターで、そいつが落ちてる間だけCiscoが固定IPv4のルートからルーティングする。
FreeBSDが立ち上がるとCiscoはスタンバイになる。
実験したけど、PCで作業してる分には気にならない速度で切り替わる。
手動設定端末とDHCPで配布するデフォゲはVIPに変更。
これで心置きなくルータの再起動とか実験できる(・∀・)
次はDNS鯖の冗長化だな。
vrrpdでやるか、keepalivedでやるか・・・
2020-05-17(日)
梅 [長年日記]
_
梅酒からジャム
毎年梅酒を漬けるけど、飲み終わったあとの梅がもったいなかった。
cookpadでレシピ調べて梅ジャム作成(・∀・)
①水で暫く煮てアルコールを抜く
②種を抜いて潰す
③砂糖を入れて煮る
という簡単な手順。
砂糖控えめでちょっとお酒風味残したりして大人の味。
朝飯にパンとジャムと珈琲とか、QOLがちょっと上がる。
2020-05-12(火)
まーた [長年日記]
_ 給付金
習志野もオンラインになったので早速10マソ円の申請\(^o^)/オワタ
ところでこれ、電子証明書の有効期限が5年後の誕生日なので、サービス開始からするとギリギリとか切れてる人とか多いと思うのだけど、大丈夫ですかね?
2020-05-11(月)
連休明け [長年日記]
_
大改造
9日間、家の中のネットワーク大改造。
10年間面倒くさがっていたIPv6をデュアルスタックで動くように。
ルーターも今までの固定IPv4の物理と、お遊び用のPPPoEv4とDS-lite/IPv6ネイティブのsoftware仮想ルーターの3つに分離してうひょうひょ。
あとはVRRPで冗長構成にすれば当分満足(゚∀゚)
2020-05-05(火)
おひとりさまBBQやら燻製やら [長年日記]
_
一人でもやるよー
StayHomeだし息子も帰省してこないし外出もアレなんで、材料を買い込んできて自宅でお一人様キャンプ。
庭の芝生も刈り込んで気持ちいい。*1
今回は、一気にBBQ焼いても食べる人が一人なので辛いから燻製メイン。
なので、火力も薪で焚き火にする。
薪は燃料用もあるのだけど、写真の室外機の上にもあるように家の工作やら工事に使った端材が結構あるのでナタで細かくしながら消費。
*1 ただしお一人様w
_
肉も野菜も
「肉、食うかい?」がしたかったので、ニトリのスキレットで肉と付け合わせを焼いて、たき火で炙って暖めたパンと食べる。
「んー、うまい」*1
ついでに「あきキャン」でやってた焼きトマトも。
↓ニトリのスキレット、密林で買うと高いよね。普通に近所の店に行けば数百円。
*1 CV大塚明夫
_
燻製
白ワインや塩こしょう、ハーブを適当にcookpadのレシピを見ながら。
チーズも含め、最初は林檎のチップで熱くない方の燻製で。
とはいえ、固形の燻製材を点火してあるだけでそこそこ暖まってしまうので温度を気にしながら。
酒のつまみには良い感じになった(・∀・)
一方、肉系は桜のチップを皿に入れて薪の上で勢いで。
これはこれで、おつまみには最高っすね(・∀・)
_
おかわり
晩御飯も勢いで、余った昼間のステーキ肉を薄暗くなった庭で焼いてもう一度「肉、食うかい?」して大満足でしたわ(・∀・)
Tweets by RC31E | |||||||||
| |||||||||
| |||||||||
|