前は散々苦労して倒してたのに、今だと秒殺だよ。
本来なら、足に何度かダメージ与えて、龍がダウンしたら、首をよじ登って攻撃当ててゲージを削るってのがセオリーなんだけど、チャスカが居たらスキルで飛行して、当てるだけ。
なんか申し訳なくなるわ。

I know who Iam.
前は散々苦労して倒してたのに、今だと秒殺だよ。
本来なら、足に何度かダメージ与えて、龍がダウンしたら、首をよじ登って攻撃当ててゲージを削るってのがセオリーなんだけど、チャスカが居たらスキルで飛行して、当てるだけ。
なんか申し訳なくなるわ。
家のサーバーのIPv6のIPアドレスをDNSに登録した。
DNSに問い合わせれば、家のサーバーのIPv6アドレスが分かる。
|
1 2 3 4 |
Name: silverfox.noizumi.org Address: 183.76.197.88 Name: silverfox.noizumi.org Address: 2405:6587:c200:7500:6c7b:5eff:feac:7a1 |
IPv6のアドレスは、半固定だからIPv4みたいに変わってしまう事を余り考慮しなくて良いという認識だったが、家のルーターのIPv6のフィルター見てみると、IPv6のアドレスが変わっていた。
端末のIPv6アドレスはルーターの再起動などで変わってしまうので、その度にルーターの設定を変更しないといけないが、そういう面倒を避けるには、メーカー曰く、プロバイダに固定IPなどの契約をしてくださいとの事。
でもまあ、IPv6で接続不能になっていても、IPv4で家のルーターに接続して設定変更すれば、一応、IPv6で通信できるようになるから、プロバイダに固定IPの課金はしない 🙂
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
<?php /* * ipcheck.php * */ $api_key = '[APIキー]'; $server_id = 'xsvx1023505'; $servername = $server_id.'.xsrv.jp'; $api_base_url = 'https://api.xserver.ne.jp'; $api_base_url .= '/v1/server/'.$servername; $target = 'silverfox'; $domain = 'noizumi.org'; $url_ip_prog = 'https://irc.noizumi.org/cgi-bin/ip.py'; /** * DNSレコード全部を取得する * @global string $api_key * @global string $api_base_url * @return array */ function getDNSRecord(){ global $api_key; global $api_base_url; $headers = array( 'Content-Type: application/json', 'Authorization: Bearer '.$api_key ); $ch = curl_init(); //curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); // IPv4 Only. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // HTTPレスポンス 30x を追跡する。 curl_setopt($ch, CURLOPT_HEADER, false); $command = '/dns'; curl_setopt($ch, CURLOPT_URL, $api_base_url.$command); $output = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); curl_close($ch); return json_decode($output, true); } /** * DNSレコードを更新する * @global string $api_base_url * @global string $api_key * @param string $dns_id * @param array $params */ function setDNS($dns_id, $params){ global $api_base_url; global $api_key; $fields = json_encode($params); $headers = array( 'Content-Type: application/json', 'Content-Length: ' . strlen($fields), 'Authorization: Bearer '.$api_key ); $ch = curl_init(); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // HTTPレスポンス 30x を追跡する。 curl_setopt($ch, CURLOPT_HEADER, false); $command = '/dns/'.$dns_id; curl_setopt($ch, CURLOPT_URL, $api_base_url.$command); $output = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); curl_close($ch); } // DNS一覧から変更するレコードのIDと設定値を取り出す。 // ※事前にDNSレコードは登録しておく。 $dns_record = getDNSRecord(); $ipv4_done=false; $ipv6_done=false; foreach($dns_record['records'] as $index=>$rec){ // ホスト名に合致し、IPv4のレコードなら処理する。 if(strpos($rec['host'], $target)!==false && $rec['type']=='A' && !$ipv4_done){ $dns_id4 = $rec['id']; $hosts4 = $rec['content']; $ipv4_done=true; } // ホスト名に合致し、IPv6のレコードなら処理する。 if(strpos($rec['host'], $target)!==false && $rec['type']=='AAAA' && !$ipv6_done){ $dns_id6 = $rec['id']; $hosts6 = $rec['content']; $ipv6_done=true; } if($ipv4_done && $ipv6_done){ break; } } // IPv4を明示的に指定して接続するコンテキストを作成 $context4 = stream_context_create([ 'socket' => [ // IPv4アドレスでバインドする(通常は0.0.0.0:0) 'bindto' => '0.0.0.0:0', ], ]); // IPv4でサイトにアクセスしてIPアドレスを得る $response4 = file_get_contents($url_ip_prog, false, $context4); if(preg_match('/Your IP address is ([0-9.]*)/', $response4, $matches)){ $myip = $matches[1]; if(!empty($hosts4) && $myip != $hosts4){ $params = array( 'domain' => $domain, 'host' => $target, 'type' => 'A', 'content' => $myip ); setDNS($dns_id4, $params); } } // IPv6を明示的に指定して接続するコンテキストを作成 $context6 = stream_context_create([ 'socket' => [ // IPv6アドレスでバインドする(通常は[::]:0) 'bindto' => '[::]:0', ], ]); // IPv6でサイトにアクセスしてIPアドレスを得る // ※IPv4環境だと、IPv4のIPアドレスが返ってくるので、IPv6のパターンにマッチした時だけ登録する。 $response6 = file_get_contents($url_ip_prog, false, $context6); if(preg_match('/Your IP address is ((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/', $response6, $matches)){ $myip = $matches[1]; if(!empty($hosts6) && $myip != $hosts6){ $params = array( 'domain' => $domain, 'host' => $target, 'type' => 'AAAA', 'content' => $myip ); setDNS($dns_id6, $params); } } ?> |
XSERVER は IPv4環境なので、IPv4のIPアドレスしか返さないから、KAGOYA VPSの irc.noizumi.orgに接続する。
irc.noizumi.org は当初25GBしかディスク容量が無かったので、できるだけ最少構成にすべく、PHPはインストールせずに、apache2のCGIモジュールを有効にし、CGIでpythonスクリプトにより、IPアドレスを返すようにしている。
|
1 2 3 4 5 6 |
#!/usr/bin/python3 import os from pathlib import Path Path("/var/www/html/ip.txt").write_text(os.environ.get("REMOTE_ADDR"), encoding="utf-8") print("Content-Type: text/html\n") print("Your IP address is", os.environ.get("REMOTE_ADDR")) |
家のサーバーがハングアップして再起動したが、監視カメラWebアプリのzoneminderが古い見た目になり、sshで外からログインしようとすると、
|
1 2 3 |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
なんてのが出てくる。
# cat /etc/os-release
RETTY_NAME=”Debian GNU/Linux 10 (buster)”
って、OSが古くなっとる!?
よくよく考えてみると、ディスクケースがお陀仏になって、そこから抜き出したハードディスクをUSB変換器で接続してたから、古いハードディスクで再起動しちゃってたんだな。
古いハードディスクを繋いでいた事を完全に失念してて、ちょっとしたオカルト気分を味わったよ (^^;
ウチがとあるサイト構築した後に、依頼主がウチとは別の大手の会社にカスタマイズ依頼し、良くなかったのか、再びこちらに戻ってきたんだが、そのカスタマイズが酷すぎる。
ユーザーをマッチングするサイトだが、ある項目で、検索する側が、「A、B、希望なし」という選択肢になっているのに、検索される側が保持しているデータは、「A、B、経験なし」となっている。
元々はA、Bを選択するだけだったのが、後から「希望なし」と「経験なし」を追加したようだ。
元の実装趣旨としては、AもBも選択しなかったら希望なし or 経験なしなのだから、そもそも「希望なし」も「経験なし」も蛇足。
プログラムは一切いじられてないから、当然、「希望なし」を選択すると、「希望なし」という文字列を検索する処理になっているが、そもそも検索される側は「経験なし」になっているのでヒットする訳がない。
元の処理の趣旨に合わせるべく、「希望なし」という検索であれば、そこの項目を検索対象にしないというプログラム処理を追加した。
それが不具合としてこっちに来てるけど、カスタマイズしたせいで不具合が出ても、それを修正する事ができないから、こっちに回って来たのかな?
家の玄関リフォームで撤去されていた raspberry Pi3B+USBカメラを設置しなおした。
撤去してからdocomoのプランをはじめてスマホプランに変更した際に、ドコモショップにmopera Uを勝手に解約され、光回線のIPv6の為にルーターを買いなおしたりしたせいで暫く監視カメラ無しになっていた。
Wi-Fiルーターが変わったせいで、今まで旧ルーターに接続していたraspberry Pi3Bの設定変えないといけないし、家のサーバー吹っ飛んだせいで、Zoneminderをインストールしなおさないといけないしで、面倒臭い2乗くらいだった。
連休を利用して腰を入れて、環境復活させたのだが、v4l2rtspserverもgitからpullして再構築したけど、前まで、移動物でmpegノイズ出まくりだったのが出なくなって、結構いい感じ。
これで柿どろぼうが来ても大丈夫だな 🙂
昔はボコボコにやられてたけど、今では余裕で倒せるな。
XSERVER からサーバー操作できるAPIのお知らせメールが来ていたので、早速、今まで使っていたツールをそれ用に書き換え。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<?php $api_key = '[APIキー]'; $server_id = 'xsvx1023505'; $servername = $server_id.'.xsrv.jp'; $api_base_url = 'https://api.xserver.ne.jp'; $api_base_path = '/v1/server/'.$servername; $target = 'silverfox'; $domain = 'noizumi.org'; $url_ip_prog = 'https://yuji.noizumi.org/ip.php'; $url_ip_txt = 'https://yuji.noizumi.org/ip.txt'; $dns_id = '76684883'; // 作成済のDNSレコードID silverfox.noizumi.org // nslookup から、現在DNSに登録されているIPアドレスを抜き出す。 ob_start(); passthru('nslookup '.$target.'.'.$domain.' ns5.xserver.jp'); $buf = ob_get_clean(); $hosts = ''; if(preg_match_all('/Address:\s+((\d+\.){3}\d+)/',$buf ,$matches)){ $hosts = $matches[1][1]; } // IPv4を明示的に指定して接続するコンテキストを作成 $context = stream_context_create([ 'socket' => [ // IPv4アドレスでバインドする(通常は0.0.0.0:0) 'bindto' => '0.0.0.0:0', ], ]); $response = file_get_contents($url_ip_prog, false, $context); if(preg_match('/Your IP address is ([0-9.]*)/', $response, $matches)){ $myip = $matches[1]; }else{ $myip = file_get_contents($url_ip_txt); } if($myip==$hosts){ exit(0); } $params = array( 'domain' => $domain, 'host' => $target, 'type' => 'A', 'content' => $myip ); $fields = json_encode($params); $header = array( 'Content-Type: application/json', 'Content-Length: ' . strlen($fields), 'Authorization: Bearer '.$api_key ); $ch = curl_init(); //curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); // IPv4 Only. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // HTTPレスポンス 30x を追跡する。 curl_setopt($ch, CURLOPT_HEADER, false); $command = '/dns/'.$dns_id; curl_setopt($ch, CURLOPT_URL, $api_base_url.$api_base_path.$command); $output = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); curl_close($ch); ?> |
asahiネットにプロバイダ変更して、IPv6環境になり、XSERVER以外のサーバーにアクセスすると、IPv6のアドレスが記録されちゃうので、file_get_contents()で、明示的にIPv4でアクセスするようにしてある。
次のプログラムは、XSERVERに置いておいて、家のサーバーからアクセスすると、家の回線のIPv4アドレスが分かるやつ。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ip = $_SERVER['REMOTE_ADDR']; file_put_contents( 'ip.txt', $ip ); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>IP address</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="generator" content="Geany 1.27" /> </head> <body> Your IP address is <?php echo $ip ?> </body> </html> |
VPNで家のサーバーに接続する際に、家の回線はIPアドレス固定じゃないので、ルーター再起動したりすると、IPアドレスが変わってしまう。
その為、家のサーバーで、5分おきに ipcheck.php を走らせて、DNS情報と、実際のIPアドレスに相違があるかをチェックしていて、違っていたら、XSERVERのDNSをAPIで変更するようになっている。
【皇紀2686年4月21日追加 ここから】
APIのパラメータはjsonエンコードが必要なので、ソースを変更しました。
【皇紀2686年4月21日追加 ここまで】
ダメージの数値見る限り、そんなに出てないけど、なぜかこの編成が一番早く敵を倒せるんだな。
最近、不正アクセスの遮断を調整しているが、VPSサーバーよりも家のサーバーの方がやたら多いのに気がついた。
|
1 2 3 4 5 6 7 8 9 10 |
noizumi@irc:~$ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 102 | |- Total failed: 930 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 635 |- Total banned: 667 `- Banned IP list: 101.47.141.214 103.143.231.99 103.149.27.208 <以下略> |
|
1 2 3 4 5 6 7 8 9 10 |
noizumi@silverfox:~ $ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 472 | |- Total failed: 2168 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 1503 |- Total banned: 1506 `- Banned IP list: 1.1.179.83 1.194.225.25 1.212.225.99 1.235.192.130 1.235.192.131 <以下略> |
VPSサーバーが 635件、家が 1,503件と倍以上の不正アクセスがある。
やはり、外に立てたサーバーより、家庭につないだ回線に存在するサーバーの方がセキュリティが甘いから、多いのかな?
適当なIPアドレスの範囲に対して、不正アクセスを試みていると思っていたが、ちゃんと確率の高そうな所へ資源の投入をしてるんだなあ。
まあ、家もVPSもsshdは公開鍵認証で、プライベートIPアドレスのみパスワード認証も許可している設定なので、そもそも総当たりのパスワード破りが最初からできないようにしてあるから、特に心配は無い。
しかし、ログにだらだらと記録されるのがウザいので、臭いにおいは元から断たなきゃダメという事で、接続遮断している 🙂
外も家も同条件のフィルタだが、3日間で4回以上の不正アクセスで1週間接続遮断し、それ以降も2週間以内に同じIPアドレスが不正アクセスして来たら、再犯ルールで1年間接続遮断するようにしている。
不正アクセスのパターンを見ていると、2~3回で止め、時間を置いて再び繰り返すという明らかに fail2ban の設定を意識した不正アクセスをして来ているので、判定期間を長めに取って、再犯ルールも追加したという次第。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[sshd] # "bantime" is the number of seconds that a host is banned. bantime = 1w # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 3d # "maxretry" is the number of failures before a host get banned. maxretry = 4 mode = aggressive [recidive] enabled = true bantime = 31536000 ; 1 year findtime = 1209600 ; 2 weeks maxretry = 2 |
ルーターは接続を通すポートのみポート変換機能で一々登録して通しているが、面倒くさがりだと、DMZとしてサーバー1台丸々外から見える状態にしてるってのもあるだろう。
踏み台にされて警察にお呼ばれする前に、厳密な設定の運用にした方がいい象。
Rasberry Pi OS liteのメールサーバーdovecotで、またパラメータが変わってて、Maildirの設定にちょっと苦労した。
mail_location が廃止されたので、namespace で解決するのが正しいようだ。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<前略> namespace inbox { inbox = yes separator = / prefix = "#mbox/" mail_driver = mbox mail_path = ~/mail mail_inbox_path = /var/mail/%{user} hidden = yes list = no } namespace maildir { separator = / prefix = mail_driver = maildir mail_path = ~/Maildir } <後略> |
INBOX は /var/mail/noizumi で、他のフォルダ類は Maildir形式の /home/noizumi/Maildir に保管してるので先の設定にした。
昔、mbox 形式だと、メールフォルダの階層化ができなくて、フォルダ削除して Trash/delFolder みたいな状況になると、削除できなくなるってのがあったので、Maildirにしている。
今、mbox はフォルダの階層化できるようになってるんだろうか? AIさんに聞いてみる 🙂
はい、IMAPを利用している場合、mbox形式のメールボックスであってもフォルダの階層化(サブフォルダ作成)は可能です。技術的には、ThunderbirdなどのIMAP対応メールクライアントを使用してサーバー上にフォルダを作成・管理することで、階層構造が実現されます。
あー、mboxはサーバー側にディレクトリを掘らずにファイルしか配置できないから、ファイル名に区切り文字で階層を表してる。
つまり、メールクライアントによっては、うまく判別できずに階層構造にならないって事もあり得るんだな。
じゃあ、Maildir形式の方がいいな。