Memo

メモ > サーバ > 各論: ネットワーク

ネットワーク
基礎からのネットワーク&サーバ構築 改訂版 まとめ - Qiita https://qiita.com/chrischris0801/items/b2e14655b86c96ca585f ■通信の用語 ネットワーク ... 複数のコンピュータを繋ぐ通信網。 AWSではVPCと呼ばれる。 サブネット ... ネットワーク内に作成する、規模の小さなネットワーク。 サブネットワークの略。 ゲートウェイ ... 異なるネットワーク間の相互通信を可能にする仕組み、または機器のこと。 インターネットゲートウェイとも呼ばれる。 ルーター ... 異なるネットワーク間を中継する通信機器。 デフォルトゲートウェイ ... 異なるネットワークへの出口。 つまりルーターのこと。 ルートテーブル ... 個々のネットワークの宛先への経路一覧を保持している、テーブル状のデータ構造。 ルーターやネットワーク接続されたコンピュータが持っている。 ルーティングテーブルとも呼ばれる。 デフォルトルート ... ルートテーブルに設定されていないIPアドレス宛てのすべてのパケットは、デフォルトルート経由で送信される。 一般的にデフォルトルートは、デフォルトゲートウェイを指すようになっている。 デフォルトルートは 0.0.0.0 と表記され、「すべてのアドレス」ということ。 ブロードキャストアドレス ... ネットワーク内のすべての端末にデータを送信するために使われる特殊なアドレス。 255.255.255.255 や 172.22.16.15 など、ネットワークの構成によって異なる。
サブネットマスク
IPアドレスの、どこからどこまでがネットワークを表し、どこからどこまでがコンピュータを表すのかを決めるもの。 IPアドレス 192 168 1 128 11000000 10101000 00000001 10000000 ... サブネットの1に対応する部分がネットワーク、0に対応する部分がコンピュータ。 サブネットマスク 255 255 255 0 11111111 11111111 11111111 00000000 ... 1が24個あるので「/24」と表記される。 以下の場合、コンピュータには「192.168.1.0 〜 192.168.1.255」のアドレスを割り当てられる。 192.168.1.0/24 サブネットマスク IPアドレス数 「192.168.1.1」の場合の例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /8 255.0.0.0 16777216 192.0.0.0 〜 192.255.255.255 /16 255.255.0.0 65536 192.168.0.0 〜 192.168.255.255 /24 255.255.255.0 256 192.168.1.0 〜 192.168.1.255 /28 255.255.255.240 16 192.168.1.0 〜 192.168.1.15 /32 255.255.255.255 1 グローバルIPアドレス(ネットワークにならない) サブネットマスク計算(IPv4)/サブネット一覧(早見表) https://note.cman.jp/network/subnetmask.cgi ■例1 以下のネットワークがあるとする。 10.0.0.0/16 (Production) 10.1.0.0/16 (Staging) 10.2.0.0/16 (Develop) この場合、Productionのサブネットは一例だが以下のようになる。 10.0.0.0/24 ... 10.0.0.0 〜 10.0.0.255 10.0.1.0/24 ... 10.0.1.0 〜 10.0.1.255 10.0.2.0/24 ... 10.0.2.0 〜 10.0.2.255 10.0.3.0/24 ... 10.0.3.0 〜 10.0.3.255 10.0.4.0/24 ... 10.0.4.0 〜 10.0.4.255 10.0.5.0/24 ... 10.0.5.0 〜 10.0.5.255 この場合、アドレスの割り当ては以下のようになる。 10.0.0.0 や 10.0.1.0 がネットワークアドレス(ネットワークを指すアドレス) 10.0.0.1 〜 10.0.0.254 や 10.0.1.1 〜 10.0.1.254 がホストアドレス(使用可能なアドレス) 10.0.0.255 や 10.0.1.255 がブロードキャストアドレス(ネットワーク内のすべての機器に送信するアドレス) ■例2 以下のネットワークがあるとする。 172.22.16.0/24 (Production) 172.22.17.0/24 (Staging) 172.22.20.0/24 (Develop) この場合、Productionのサブネットは一例だが以下のようになる。 172.22.16.0/28 ... 172.22.16.0 〜 172.22.16.15 172.22.16.16/28 ... 172.22.16.16 〜 172.22.16.31 172.22.16.32/28 ... 172.22.16.32 〜 172.22.16.47 172.22.16.48/28 ... 172.22.16.48 〜 172.22.16.63 172.22.16.64/28 ... 172.22.16.64 〜 172.22.16.79 172.22.16.80/28 ... 172.22.16.80 〜 172.22.16.95 この場合、アドレスの割り当ては以下のようになる。 172.22.16.0 や 172.22.16.16 がネットワークアドレス(ネットワークを指すアドレス) 172.22.16.1 〜 172.22.16.14 や 172.22.16.17 〜 172.22.16.30 がホストアドレス(使用可能なアドレス) 172.22.16.15 や 172.22.16.31 がブロードキャストアドレス(ネットワーク内のすべての機器に送信するアドレス)
プライベートIPアドレス
プライベートIPアドレスには 10.0.0.0 〜 10.255.255.255 ... 大規模ネットワーク向け。 172.16.0.0 〜 172.32.255.255 ... 中規模ネットワーク向け。 192.168.0.0 〜 192.168.255.255 ... 小規模ネットワーク向け。 が使える。 また、127.0.0.1 〜 127.0.0.254 はローカルループバックアドレス。(自分自身を表す。) IPアドレスの基礎知識 https://qiita.com/mogulla3/items/efb4c9328d82d24d98e6 以下は「何故 192.168 のような番号なのか」の記事。 ただし「RFCで192と書かれているから」というだけで、192.168 が選ばれた理由は見当たらなかった。 二進数などで考えたときにキリがいいのかと思ったが、前述の「サブネットマスク」を確認する限りそうでも無さそうな。 なぜ「192.168.x.x」のアドレスを使う? | 日経クロステック(xTECH) https://xtech.nikkei.com/it/free/NNW/NETHOT/20040624/146335/ なぜローカルIPアドレスは192.168.x.xが多いのか #Network - Qiita https://qiita.com/snsk871/items/c3492a3893cea6043d5d IPアドレスの192.168の192や168は固定ですが、なぜこ... - Yahoo!知恵袋 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12260767502 グローバルIPアドレスとプライベートIPアドレスの違いとは?【初心者向け・図解付】 | 情シスマン https://www.gate02.ne.jp/media/it/column_98/
ドメイン
■ドメインとサブドメイン ドメインは、インターネット上の住所。 サブドメインは、ドメイン内に割り当てられるドメイン。 ドメインとは?メリット・種類・決め方をかんたんに解説|ドメイン取るならお名前.com https://www.onamae.com/clever/about/domain.html ■FQDN Fully Qualified Domain Nameの略で、直訳すると「完全修飾ドメイン名」となる。 http://www.refirio.net/ の場合、以下のようになっている。 www ... ホスト名 refirio.net ... ドメイン名 www.refirio.net ... FQDN つまり、ホスト名を省略しないドメイン名となる。 厳密には一番右端に「.(ピリオド)」を付ける。このピリオドは、ルートノードを示している。 FQDNとは?ドメイン名・ホスト名・IPアドレスとの違い | カゴヤのサーバー研究室 https://www.kagoya.jp/howto/network/fqdn/ FQDN − @IT ネットワーク用語事典 https://www.atmarkit.co.jp/aig/06network/fqdn.html ■DNS ホスト名に対するIPアドレスとドメイン名を変換することを名前解決という。 名前解決の仕組みのことをDNS(ドメインネームシステム)と呼び、その役割を持ったサーバを「DNSサーバ」という。 DNSの情報は /etc/resolv.conf に記録されている。 さくらの物理サーバでは、以下のようになっていた。(例示用に、内容は改変している。)
$ vi /etc/resolv.conf
nameserver 133.242.0.3 nameserver 2001:DB8::1 nameserver 133.242.0.4 options single-request-reopen
AWSのEC2では、以下のようになっていた。(例示用に、内容は改変している。)
$ vi /etc/resolv.conf
options timeout:2 attempts:5 ; generated by /sbin/dhclient-script search ap-northeast-1.compute.internal refirio.net nameserver 10.1.0.2
まず、指定したDNSサーバ(フルサービスリゾルバ)に問い合わせる。 (フルサービスリゾルバーは通常、プロバイダーが用意したDNSサーバーになる。) まずDNSルートサーバーに問い合わせるが、このサーバーは世界に13台しか無い。 負荷が集中することになるので、一度問い合わせた内容は一定時間キャッシュされる。 BINDで実際にDNSサーバを構築すると理解が深まるかも。 DNSの仕組みと調査方法について - embryo http://embryo.hatenadiary.com/entry/2017/11/21/152225 インターネット10分講座:DNSルートサーバ - JPNIC https://www.nic.ad.jp/ja/newsletter/No45/0800.html DNSサーバー構築(BIND) - CentOSで自宅サーバー構築 https://centossrv.com/bind.shtml 浸透いうな! http://www.e-ontap.com/dns/propagation/ DNSで浸透って言っちゃだめなの? - @tmtms のメモ https://tmtms.hatenablog.com/entry/201805/dns ■DNSの文字数制限 さくらのDNSにDKIM用レコードを登録しようとすると、「255文字以下で入力してください」「行頭・行末に引用符「"」を記載してください」というエラーが発生した。 (AWSのRoute53では制限が無かったが。) この場合、以下のように「適当な場所で区切ったうえで、各行を引用符でくくる」という加工を行ったうえで登録するといい。
"v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxfCFe8mdOdtL3oRVepm7" "nJVGbWT3CBhZRGcCq/NzWFGP9SsAycraP5F1y9C8bnlh8thA1FJSPHgAWQig7yZf" 〜中略〜 "ENSo8xU1ZhXbhMJsVCOVzqj6GmPGhVrfBP9//mJDnpv2sxYZpgZ5mH5StDG7fHms" "Y9/y4/OSDjSZgG30+QOs1zJAxmUms9dazVP8HLXpfINjcPGPuzNjpGzsl57UwXVL" "/QIDAQAB"
■DNSラウンドロビン 1つのドメインに複数のIPアドレスを割り当てることで、負荷分散ができる。 AWSでの設定について確認したときの内容が、AWS.txt の「DNSラウンドロビン」にある。 ■whois ドメインの登録者を検索する仕組み。
$ whois refirio.net … ドメインのwhois情報を確認。 [Querying whois.verisign-grs.com] [whois.verisign-grs.com] Domain Name: REFIRIO.NET Registry Domain ID: 1836407608_DOMAIN_NET-VRSN Registrar WHOIS Server: whois.discount-domain.com Registrar URL: http://gmo.jp Updated Date: 2018-10-22T22:45:38Z Creation Date: 2013-11-22T02:28:15Z Registry Expiry Date: 2019-11-22T02:28:15Z Registrar: GMO Internet, Inc. d/b/a Onamae.com Registrar IANA ID: 49 Registrar Abuse Contact Email: abuse@gmo.jp Registrar Abuse Contact Phone: +81.337709199 Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited Name Server: DNS01.MUUMUU-DOMAIN.COM Name Server: DNS02.MUUMUU-DOMAIN.COM DNSSEC: unsigned URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/ >>> Last update of whois database: 2019-01-29T05:09:35Z <<< For more information on Whois status codes, please visit https://icann.org/epp
whoisコマンドが見つからない(CentOSなど)場合、以下のようにすればインストールできる。
# yum install jwhois
■ドメインの情報 digコマンドを使えば、ドメインの情報を確認できる。
$ dig refirio.net any … 特定ドメインの情報を取得。 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.2 <<>> refirio.net any ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63302 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;refirio.net IN ANY ;; ANSWER SECTION: refirio.net. 3600 IN NS ns1.dns.ne.jp. refirio.net. 3600 IN NS ns2.dns.ne.jp. refirio.net. 3600 IN MX 10 mail1.refirio.net. refirio.net. 3600 IN MX 20 mail2.refirio.net. refirio.net. 3600 IN A 153.121.33.84 refirio.net. 3600 IN SPF "v=spf1 +ip4:153.121.33.84 -all" refirio.net. 3600 IN SOA master.dns.ne.jp. tech.sakura.ad.jp. 2017032202 3600 900 3600000 3600 ;; Query time: 3 msec ;; SERVER: 210.188.224.10#53(210.188.224.10) ;; WHEN: Sun Jun 11 23:48:17 2017 ;; MSG SIZE rcvd: 206
「any」オプションですべての情報を表示、例えば「txt」だとTXTレコードのみ表示、省略するとドメインに対応するIPアドレスを表示する。 「ANSWER SECTION」にあるレコードの意味は以下のとおり。 FQDNは「Fully Qualified Domain Name」の略で何も省略しない完全修飾ドメイン名。 TTLは「Time To Live」の略で生存期間。 FQDN TTL INternet Address IPアドレス refirio.net. 3600 IN A 153.121.33.84 各レコードの意味は以下の通り。 ・NS(Name Server) ... ドメインの権限を持つDNSサーバ。可用性向上のため、通常複数台用意されている。 ・MX(Mail eXchanger) ... メールの送受信で使うドメイン。「10」「20」は、数字が小さいものが優先的に参照される。 ・A(Address) ... ドメインからIPアドレスを調べる際に参照される。正引きする際に必須。 ・SPF(Sender Policy Framework) ... 改ざんが容易に出来てしまうメールの仕組み上、本当にそのドメインから送られてきてるよ、という証明。 ・SOA(Start Of Authority) ... どのDNSサーバがどのドメインを管理しているのかを宣言する。 SOAレコードの後ろの数字の意味は以下の通り。 ・serial ... シリアル番号。ゾーンファイルを新しく更新しても、このシリアル番号が低いものは更新されない。 番号であれば何でも良いが、「年月日」+「連番」を記述するのが定石となってる。 ・reflesh ... 更新時間。スレーブの更新タイミングの目安となる秒数。 ・retry ... 再試行時間。再実行する際にウェイトする秒数。 ・expiry ... 有効期限。マスターがダウンしてる際の生存期間。 ・minimum ... ネガティブキャッシュの生存期間。デフォルトのTTL。 他に以下のようなレコードもある。 ・PTR(PoinTeR) ... 逆引き用のレコード。Aレコードの逆。 ・CNAME(Canonical Name) ... ドメインに別名を付ける場合に指定する。元になるドメインはAレコードで指定されたものを使う。 最後にピリオドが付くので注意。(サービスによっては自動的に補完される。) ・SPF(Sender Policy Framework) ... TXTレコードの一種。電子メールの送信元ドメインが詐称されていないかを検査するための仕組み。 TXTレコードと同一の内容を設定しておく。 なおdigコマンドで以下のように「+short」を指定すれば、ANSWER SECTIONの値のみ取得できる。
$ dig refirio.net any +short ns1.dns.ne.jp. ns2.dns.ne.jp. 10 mail1.refirio.net. 20 mail2.refirio.net. 153.121.33.84 "v=spf1 +ip4:153.121.33.84 -all" master.dns.ne.jp. tech.sakura.ad.jp. 2017032202 3600 900 3600000 3600
以下のようにすれば、IPアドレスのみ取得できる。
$ dig refirio.net a +short 153.121.33.84
【 dig 】コマンド――ドメイン名からIPアドレスを調べる:Linux基本コマンドTips(158) - @IT https://www.atmarkit.co.jp/ait/articles/1711/09/news020.html 俺のDNS - 脱・初心者のためのメモ https://qiita.com/Ogaaaan/items/b3ceb8827e98ce40f5f2 DNSとは http://wa3.i-3-i.info/word1287.html DNSサーバとは http://wa3.i-3-i.info/word1288.html フルサービスリゾルバ (full-service resolver)とは https://wa3.i-3-i.info/word1776.html DNSルートサーバとは https://wa3.i-3-i.info/word12282.html 権威DNSサーバとは https://wa3.i-3-i.info/word12272.html 以前やった社内向けDNS勉強会の資料を公開してみた https://dev.classmethod.jp/cloud/dns-study/ ゾーンファイル (zone file)とは https://wa3.i-3-i.info/word12283.html リソースレコード (resource record)とは https://wa3.i-3-i.info/word12301.html NSレコードとは http://wa3.i-3-i.info/word12286.html SOAレコードとは http://wa3.i-3-i.info/word12285.html Aレコードとは http://wa3.i-3-i.info/word12288.html AAAAレコードとは http://wa3.i-3-i.info/word12289.html CNAMEレコードとは http://wa3.i-3-i.info/word12290.html MXレコードとは http://wa3.i-3-i.info/word12287.html TXTレコードとは http://wa3.i-3-i.info/word12294.html SPFレコードとは http://wa3.i-3-i.info/word12304.html 以下のブラウザツールで調べることもできる。 nslookup(dig)テスト【DNSサーバ接続確認】 https://www.cman.jp/network/support/nslookup.html 以下のようにすると、GoogleのDNSサーバを使って情報を取得できる。GoogleのDNSサーバを使うと高速になる、と言われている。 ただし、表示されるTTLの値に差があったりする。問題ないのかは要勉強。
$ dig @8.8.8.8 refirio.net any
【 dig 】コマンド――ドメイン名からIPアドレスを調べる:Linux基本コマンドTips(158) - @IT http://www.atmarkit.co.jp/ait/articles/1711/09/news020.html 最後にピリオドが付くので注意。(サービスによっては自動的に補完される。) DNSレコードの最後のドット「.」は大事 - Qiita https://qiita.com/tobari_ko/items/1310384f7b6b24d01fc7 VALUE-DOMAINでcname設定時、最後に.(ドット)を付けないと困る理由 | 怪しい物を開発するブログ https://blog.supersonico.info/?p=1820 ■ドメインの運用履歴 過去どのようにドメインが割り当てられていたかは、以下のサイトで確認できる。 Wayback Machine https://web.archive.org/
ポート
【3分で把握】ポート番号とは?と代表的なポート番号まとめ https://eng-entrance.com/network-port ポートとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 https://wa3.i-3-i.info/word1774.html ■メール送信のポート メールはかつて25番ポートで送信&転送されていたが、このポートには認証機能が無かった。 迷惑メールが問題になってきたので、「メールはStartTLSで暗号化し、587番ポートを使って送信しよう」となった。このポートには認証機能を設けた。 ただし「メールは465番ポートを使って暗号化して送信しよう」と議論されたこともあった。 よって、正式には587番ポートでの送信が推奨されるが、大抵のサーバでは465番ポートも送信できる。 …というものらしい なおサーバ間のメール転送には、引き続き25番ポートが使用されている。 ポート465と587の違いとは? | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=12945 ポート465か587 どっちを選択すべきか SMTPのポート番号 - ムラカミドットプロ https://murakami.pro/smtps/ SMTP25番ポートと587番ポートの違い #SMTP - Qiita https://qiita.com/DJ-yamada/items/79a6d1ac53126b417367 正しいSMTPポートの選び方(ポート番号25、587、465、2525) https://kinsta.com/jp/blog/smtp-port/ どのSMTPポートを使用すればいいですか?ポート25か587のどちらでしょうか? | Cloudflare https://www.cloudflare.com/ja-jp/learning/email-security/smtp-port-25-587/ 【図解】メールの暗号化で使われるSTARTTLSとは?仕組みと利用方法を解説します - カゴヤのサーバー研究室 https://www.kagoya.jp/howto/it-glossary/mail/starttls/
例示用のドメインとIPアドレス
適当なドメインやIPアドレスを使うと、実在のものを指定してしまうことがある。 例示用として以下が用意されているので、こちらを使う。 example.com example.net example.org 192.0.2.0/24 198.51.100.0/24 203.0.113.0/24 2001:DB8::/32 test.comやaaa.comをテストデータに使うのはやめましょうという話 https://blog.ko31.com/201304/sample-domain-example/
RFC
RFC(Request for Comments)は、 インターネットで用いられるさまざまな技術の標準化や運用に関する事項など、 幅広い情報共有を行うために公開される文書。 インターネット10分講座 - JPNIC https://www.nic.ad.jp/ja/newsletter/No24/090.html RFCの読み方 - インフラエンジニアway - Powered by HEARTBEATS https://heartbeats.jp/hbblog/2023/04/rfc.html
セキュア通信
エンジニアなら知っておきたい、絵で見てわかるセキュア通信の基本 - Qiita https://qiita.com/t_nakayama0714/items/83ac0b12ced9e7083927 今なぜHTTPS化なのか?インターネットの信頼性のために、技術者が知っておきたいTLSの歴史と技術背景 - エンジニアHub|若手Webエンジニアのキャリアを考える! https://employment.en-japan.com/engineerhub/entry/2018/02/14/110000 リミット間近の「常時SSL」移行、5つのシナリオと陥りやすい落とし穴とは | 【レポート】Web担当者Forumミーティング 2018 Spring | Web担当者Forum https://webtan.impress.co.jp/e/2018/05/23/29268?amp ■情報セキュリティのCIA C ... Confidentiality(機密性) I ... Integrity(完全性) A ... Availability(可用性) ■SSL/TLSとHTTPS SSL ... Secure Sockets Layer。通信相手の認証、通信内容の暗号化、改竄の検出を行うプロトコル。 TLS ... Transport Layer Security。SSLの次期バージョン。 HTTPS ... Hypertext Transfer Protocol Secure。セキュアな接続をHTTPで行うこと。 ■公開鍵 情報を暗号化して送るにあたって、暗号化と復号化を行うための共通鍵(秘密の文字列)をどうやって渡すか。という問題。 普通に考えると 1. メッセージに鍵をかける。メッセージを守る鍵を安全に受け渡す必要がある。 2. 鍵に鍵をかける。鍵を守る鍵を安全に受け渡す必要がある。 となってしまう。 この問題は、一般的なセキュア通信では以下のようにして解決している。 1. 送信者は、受信者から受信者の鍵(暗号化用)を取得する。 2. 送信者は受信者の鍵(暗号化用)でメッセージを保護、送信する。 3. 受信者は自分の鍵(復号化用)でかけられた保護を解除し、メッセージを受け取る。 送信者が取得する鍵は公開されるため、公開鍵暗号と呼ばれる。 また、公開される鍵のことを公開鍵と呼び、公開されない鍵のことを秘密鍵と呼ぶ。 ただし暗号化用の鍵をもとに復号化用の鍵を作成されてしまうと、この方法は成り立たなくなる。 「暗号化はできるが、復号化には結びつかない鍵」として、素因数分解が使われる。(このアルゴリズムをRSAと呼ぶ。) 「合成数から素数を得る」計算は、その逆の「素数から合成数を得る」に比べてコストが非常に高いことが利用される。 ただし公開鍵暗号は共通鍵暗号に比べて暗号化&復号の総計算コストが高いため、実際にHTTPSで情報をやりとりする場合には。 1. SSL認証を行いつつ、送信者が受信者の公開鍵を取得する。 2. 送信者はその場限りの共通鍵を生成し、公開鍵で暗号化して受信者に送信する。 3. 受信者は復号を行い、共通鍵を取得する。 のように、「公開鍵暗号+共通鍵暗号」というハイブリッド方式を取る。 これにより、安全性と高速性の両立を図っている。 ■RSA暗号の原理とその解読 3288743189 と 3285521957 の積は 10805237958393700873 である…という計算はコンピュータなら容易だが、 10805237958393700873 は何と何の素数の積か?…という計算には、桁が多くなると非常に時間がかかる。 (素因数分解は総当たりで求めるしか方法が無いため。) 秘密鍵には「3288743189 と 3285521957 の積は 10805237958393700873 である」という情報を含ませているが、 公開鍵には「10805237958393700873」という積しか持たせていない。 これにより、「秘密鍵から公開鍵を作成するのは容易だが、公開鍵から秘密鍵を作成するのは難しい」を実現させている。 ただし数値の桁数が小さいと解読されてしまうため、現在は2048bit(256byte)で秘密鍵を作るのが一般的になっている。 短いビット長ならRSA暗号の解読は可能。 具体的な手順は以下が参考になる。 (短いビット長の)RSA暗号を解いてみる - clock-up-blog http://blog.clock-up.jp/entry/2016/12/15/crack-rsa-key ■SSL証明書の発行 1. SSLを適用させたいサーバ上で、秘密鍵を作成する。この鍵は流出してはいけない。 2. 秘密鍵をもとにCSRを作成する。CSRには公開鍵、発行者情報やコモンネーム(FQDN)、電子署名(もとのCSRをハッシュ化し、さらに秘密鍵で暗号化したもの)が含まれる。 3. CSRを認証局に渡すと、認証局が自身の秘密鍵を使ってCSRに電子署名を付与する。これがSSL証明書となる。 4. SSL証明書を、SSLを適用させたいサーバに設置する。 ■中間証明書 証明書の発行はオンラインで迅速に行えるといいが、オンラインであるがゆえに、認証局の脆弱性を突かれて不正な証明書発行がされる可能性がある。 このとき、認証局が発行したすべての証明書を無効にする必要があるが、影響範囲が非常に大きい。 この対策に、認証局はオフラインで構築し、別途構築した複数の中間証明局で証明書を発行する。 これなら中間認証局が攻撃された際の、影響範囲を抑えることができる。 ■共通鍵で可逆暗号化 同じアルゴリズムというわけではないが、参考程度に。 PHPで可逆暗号化 | refirio.org http://refirio.org/view/350
SSHでアクセスする
■導入 sshコマンドで、リモートサーバに接続できる。 ※クライアント環境がLinuxやMacなら、今は特に追加ソフトウェアのインストールの必要もなくsshコマンドを使える。 ※Windowsの場合はsshコマンドが標準機能ではないが、 Git for Windows をインストールすると付属の Git Bash から使えるようになる。 多くの解説ではWindowsではPuTTYのインストールが解説されているが、 「Windows環境でSSHコマンドを使うにはPuTTYが必須」ということは無さそう。 Git for Windows インストール&設定 - Qiita https://qiita.com/shinsumicco/items/a1c799640131ae33c792 git for windows だけで出来る ssh - himadatenodeの日記 http://d.hatena.ne.jp/himadatanode/20160823/p1 WindowsからSSH接続を利用するなら、以下のようなクライアントソフトをインストールするのもの有効。 (Poderosaは多段接続には対応していないが、通常の利用には問題ない。) Poderosa https://ja.osdn.net/projects/sfnet_poderosa/ ■導入(非推奨手順) ※上に記載した「導入」の手順を推奨。 WindowsのPowerShellとコマンドプロンプトで、SSHコマンドを使えるようにする場合。 https://github.com/PowerShell/Win32-OpenSSH/releases から OpenSSH-Win64.zip をダウンロード。 展開すると作成される OpenSSH-Win64 を C:\ に置く。(C:\OpenSSH-Win64 内にプログラムがある状態にする。) Windowsのシステム環境変数のPathに C:\OpenSSH-Win64 を追加する。 PowerShellを開き、「ssh」と入力して、コマンドが使えることを確認する。 コマンドプロンプトを開き、コマンドが使えることを確認する。 これでSSHコマンドを使える。 …が、多段接続をしようとすると(正確には「ProxyCommand」を使おうとすると) 「Proxy connect is not supported in Windows yet」 と表示された。Windows版では、まだ多段接続はできないみたい。 前述の Git Bash なら多段接続も問題なしなので、Windows環境なら現状はこちらを推奨。 sshをWindowsコマンドプロンプトで実行する手順 | 無停電電源装置(UPS) | イートン https://www.eaton-daitron.jp/techblog/4627.html Windows環境から SSHでポートフォワード(port forwarding)[別名 SSHトンネル]するには何が最適か? - Qiita https://qiita.com/ynott/items/6f0088b412b3a4128910 以下、Windows環境の Git Bash で検証したもの。 ■SSH接続の確認 以下はWindowsのPowerShellからAWSのEC2に接続する例だが、他への接続でも書き方は同じ。 (鍵認証しない場合、「-i」とその後のファイル指定は不要。)
$ ssh -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-dev.pem ec2-user@203.0.113.1
C:\Users\refirio\.ssh\config で以下のように設定しておくと、「ssh refirio-dev」のみで接続できる。 (configファイルが無ければ、自分で新規に作成する。)
Host refirio-dev Hostname 203.0.113.1 User ec2-user Port 10022 IdentityFile C:/Users/refirio/Documents/SSH/refirio/refirio-dev.pem IdentitiesOnly yes
~/.ssh/configについて - Qiita https://qiita.com/passol78/items/2ad123e39efeb1a5286b なお、コマンドプロンプトからも以下のように接続できる。
>ssh -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-dev.pem ec2-user@203.0.113.1
SSHで多段接続とポートフォワーディング
■ポートフォワーディングの概要 ローカルコンピュータの特定のポートに送られてきたデータを、 別な通信経路を用いてリモートコンピュータの特定ポートに送信すること。 「トンネル」「トンネリング」などと呼ばれたりもする。 ポートフォワードとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 https://wa3.i-3-i.info/word12664.html 混乱しがちな「SSHトンネルの確立方法」をイメージ図とセットでまとめたコマンド集 - GIGAZINE https://gigazine.net/amp/20210209-ssh-tunnel ■SSH多段接続の確認 C:\Users\refirio\.ssh\config で以下のように設定しておくと、「ssh refirio-entrance」のみで接続できる。 (Poderosaは多段接続に対応していないようなので、Git Bash や ConEmuで試した。) さらに「ssh refirio-web1」とすれば、refirio-entrance を経由して refirio-web1 に多段接続できる。 踏み台サーバを経由して本番サーバに接続する場合、何度もsshコマンドを入力せずとも接続できる。 踏み台サーバと本番サーバで別々の鍵を使う場合、両方の鍵が接続元のローカルに必要。 (逆に言えば、踏み台サーバに本番サーバの鍵を置く必要は無い。)
Host refirio-entrance Hostname 203.0.113.2 User ec2-user Port 10022 IdentityFile C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem IdentitiesOnly yes Host refirio-web1 Hostname 10.0.1.3 User ec2-user Port 10022 IdentityFile C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem IdentitiesOnly yes ProxyCommand ssh refirio-entrance -W %h:%p
■ポートフォワーディングの実行(Vagrant) Windows環境で、Vagrant(http://192.168.10.10/ であるとする)に対してポートフォワーディングを実行する。
$ ssh -fNCL 0.0.0.0:80:localhost:80 vagrant@192.168.10.10 The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established. ECDSA key fingerprint is SHA256:s6TtuBDr5iBjWO9atbRydfyuY8+dAz45l408mEpfc04. Are you sure you want to continue connecting (yes/no)? yes … 「yes」を入力。(初回のみ。) Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts. … セキュリティ警告が出るが承認。
コマンドの意味は 「80番ポートのすべてのパケット(0.0.0.0:80)を localhost:80 に転送する。vagrant@192.168.10.10 をゲートウェイとする」 となる。 オプション「-fNCL」の意味は以下のとおり。 -f ... SSHをバックグラウンドで実行する。 -N ... リモートのコマンドを実行せず、待機状態にする。 -C ... データを圧縮して送る。 -L ... ポートフォワーディングを行う。 これで自身からは http://192.168.10.10/ だけでなく、 http://127.0.0.1/ http://localhost/ でもVagrantにアクセスできるようになる。 (この状態なら、自身のIPアドレスを指定すれば、同一ネットワークの他端末からのブラウザアクセスが可能。) なお対象サーバを再起動した場合、SSH接続が切れるのでポートフォワーディングも解除される。 以下のようにconfigの名前を指定してポートフォワーディングを行えば、configの内容で接続したり、多段接続したりもできる。
$ ssh -fNCL 0.0.0.0:80:localhost:80 refirio-dev $ ssh -fNCL 0.0.0.0:80:localhost:80 refirio-web1
ポートフォワーディングを終了させる場合、以下のようにする。
$ ps | grep ssh … SSHのプロセス番号を確認。 9260 1 9260 9260 ? 197609 14:12:18 /usr/bin/ssh $ kill 9260 … SSHを終了。
なお、コマンドプロンプトでポートフォワーディングを行った場合、以下で確認&終了できる。
>tasklist | findstr ssh … タスク一覧を確認。 >taskkill /F /IM ssh.exe … SSHを終了。
SSH でファイアウォールを越える - いますぐ実践! Linuxシステム管理 / Vol.101 http://www.usupi.org/sysad/101.html ポートフォワーディングで80番ポートを解放せずにブラウジングする - はむはむエンジニアぶろぐ http://hamuhamu.hatenablog.jp/entry/2017/05/05/095509 SSHポートフォワーディングを知った話 - Qiita https://qiita.com/Ayaka14/items/449e2236af4b8c2beb81 SSH ポートフォワーディング http://www14.plala.or.jp/campus-note/vine_linux/server_ssh/ssh_portforwarding.html Windows でコマンドラインでプロセスを kill する - ablog http://d.hatena.ne.jp/yohei-a/20090911/1252644040 踏み台サーバ経由で SSH ポートフォワーディングする手順 - Neo's World https://neos21.net/blog/2019/08/26-01.html Linux | 多段SSH, ポートフォワーディングの方法 - わくわくBank https://www.wakuwakubank.com/posts/681-ssh-portforward-multistage/ SSHポートフォワードで、Linuxサーバを踏み台に、その先に通信 [インフラエンジニアのPC環境] https://pc.oreda.net/tips/sshportfoward ■ポートフォワーディングの実行(EC2) ※「ポートフォワーディングの実行(Vagrant)」も参照。 Windows環境から、EC2に対してポートフォワーディングを実行する。 以下で対象のEC2に接続できるものとする。
> ssh ec2-user@203.0.113.1 -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
以下でポートフォワーディングを実行。
> ssh -NCL 80:localhost:80 ec2-user@203.0.113.1 -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
10秒ほど待ってから http://localhost/ にアクセスすると http://203.0.113.1/ の内容が表示されるようになった。 localhostにアクセスしたとき、サーバには以下のようなアクセスログが記録された。
127.0.0.1 - - [06/Dec/2023:13:34:19 +0900] "GET / HTTP/1.1" 200 136 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" 682 - - any
「Ctrl+C」でキャンセルすると、もとの状態に戻った。 なおタスクの確認と強制終了は、以下のコマンドで行える。
> tasklist | findstr ssh > taskkill /F /IM ssh.exe
■ポートフォワーディングの実行(接続元IPアドレスの変更) IPアドレスを変更した状態で、ブラウザソフト経由で他サイトにアクセスする。 https://www.cman.jp/network/support/go_access.cgi IPアドレスは「203.0.113.99」と表示されるとする 以下を実行する。
> ssh -NCL 80:www.cman.jp:80 ec2-user@203.0.113.1 -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
10秒ほど待つ。 https://www.cman.jp/network/support/go_access.cgi IPアドレスは「203.0.113.99」と表示されるが、 http://localhost/network/support/go_access.cgi http://127.0.0.1/network/support/go_access.cgi にアクセスするとIPアドレスは「203.0.113.1」と表示される さらに C:/windows/System32/drivers/etc/hosts で以下を設定すると。
127.0.0.1 www.cman.jp
http://www.cman.jp/network/support/go_access.cgi IPアドレスは「52.193.221.232」と表示される。 つまり、接続元IPアドレスを変更できている。 ※httpsでアクセスすると、「この接続ではプライバシーが保護されません」と表示されるので注意。 ※さらに他サイトからデータを引っ張ってきている場合、その部分は表示されない可能性があるので注意。 ■ConEmuで多段接続 コマンドでの接続は、前述の「SSH多段接続の確認」を参照。 Poderosaは多段接続に対応していないようなので、ConEmuを試した。 (PoderosaでもいったんローカルのSSHにアクセスするなどすれば、多段接続できると思われる。がアクセスが面倒。) Git Bash なら多段接続できるが、Git Bash は画面の色設定をカスタマイズするのが大変そう。 ConEmuがよく紹介されているので試した。 Git Bashでディレクトリが見にくいので、カラー設定を変更する - みちしるべ http://orangeclover.hatenablog.com/entry/20120922/1348261855 ConEmu 突っ込んだら Git for Windows の Git Bash がカッコよくなった - てっく煮ブログ http://tech.nitoyon.com/ja/blog/2014/03/07/fancy-git-bash/ https://conemu.github.io/ にアクセス 「Download」をクリック 「Download ConEmu Stable, Installer (32-bit, 64-bit)」からダウンロードし、インストール まずは画面の色を調整する。ConEmuを起動し、 View (pallets) → <Solarized (Luke Maciak)> とすれば「Solarized (Luke Maciak)」の色をプレビューできる。好みのものを探す。 Settings → Features → Colors 「Schemes」で起動時の色を設定する。 次にConEmuで Git Bash を使えるようにする。 Settings → Startup → Tasks 「Predefined tasks」で「7 {Bash::Git bash}」を選択。 「Hotkey」に「F1」を入力。 下部のテキストエリアに以下を入力。 "%ProgramFiles%\Git\bin\sh.exe" --login -i -new_console:d:C:\Users\refirio これでConEmuを起動してF1キーを押すと、Git Bash を使えるようになる。 起動時に初めから Git Bash を使いたければ、 Settings → Startup で「Specified named task」で「{Bash::Git bash}」を選択する。 ConEmuの設定については、以下のページも参考になる。 おすすめのCUI環境〜GitBashとConEmu〜 - Qiita https://qiita.com/CyberMergina/items/69cd5890f05d502716c8 Windows その3 - ConEmuで快適なコンソール環境を・おすすめのコンソールエミュレーター - kledgeb https://kledgeb.blogspot.jp/2017/01/windows-3-conemu.html 以下、その他の設定メモ。 viなどからCtrl+Vでテキストを貼り付けると、複数行でも1行のテキストとして貼り付けられる。 以下のように設定すると、複数行のまま貼り付けることができる。 Settings → keys & Macro → Paste 「Paste mode #2 (Ctrl+V)」で「Multi lines」にする。 ■SFTPで多段接続 FileZillaは多段接続に対応していないため、踏み台サーバがあると使えない。 C:\Users\refirio\.ssh\config の設定を使ったり、ポートフォワーディングでアクセスしようとしたが、接続できず。 設定できなくは無さそうなので、引き続き要勉強。 ポートフォワードを使って踏み台先のサーバにFileZillaでファイル送受信する - C-Production https://c-production.com/8thnote/?p=1626 Windows環境の場合、WinSCPが標準で多段接続に対応しているので、これを使うのが定番になっているみたい。 以下のようにすれば接続できたので、いったんWinSCPで対応。 (最終的な接続先と踏み台の設定を逆にしないように注意。) むしろ、コマンドやポートフォワーディングの知識が無い人でも使えるので、WinSCPを使う方がいいかもしれない。 通常の接続: 「ログイン」ウインドウの「セッション」に、接続情報を設定する。 鍵を使った接続: 「ログイン」ウインドウの「セッション」に、接続情報を設定する。 鍵は「設定 → SSH → 認証 → 認証条件 → 秘密鍵」に設定する。 多段接続での接続: 「ログイン」ウインドウの「セッション」に、最終的な接続先(踏み台ではない)を設定する。 鍵が必要なら「設定 → SSH → 認証 → 認証条件 → 秘密鍵」に設定する。 踏み台サーバの情報は「設定 → 接続 → トンネル」に設定する。
サーバ同士でSSH接続
■通常の接続 「203.0.113.1」サーバに、「ec2-user」ユーザで、「10022」番ポートに接続。
# ping 203.0.113.1 … 疎通確認。 # ssh -p 10022 ec2-user@203.0.113.1 … 接続。
■鍵で接続 「-i」に続けて秘密鍵を指定できる。 秘密鍵を指定してアクセスする手順。 秘密鍵はあらかじめ入手済みとする。 以下、パブリックIPを持たないEC2インスタンへ、同じネットワーク内のEC2インスタンスから鍵認証で接続する。
# sudo vi /home/ec2-user/.ssh/id_rsa … アクセス元のサーバで、秘密鍵をid_rsaに作成。
-----BEGIN RSA PRIVATE KEY----- … 秘密鍵(xxx.pem)の内容を全てコピーして貼り付ける。 MIIEowIBAAKCAQEAryCYY8j+j5lQqBKJgdA3SLZWC7UJ9NeFkmypG4JJQwt3Gr9jG+rJY8vKUdx/ 〜略〜 yT0043TsaaS2Tx7KxqdFksrRW3IH0AKqXFKVcvdhuNbjVK5ps806PEaW/AZj5oIOfpto -----END RSA PRIVATE KEY-----
# sudo chmod 600 /home/ec2-user/.ssh/id_rsa … id_rsaのパーミッションを変更。 # sudo chown ec2-user:ec2-user /home/ec2-user/.ssh/id_rsa … id_rsaの所有者を変更。 # ssh -p 10022 -i /home/ec2-user/.ssh/id_rsa ec2-user@10.0.1.103 … SSH接続。(対象のIPが「10.0.1.103」とする。)
もしくは、以下のように指定しても接続できる。(要検証。)
# eval `ssh-agent` # ssh-add /home/ec2-user/.ssh/id_rsa # ssh -p 10022 ec2-user@10.0.1.103
ssh公開鍵認証を実装する - Qiita https://qiita.com/HamaTech/items/21bb9761f326c4d4aa65 ssh-agentの使い方 - Qiita http://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf ■鍵で接続(ユーザや鍵も新規作成する場合の例) アクセス先でユーザを作成。
# useradd deployer # passwd deployer abcd1234
アクセス元からパスワードでのアクセスを確認。
$ ssh deployer@192.168.33.11
アクセス先で鍵を作成。
$ sudo su - deployer $ ssh-keygen -t rsa $ ll /home/deployer/.ssh/ $ vi /home/deployer/.ssh/id_rsa $ vi /home/deployer/.ssh/id_rsa.pub $ cp /home/deployer/.ssh/id_rsa.pub /home/deployer/.ssh/authorized_keys $ chown deployer. /home/deployer/.ssh/authorized_keys $ chmod 0600 /home/deployer/.ssh/authorized_keys
アクセス元で鍵を作成。 id_rsaの内容はアクセス先の内容をコピーする。
$ mkdir /home/vagrant/deployer $ vi /home/vagrant/deployer/id_rsa $ chmod 0600 /home/vagrant/deployer/id_rsa
アクセス元からアクセス先に鍵で接続。
$ ssh -i /home/vagrant/deployer/id_rsa deployer@192.168.33.11
■設定ファイルを利用して接続 設定ファイルに接続方法を書いておくことにより、簡単に接続できる。 例えば踏み台サーバに以下の設定を記載しておくと、 「ssh web1」とすることでweb1サーバに、「ssh web2」とすることでweb2サーバに繋ぐことができる。
$ vi ~/.ssh/config
Host web1 Hostname 10.0.1.11 User ec2-user Port 10022 IdentityFile ~/.ssh/id_rsa IdentitiesOnly yes Host web2 Hostname 10.0.1.12 User ec2-user Port 10022 IdentityFile ~/.ssh/id_rsa IdentitiesOnly yes
■デバッグ オプション v を付けると、接続時のデバッグ情報が表示される。
# ssh -v -p 10022 ec2-user@203.0.113.1
SSHの操作ログを記録
※SSH接続を開放する場合に有効そうだが、root権限も渡す場合は無力。 scriptとpsacctでオペレーションログを記録する http://dev.classmethod.jp/operation/logging_operation_using_script_and_psacct/ まずはここから!Linuxサーバでカジュアルに作業ログを取得する方法 http://qiita.com/keigodasu/items/3eebbc079274ad8dd2c2 リモートログインしたユーザの操作ログ(script)を取得する http://qiita.com/hmukai/items/80bde86c5a9e4b3f8b97 ■SFTPの操作ログを記録 以下の「ログを確認」を参照。 Dropbox\サーバ\Command.txt
scpでファイルを操作する
scpコマンドとは。セキュアなファイル転送の仕組み、使い方を解説 | ミライサーバーのススメ https://www.miraiserver.ne.jp/column/about_scp/ scpコマンドでディレクトリ(フォルダ)をコピーしました #Linux - Qiita https://qiita.com/pugiemonn/items/3c80522f477bbbfa1302 ssh、scp、sftpコマンドをポート番号を指定して使う - bacchi.me https://bacchi.me/linux/ssh-tips/ 別のポートでSCPを実行するにはどうすればよいですか? https://ciksiti.com/ja/chapters/8522-how-do-i-scp-with-a-different-port ■準備 送信先サーバには鍵認証でSSH接続し、そのための準備は整っているものとする。 また、送信元サーバから送信先サーバへの接続も許可されているものとする。(ファイヤーウォールなど。) 送信元と送信先の両方に、scp_test ディレクトリを作成しておく。 ここを作業ディレクトリとする。
$ mkdir scp_test $ cd scp_test/ $ pwd /home/ec2-user/scp_test
■SSHで接続 送信元から送信先に、鍵認証でSSH接続する。 以下は送信元サーバでの作業。
$ vi /home/ec2-user/scp_test/id_rsa
-----BEGIN RSA PRIVATE KEY----- … 秘密鍵(xxx.pem)の内容を貼り付ける。 MIIEowIBAAKCAQEAryCYY8j+j5lQqBKJgdA3SLZWC7UJ9NeFkmypG4JJQwt3Gr9jG+rJY8vKUdx/ 〜略〜 yT0043TsaaS2Tx7KxqdFksrRW3IH0AKqXFKVcvdhuNbjVK5ps806PEaW/AZj5oIOfpto -----END RSA PRIVATE KEY-----
$ chmod 600 /home/ec2-user/scp_test/id_rsa … アクセス権限を設定。 $ chown ec2-user:ec2-user /home/ec2-user/scp_test/id_rsa $ ssh -p 10022 -i /home/ec2-user/scp_test/id_rsa ec2-user@203.0.113.1 … SSHで接続。(対象のIPが「203.0.113.1」とする。) The authenticity of host '[203.0.113.1]:10022 ([203.0.113.1]:10022)' can't be established. ECDSA key fingerprint is SHA256:PJy1eVu5LMIueVjLLFpLYG126qaMB8DAQR2ruDlHj6o. ECDSA key fingerprint is MD5:48:97:79:b5:29:91:70:ba:25:75:8b:53:cf:f9:0a:89. Are you sure you want to continue connecting (yes/no)? yes … 「yes」と入力してEnter。 Warning: Permanently added '[203.0.113.1]:10022' (ECDSA) to the list of known hosts. Last login: Wed Oct 25 15:03:12 2023 from p7cdba6cd.osakff01.ap.so-net.ne.jp __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/ 37 package(s) needed for security, out of 40 available Run "sudo yum update" to apply all updates. $ hostname … 接続できていることを確認。 example.com
■SCPでファイル転送 ファイル /home/ec2-user/scp_test/test1.txt を転送する。 転送したいファイルを先に、転送先を後に指定する。 ポート指定のオプションは「-P」と大文字なので注意。
$ scp -P 10022 -i /home/ec2-user/scp_test/id_rsa /home/ec2-user/scp_test/test1.txt ec2-user@203.0.113.1:/home/ec2-user/scp_test/
ディレクトリ /home/ec2-user/scp_test/test2 を転送する。 ディレクトリの場合は「-r」を指定する。
$ scp -P 10022 -i /home/ec2-user/scp_test/id_rsa -r /home/ec2-user/scp_test/test2 ec2-user@203.0.113.1:/home/ec2-user/scp_test/
転送元ファイルのパーミッションが何であろうと、転送先には 0664 で配置される。 転送元ファイルの所有者が何であろうと、転送先では接続時に使用するユーザが所有者となる。 オプション「-p」を付けると、変更時間・アクセス時間・パーミッションの値を引き継いで転送できる。 ただし所有者は引き継がれない。(どうしても引き継ぎたければ、rsyncなど別の手段の検討が必要みたい。)
$ scp -P 10022 -i /home/ec2-user/scp_test/id_rsa -p /home/ec2-user/scp_test/test4.txt ec2-user@203.0.113.1:/home/ec2-user/scp_test/ $ scp -P 10022 -i /home/ec2-user/scp_test/id_rsa -rp /home/ec2-user/scp_test/test5 ec2-user@203.0.113.1:/home/ec2-user/scp_test/
必要に応じて、以下のように転送後に所有者を調整することはできる。(一括での変更になる。)
# chown -hR apache. /home/ec2-user/scp_test/test
圧縮してから転送。 通常の方法で圧縮して、通常の方法で転送。
$ cd /home/ec2-user/scp_test $ zip -r test3.zip test3 $ scp -P 10022 -i /home/ec2-user/scp_test/id_rsa /home/ec2-user/scp_test/test3.zip ec2-user@203.0.113.1:/home/ec2-user/scp_test/
転送先で、通常の方法で展開。
$ unzip test3.zip
■SCPでファイル取得 取得したいファイルを先に、保存場所を後に指定する。
$ scp -P 10022 -i /home/ec2-user/scp_test/id_rsa ec2-user@203.0.113.1:/home/ec2-user/scp_test/test3.zip /home/ec2-user/scp_test/
sftpでファイルを操作する
Linuxコマンド【 sftp 】安全なファイル転送 - Linux入門 - Webkaru https://webkaru.net/linux/sftp-command/ ssh、scp、sftpコマンドをポート番号を指定して使う - bacchi.me https://bacchi.me/linux/ssh-tips/ 【 sftp 】Linuxサーバ ⇔ ローカルのファイル転送 - Qiita https://qiita.com/r18j21/items/373bd66324bda83e0349 AWS(EC2)上にSpringBootアプリをデプロイする - 好奇心の赴くままに https://writerman.hatenablog.jp/entry/2019/12/22/215749 バッチファイルを書いてSFTPサーバへのファイル配置を自動化する - Qiita https://qiita.com/sasaplus1/items/619283711399c55306b6 Linuxコマンド【 sftp 】安全なファイル転送 - Linux入門 - Webkaru https://webkaru.net/linux/sftp-command/ ■コマンドを入力して操作 コマンドプロンプトを起動して、以下を入力すると接続できる。
>sftp -P 10022 -i C:\Users\refirio\path\to\myserver.pem ec2-user@203.0.113.1 The authenticity of host '[203.0.113.1]:10022 ([203.0.113.1]:10022)' can't be established. ECDSA key fingerprint is SHA256:Uz/afrXXXXXsXwBPD5oyNR4Oe8w9sUNFOdz+x8Tja8A. Are you sure you want to continue connecting (yes/no/[fingerprint])? Warning: Permanently added '[203.0.113.1]:10022' (ECDSA) to the list of known hosts. Connected to 203.0.113.1.
基本的な操作。
sftp> ls ansible mecab-ipadic-neologd selenium_test sftp> ls -l drwxrwxr-x 6 ec2-user ec2-user 90 Sep 9 2021 ansible drwxrwxr-x 10 ec2-user ec2-user 196 Sep 10 2021 mecab-ipadic-neologd drwxrwxr-x 3 ec2-user ec2-user 149 Jun 21 2022 selenium_test sftp> put C:\localhost\home\test\public_html\test.php Uploading C:/localhost/home/test/public_html/test.php to /home/ec2-user/test.php C:/localhost/home/test/public_html/test.php 100% 379 23.2KB/s 00:00 sftp> put -r C:\Users\refirio\batch\test\file /home/ec2-user/test Uploading C:/Users/refirio/batch/test/file/ to /home/ec2-user/test/ Entering C:/Users/refirio/batch/test/file/ C:/Users/refirio/batch/test/file/sample.jpg 100% 337KB 3.2MB/s 00:00 C:/Users/refirio/batch/test/file/sample.pdf 100% 236KB 7.4MB/s 00:00 C:/Users/refirio/batch/test/file/sample.txt 100% 44 2.8KB/s 00:00 sftp> ls -l drwxrwxr-x 6 ec2-user ec2-user 90 Sep 9 2021 ansible drwxrwxr-x 10 ec2-user ec2-user 196 Sep 10 2021 mecab-ipadic-neologd drwxrwxr-x 3 ec2-user ec2-user 149 Jun 21 2022 selenium_test -rw-rw-r-- 1 ec2-user ec2-user 379 Jan 16 17:41 test.php sftp> get test.txt Fetching /home/ec2-user/test.txt to test.txt /home/ec2-user/test.txt 100% 11 0.3KB/s 00:00 sftp> exit
put でファイルをアップロードすると、ホームディレクトリにアップロードされる。 以下のようにすると、test 内にファイルがアップロードされる。
mkdir test cd test put C:\localhost\home\test\public_html\test.php
以下のようにすると、アップロード場所を指定できる。
put C:\Users\refirio\sftp\test.txt /home/ec2-user/test
get でファイルをダウンロードすると、sftp を実行した場所に保存される。 以下のようにすると、ダウンロード場所を指定できる。
get /home/ec2-user/test.php C:\Users\refirio\sftp
■バッチファイルを指定して操作 一例だが process.bat という名前で以下の内容を記述したファイルを作成しておく。
put -r C:\Users\refirio\batch\test\file /home/ec2-user/test ls -l /home/ec2-user/test
これでコマンドプロンプトから以下のように入力して実行すると、 ファイルがアップロードされて、ファイルの一覧も表示される。
>sftp -b C:\Users\refirio\batch\test\process.bat -P 10022 -i C:\Users\refirio\path\to\myserver.pem ec2-user@203.0.113.1
さらに、上記コマンドを記述したファイルを例えば upload.bat という名前で作成しておけば、 コマンドプロンプトから「upload」と入力するだけで処理を行うことができる。 (パスの指定などでコマンドに日本語が含まれる場合、upload.bat の文字コードはUTF-8Nにする必要があった。) ■初回実行時の注意点 別のパソコンで同様に実行しようとしたが、以下のように接続に失敗した。
>sftp -b C:\Users\refirio\batch\test\process.bat -P 10022 -i C:\Users\refirio\path\to\myserver.pem ec2-user@203.0.113.1 Host key verification failed. Connection closed
SSHコマンドで接続を試みると、初回接続の確認が表示された。 通常どおり「yes」とすることで接続できた。
>ssh -p 10022 -i C:\Users\refirio\path\to\myserver.pem ec2-user@203.0.113.1 The authenticity of host '[203.0.113.1]:10022 ([203.0.113.1]:10022)' can't be established. ED25519 key fingerprint is SHA256:QzG8/XXXXXXXXXXXX+fiuTDRZTg9bnP5Qy10ENxLclU. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '[203.0.113.1]:10022' (ED25519) to the list of known hosts. Last login: Thu Feb 2 11:37:51 2023 from example.com __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/ 144 package(s) needed for security, out of 229 available Run "sudo yum update" to apply all updates. Amazon Linux version 2018.03 is available.
これ以降、以下のように実行できるようになった。
>sftp -b C:\Users\refirio\batch\test\process.bat -P 10022 -i C:\Users\refirio\path\to\myserver.pem ec2-user@203.0.113.1 sftp> ls -l /home/ec2-user/test -rw-rw-r-- 1 ec2-user ec2-user 345132 Feb 1 13:12 sample.jpg -rw-rw-r-- 1 ec2-user ec2-user 241316 Feb 1 13:12 sample.pdf -rw-rw-r-- 1 ec2-user ec2-user 44 Feb 1 13:12 sample.txt sftp> put -r C:/Users/refirio/batch/test/file /home/ec2-user/test Entering C:/Users/refirio/batch/test/file/ sftp> ls -l /home/ec2-user/test -rw-rw-r-- 1 ec2-user ec2-user 345132 Feb 2 16:42 sample.jpg -rw-rw-r-- 1 ec2-user ec2-user 241316 Feb 2 16:42 sample.pdf -rw-rw-r-- 1 ec2-user ec2-user 44 Feb 2 16:42 sample.txt
telnetでアクセスする
ネットワーク関連のデバッグなどに、telnetを使うと原因究明しやすいことがある。 (SSH登場前は、telnetを使ってリモートサーバにログインすることが一般的だった。 ただし現在はあくまでもデバッグ目的の利用とし、リモートサーバの操作はデータが暗号化されるSSHを使うことを推奨。) telnetの基本的な使い方は、以下のページが詳しい。 WindowsのTelnetクライアントの使い方 http://www.atmarkit.co.jp/ait/articles/0207/06/news002.html ■インストールと接続方法 Unixの場合ははじめからインストール済みになっているかもしれないが、 使えない場合は以下でインストールする。 以下はVagrantのCentOS7にtelnetをインストールする例。
# yum -y install telnet
telnetコマンドで、接続先とポートを指定できる。(ポートを指定しなければ、デフォルトの23番に接続する。)
$ telnet 153.121.33.84 22 Trying 153.121.33.84...
ポートが空いていなければ、このまま何も反応がない。Ctrl+Cで終了する。 そのポートで何も待ち受けしていない場合、以下のように接続拒否のエラーになる。
telnet: connect to address 153.121.33.84: Connection refused
telnetでログインしてサーバを操作したい場合、あらかじめ対象サーバにtelnetサーバをインストールする必要がある。 ただしtelnetは通信が暗号化されないため、「一時的にSSHサーバを削除する」のような場合を除いて使わないことを推奨。 ■接続の終了 Ctrl + ] を押すとtelnetのプロンプトが表示される。 その状態で q を入力するとtelnetが終了する。 [linux] telnetで相手の切断を待たずに終了する方法 - Qiita https://qiita.com/suzutsuki0220/items/9cac0bfa4a0ca26e1588 ■接続の具体例(SSH)
$ telnet 153.121.33.84 22 … SSHのポートに接続。 Trying 153.121.33.84... SSH-2.0-OpenSSH_5.3 … ENTERを入力。 Protocol mismatch. … プロトコルが異なるので操作はできない。 > quit … 接続終了。
SSHサーバー構築(OpenSSH) - CentOSで自宅サーバー構築 http://centossrv.com/openssh.shtml ■接続の具体例(HTTP)
$ telnet refirio.net 80 … HTTPのポートに接続。 Trying 153.121.33.84... Connected to 153.121.33.84. Escape character is '^]'. GET / HTTP/1.0 … コマンドを入力後、さらに改行を2回入力。 HTTP/1.1 200 OK Date: Sat, 21 Oct 2017 07:44:19 GMT Server: Apache X-Powered-By: PHP/5.3.3 Set-Cookie: PHPSESSID=1g9vhqhjrg75q40ti2an6ceci4; path=/ Content-Length: 413 Connection: close Content-Type: text/html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>refirio.net</title> <link rel="stylesheet" href="/css/common.css" /> <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" /> <script type="text/javascript" src="/js/analytics.js"></script> </head> <body> <h1>refirio.net</h1> <p>テストページ。</p> <address>Created by refirio.</address> </body> </html> Connection closed by foreign host.
■接続の具体例(SMTP)
$ telnet 153.121.33.84 587 … 153.121.33.84 サーバの 587 ポートに接続。 Trying 153.121.33.84... Connected to 153.121.33.84. Escape character is '^]'. 220 mail.refirio.net ESMTP unknown EHLO localhost.localdomain … クライアントのホスト名を名乗る。 250-mail.refirio.net 250-PIPELINING 250-SIZE 31457280 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH LOGIN … ログインを行う。 334 VXNlcm5hbWU6 aW5mb0ByZWZpcmlvLm5ldA== … ユーザ名(Base64エンコードしたもの)を入力。 334 UGFzc3dvcmQ6 YWJjZDEyMzQ= … パスワード(Base64エンコードしたもの)を入力。 235 2.7.0 Authentication successful MAIL FROM: info@refirio.net … メール送信元を設定。 250 2.1.0 Ok RCPT TO: test@example.com … メール送信先を設定。 250 2.1.5 Ok DATA … メールデータの送信を開始。 354 End data with <CR><LF>.<CR><LF> From: info@refirio.net … メール送信元。 To: test@example.com … メール送信先。 Subject: Test … 件名。 … カラEnterを入力。 Hello World! … メール本文。 . … ピリオドを入力。 250 2.0.0 Ok: queued as 747E92780ABD QUIT … 接続終了。 221 2.0.0 Bye Connection closed by foreign host.
以下のように、送信先のアドレスにメールが届けば成功。 From: info@refirio.net To: test@example.com 件名: Test 本文: Hello World! また /var/log/maillog にメールログが記録されているので、エラーなどが記録されていないか確認しておく。 SMTP認証 - bnote https://www.bnote.net/dataroom/smtp_auth.html Base64 エンコード・デコード:画像などのデータをBase64文字列に変換、逆変換 | ラッコツールズ https://rakko.tools/tools/24/ ■接続の具体例(TRACEメソッドが使えるサーバ)
$ telnet 153.121.33.84 80 … 入力してENTER。 Trying 153.121.33.84... Connected to 153.121.33.84. Escape character is '^]'. TRACE / HTTP/1.1 … 入力してENTER。 HOST: example.com … 入力してENTER。 … そのままENTER。 HTTP/1.1 200 OK Date: Mon, 17 Oct 2022 04:02:07 GMT Server: Apache Transfer-Encoding: chunked Content-Type: message/http 25 TRACE / HTTP/1.1 … 入力した結果がそのまま表示されれば、TRACEメソッドが利用できたということ。 HOST: example.com … 入力した結果がそのまま表示されれば、TRACEメソッドが利用できたということ。 0 ^] … Ctrl + ] を入力。 telnet> q … プロンプトが表示されるので、q を入力してENTER。 Connection closed.
■接続の具体例(TRACEメソッドを禁止したサーバ)
$ telnet 153.121.33.84 80 Trying 153.121.33.84... Connected to 153.121.33.84. Escape character is '^]'. TRACE / HTTP/1.1 … 入力してENTER。 HOST: example.com … 入力してENTER。 … そのままENTER。 HTTP/1.1 405 Method Not Allowed … 405エラーが返される。 Date: Mon, 17 Oct 2022 05:12:50 GMT Server: Apache Allow: Content-Length: 223 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>405 Method Not Allowed</title> </head><body> <h1>Method Not Allowed</h1> <p>The requested method TRACE is not allowed for the URL /.</p> </body></html> ^] telnet> q Connection closed.
■telnetコマンドの代替(curlコマンドでの接続) ※telnetコマンドでの接続は、後述の「curlでアクセスする」も参照。 curl で telnet を代替する - 理系学生日記 https://kiririmode.hatenablog.jp/entry/20200405/1586070744 curlでtelnetを指定すれば、80番ポートに接続した結果を取得できる。
$ curl telnet://www.example.com:80 GET / HTTP/1.0 … このまま入力してENTER。 Host: www.example.com … このまま入力してENTER。 … 何も入力せずにENTER。 … 何も入力せずにENTER。 HTTP/1.0 200 OK Accept-Ranges: bytes Age: 27939 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Date: Wed, 06 Sep 2023 09:17:03 GMT Etag: "3147526947" Expires: Wed, 13 Sep 2023 09:17:03 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (laa/7B8E) Vary: Accept-Encoding X-Cache: HIT Content-Length: 1256 Connection: close <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> 〜中略〜 </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
■telnetコマンドの代替(opensslコマンドでの接続) Telnetコマンドの替わりにOpenSSLを使う方法 | TECH+(テックプラス) https://news.mynavi.jp/techplus/article/20210519-1890523/ telnetでhttp、opensslでhttpsをテストしてみる - Qiita https://qiita.com/POCH-7003/items/d3ab76151559260f3691 opensslでs_clientを指定すれば、443番ポートに接続した結果を取得できる。
$ openssl s_client -connect www.example.com:443 CONNECTED(00000003) depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA verify return:1 depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1 verify return:1 depth=0 C = US, ST = California, L = Los Angeles, O = Internet\C2\A0Corporation\C2\A0for\C2\A0Assigned\C2\A0Names\C2\A0and\C2\A0Numbers, CN = www.example.org verify return:1 --- Certificate chain 0 s:/C=US/ST=California/L=Los Angeles/O=Internet\xC2\xA0Corporation\xC2\xA0for\xC2\xA0Assigned\xC2\xA0Names\xC2\xA0and\xC2\xA0Numbers/CN=www.example.org i:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1 1 s:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1 i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA --- Server certificate -----BEGIN CERTIFICATE----- MIIHSjCCBjKgAwIBAgIQDB/LGEUYx+OGZ0EjbWtz8TANBgkqhkiG9w0BAQsFADBP MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMzAxMTMwMDAwMDBa 〜中略〜 Ik3Lg2c6k78rxcWcGvJDoSU7hPb3U26oha7eFHSRMAYN8gfUxAi6Q2TF4j/arMVB r6Q36EJ2dPcTu0p9NlmBm8dE34lzuTNC6GDCTWFdEloQ9u//M4kUUOjWn8a5XCs1 263t3Ta2JfKViqxpP5r+GvgVKG3qGFrC0mIYr0B4tfpeCY9T+cz4I6GDMSP0xg== -----END CERTIFICATE----- subject=/C=US/ST=California/L=Los Angeles/O=Internet\xC2\xA0Corporation\xC2\xA0for\xC2\xA0Assigned\xC2\xA0Names\xC2\xA0and\xC2\xA0Numbers/CN=www.example.org issuer=/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1 --- No client certificate CA names sent Peer signing digest: SHA256 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 3745 bytes and written 415 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: 6C6B76D1B0C3BA0B1F0959188E33470E85C8E0FAE5C7890AB961CC9BB19B0EA7 Session-ID-ctx: Master-Key: CD8E0BB25FC007F3AC38E10FE43012BC948218C61D4BA8DB2D54336003E0E67B0534E6B26C4DB2B3AFB210E8BD7FB978 Key-Arg : None Krb5 Principal: None PSK identity: None PSK identity hint: None TLS session ticket lifetime hint: 7200 (seconds) TLS session ticket: 0000 - a7 d2 df 3b 7d 8e 7d fe-5b 00 cd fd 69 a0 cd c4 ...;}.}.[...i... 0010 - ac 3e 09 c5 38 56 ea bc-8d 9d 78 e4 da 27 bc 5f .>..8V....x..'._ 0020 - d1 78 65 eb 48 2f eb 34-64 5d 3a 55 01 a9 8f 0a .xe.H/.4d]:U.... 0030 - 36 7c 1a 80 b5 9c 48 59-09 76 5c 7d 71 ba 09 d8 6|....HY.v\}q... 0040 - ac 5a 88 31 57 12 00 2c-59 ff ba ed 22 90 35 34 .Z.1W..,Y...".54 0050 - 31 b0 81 d9 79 4b 2d 92-67 a0 43 cd 0f 9c 2f 00 1...yK-.g.C.../. 0060 - ae 27 39 a7 c6 66 b7 4f-e8 bf 63 10 eb d8 b4 ef .'9..f.O..c..... 0070 - ee 4b c4 c3 bf 6d 9f c6-db 94 07 3f 80 df fa 2f .K...m.....?.../ 0080 - 80 8c ee cb 5e bd 62 4f-27 35 e3 da f9 40 4d af ....^.bO'5...@M. 0090 - 4f a0 b3 af d3 a2 49 cb-d7 5e 8d 59 8d c7 d9 b2 O.....I..^.Y.... Start Time: 1693991261 Timeout : 300 (sec) Verify return code: 0 (ok) --- GET / HTTP/1.0 … このまま入力してENTER。 Host: www.example.com … このまま入力してENTER。 … 何も入力せずにENTER。 HTTP/1.0 200 OK Age: 27376 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Date: Wed, 06 Sep 2023 09:07:51 GMT Etag: "3147526947+ident" Expires: Wed, 13 Sep 2023 09:07:51 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (sec/976A) Vary: Accept-Encoding X-Cache: HIT Content-Length: 1256 Connection: close <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> 〜中略〜 </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> closed
curlでアクセスする
■GETの例 ■POSTの例
$ curl -X POST -d '{ "data": { "post1": "xxx", "post2": "yyy", "post3": "zzz" }, "jsonapi": { "version": "1.0" } }' 'https://example.com/request.php?get1=xxx&get2=yyy&get3=zzz' --header 'x-api-key: ABCDEFG'
※URLに「&」を含む場合、全体をシングルクォートで囲う。もしくは「\」でエスケープする。 http://example.com/request.php?get1=xxx&get2=yyy&get3=zzz ↓ 'http://example.com/request.php?get1=xxx&get2=yyy&get3=zzz' http://example.com/request.php?get1=xxx\&get2=yyy\&get3=zzz データの受信は、以下のようなPHPプログラムを作成すれば確認できる。
<?php print_r($_GET); print_r($_POST); print_r($_SERVER);
curl option 覚え書き - Qiita https://qiita.com/takayukioda/items/edf371b3566bea64d046 「-X」や「-d」などの意味も解説されている。また省略しない場合(long option)のパラメーターも紹介されている。 curlコマンドの使い方 〜GET、POST、REST(json)の確認と、windowsでの利用手順 https://viral-community.com/security/curl-8263/ curlで複数パラメータのGETを投げる - Qiita https://qiita.com/nobu_121/items/52bb9d5961aa3e017813 PHPで任意のHTTPヘッダをリクエストから取得する方法 - Qiita https://qiita.com/sakatam/items/f06a1da5682c3bfe870e ■ヘッダのみ取得
$ curl -I -s http://example.com/ $ curl -s -I -L http://example.com/ | grep ^Location
■SSLの証明書エラーを無視して接続する
$ curl https://localhost:10000 --insecure
上のように「--insecure」を指定すると、エラーを無視して接続できる。 ■Basic認証 通常のリクエストは以下のとおり。 URLに認証情報を埋め込むことができる。 「-u」でユーザ名とパスワードを指定することもできる。
$ curl -u 'username:password' https://example.com/
Authorizationでユーザ名とパスワードを指定することもできる。 ただしこの場合、ユーザ名とパスワードはBase64エンコードしたものを指定する必要がある。
$ echo -n 'username:password' | base64 dXNlcm5hbWU6cGFzc3dvcmQ= $ curl https://example.com/ -H "Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ="
「-H」は「--header」と指定しても同じ。
$ curl https://example.com/ --header "Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ="
curlでBasic認証する方法3つ - と、記号を含むとき注意点など - tweeeetyのぶろぐ的めも https://www.tweeeety.blog/entry/2021/11/08/124745 curl で Basic 認証(Authorization ヘッダを利用した場合) - ようへいの日々精進XP https://inokara.hateblo.jp/entry/2017/11/23/184942 ■ユーザーエージェント指定 以下いずれかのように指定することで、ユーザーエージェント「HeadlessChrome」を付与できる。
$ curl -A "HeadlessChrome" https://example.com/ $ curl -H "User-Agent: HeadlessChrome" https://example.com/
■hosts指定 curlでhost指定・名前解決して実行 - 一応技術ブログ的なやつです https://iettty.hatenablog.jp/entry/2018/10/23/235142 hostsファイルを設定しなくても、以下で維持知的なドメインの変更ができる。
$ curl --resolve example.com:80:203.0.113.1 http://example.com/
以下でアクセスを確認できる。
$ curl --resolve refirio.net:80:203.0.113.1 http://refirio.net/ $ curl --resolve test1.refirio.net:80:203.0.113.1 http://test1.refirio.net/ $ curl --resolve test2.refirio.net:80:203.0.113.1 http://test2.refirio.net/
SSLだとエラーになる。 …が、これは 203.0.113.1 自体がSSLを受け付けるようになっていないだけだと思われる。 また確認したい。
$ curl --resolve refirio.net:443:203.0.113.1 https://refirio.net/ curl: (7) Failed to connect to refirio.net port 443: Connection refused
■FTP FTP接続もできる。 SFTPやSSH接続の方法は判らなかったが、それはcurlコマンドではなくsshコマンドやsftpコマンドを使うべき…ということかもしれない。
>curl -u refirio:abcd1234 ftp://refirio.net/test/ -rw-rw-r-- 1 512 501 24 Feb 27 2014 test1.php -rw-rw-r-- 1 512 501 24 Mar 11 2015 test2.php 以下略
FTPサーバとのやりとりをcurlコマンドで行う - Qiita https://qiita.com/mom0tomo/items/384da47dee08a21c1ce5 curl で FTP over TLS/SSL なサーバーへアクセスする https://gist.github.com/keijiro/4015735 ■DB データベース接続もできる。 結果に「Connected」と表示されていれば接続成功。 ただし、できるのはあくまでも疎通確認のみ。任意のSQLクエリを実行したりすることはできない。
$ curl -v telnet://localhost:3306 * Trying 127.0.0.1:3306... * Connected to localhost (127.0.0.1) port 3306 * Failure writing output to destination * Closing connection
以下は外部のデータベースに接続する場合の例。
$ curl -v telnet://test-mysql.1234567890.ap-northeast-1.rds.amazonaws.com:3306 * Trying 10.1.3.38:3306... * Connected to test-mysql.1234567890.ap-northeast-1.rds.amazonaws.com (10.1.3.38) port 3306 * Failure writing output to destination * Closing connection
以下は接続できなかった場合の例。
$ curl -v telnet://test2-mysql.1234567890.ap-northeast-1.rds.amazonaws.com:3306 * Could not resolve host: test2-mysql.1234567890.ap-northeast-1.rds.amazonaws.com * Closing connection curl: (6) Could not resolve host: test2-mysql.1234567890.ap-northeast-1.rds.amazonaws.com
curl でDBやキャッシュの疎通確認もできる #Linux - Qiita https://qiita.com/yamotuki/items/2d1c74c3253e9c3b0562 ■メール送信 メールを送ろう。curlで。 - Blanktar https://blanktar.jp/blog/2016/01/curl-smtp-mail 以下は、ロリポップのSMTPで mailto@gmail.com 宛に送信する例。 あらかじめテキストファイルでメール内容を作成しておき、それを使って送信する。
$ cat mail.txt
To: mailto@gmail.com From: info@example.com Subject: テストメール テスト。 これはテストメールです。
$ curl smtps://smtp.lolipop.jp:465 --mail-from 'info@example.com' --mail-rcpt 'mailto@gmail.com' -u 'info@example.com' -T mail.txt Enter host password for user 'info@example.com': % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 133 0 0 100 133 0 450 --:--:-- --:--:-- --:--:-- 450
以下は、GmailのSMTPで mailto@gmail.com 宛に送信する例。 あらかじめテキストファイルでメール内容を作成しておき、それを使って送信する。
$ cat mail.txt
To: mailto@gmail.com From: example@gmail.com Subject: テストメール テスト。 これはテストメールです。
$ curl smtps://smtp.gmail.com:465 --mail-rcpt 'mailto@gmail.com' -u 'example@gmail.com' -T mail.txt Enter host password for user 'example@gmail.com': % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 141 0 0 100 141 0 62 0:00:02 0:00:02 --:--:-- 62
NAT
※未検証。 ※AWSでのNATは、AWS.txt の「AWS NAT」を参照。 プライベートなサブネットからインターネットに接続したり。 Webサーバが複数台構成でも、外へ出て行く際のIPアドレスを統一(固定)したり。 NATの冗長化まで考えると大変なので、AWSならマネージドサービスを使う方が管理が楽。 「NAT」「NAT越え」「NATタイプ」ってなーに? https://squid-ink-cafe.com/lag/lag-ready-05/ natテーブルを利用したLinuxルータの作成 (1/6):習うより慣れろ! iptablesテンプレート集(2) - @IT http://www.atmarkit.co.jp/ait/articles/0505/17/news131.html AWS NATインスタンスを作成したメモ - Qiita https://qiita.com/hc_isobe/items/3520173b1065aeae884b AWS NAT構成の作り方(NATインスタンス編) - Qiita https://qiita.com/TK1989/items/ece84500ee87d2d96c4b
スーパーサーバを起動する
※未検証。 xinetdとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 https://wa3.i-3-i.info/word13585.html xinetd の設定 https://www.express.nec.co.jp/linux/distributions/knowledge/network/xinetd.html xinetdを使ってLinux上のサービスを常時起動せずに利用する https://blog.mosuke.tech/entry/2015/01/02/013658/ はじめてのxinetd - Qiita https://qiita.com/uturned0/items/ba7c74e00580f54d140f
パケットキャプチャを行う
■tcpdump
# tcpdump -nli eth0 port 80 … 80番ポートへの通信を監視。 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes … いったんこの状態で監視中になる。 19:51:41.603374 IP 202.229.34.200.61910 > 153.121.33.84.http: Flags [S], seq 994394370, win 8192, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0 19:51:41.603475 IP 153.121.33.84.http > 202.229.34.200.61910: Flags [S.], seq 3988310290, ack 994394371, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
19:51:41 に 202.229.34.200 から 153.121.33.84 に対してhttpリクエストがあったことが判る。
# tcpdump -X -i eth0 -n port 80 … 80番ポートへの通信内容を監視。(16進数とASCII文字で表示。) tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes … いったんこの状態で監視中になる。 19:57:03.458221 IP 202.229.34.200.62029 > 153.121.33.84.http: Flags [S], seq 1535838550, win 8192, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0 0x0000: 4500 0034 7893 4000 7506 e4b5 cae5 22c8 E..4x.@.u.....". 0x0010: 9979 2154 f24d 0050 5b8b 0956 0000 0000 .y!T.M.P[..V.... 0x0020: 8002 2000 4f44 0000 0204 0586 0103 0308 ....OD.......... 0x0030: 0101 0402 .... 19:57:03.458313 IP 153.121.33.84.http > 202.229.34.200.62029: Flags [S.], seq 4017208096, ack 1535838551, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0 0x0000: 4500 0034 0000 4000 4006 9249 9979 2154 E..4..@.@..I.y!T 0x0010: cae5 22c8 0050 f24d ef71 bb20 5b8b 0957 .."..P.M.q..[..W 0x0020: 8012 3908 8b6c 0000 0204 05b4 0101 0402 ..9..l.......... 0x0030: 0103 0306 .... 19:57:03.458763 IP 202.229.34.200.62031 > 153.121.33.84.http: Flags [S], seq 928033904, win 8192, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0 0x0000: 4500 0034 7895 4000 7506 e4b3 cae5 22c8 E..4x.@.u.....". 0x0010: 9979 2154 f24f 0050 3750 ac70 0000 0000 .y!T.O.P7P.p.... 0x0020: 8002 2000 d062 0000 0204 0586 0103 0308 .....b.......... 0x0030: 0101 0402 .... 19:57:03.458788 IP 153.121.33.84.http > 202.229.34.200.62031: Flags [S.], seq 3101697651, ack 928033905, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0 0x0000: 4500 0034 0000 4000 4006 9249 9979 2154 E..4..@.@..I.y!T 0x0010: cae5 22c8 0050 f24f b8e0 2673 3750 ac71 .."..P.O..&s7P.q 0x0020: 8012 3908 d7c9 0000 0204 05b4 0101 0402 ..9............. 0x0030: 0103 0306 .... 19:57:03.458916 IP 202.229.34.200.62032 > 153.121.33.84.http: Flags [S], seq 4220921428, win 8192, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0 0x0000: 4500 0034 7896 4000 7506 e4b2 cae5 22c8 E..4x.@.u.....". 0x0010: 9979 2154 f250 0050 fb96 2654 0000 0000 .y!T.P.P..&T.... 0x0020: 8002 2000 9237 0000 0204 0586 0103 0308 .....7.......... 0x0030: 0101 0402 .... 19:57:03.458927 IP 153.121.33.84.http > 202.229.34.200.62032: Flags [S.], seq 1978207803, ack 4220921429, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0 0x0000: 4500 0034 0000 4000 4006 9249 9979 2154 E..4..@.@..I.y!T 0x0010: cae5 22c8 0050 f250 75e9 0e3b fb96 2655 .."..P.Pu..;..&U 0x0020: 8012 3908 f4cd 0000 0204 05b4 0101 0402 ..9............. 0x0030: 0103 0306 .... 19:57:03.470209 IP 202.229.34.200.62030 > 153.121.33.84.http: Flags [S], seq 4289352827, win 8192, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0 0x0000: 4500 0034 7894 4000 7506 e4b4 cae5 22c8 E..4x.@.u.....". 0x0010: 9979 2154 f24e 0050 ffaa 547b 0000 0000 .y!T.N.P..T{.... 0x0020: 8002 2000 5ffe 0000 0204 0586 0103 0308 ...._........... 0x0030: 0101 0402 .... 19:57:03.470244 IP 153.121.33.84.http > 202.229.34.200.62030: Flags [S.], seq 3159110353, ack 4289352828, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0 0x0000: 4500 0034 0000 4000 4006 9249 9979 2154 E..4..@.@..I.y!T 0x0010: cae5 22c8 0050 f24e bc4c 32d1 ffaa 547c .."..P.N.L2...T| 0x0020: 8012 3908 579b 0000 0204 05b4 0101 0402 ..9.W........... 0x0030: 0103 0306 .... 19:57:03.497385 IP 202.229.34.200.62029 > 153.121.33.84.http: Flags [.], ack 1, win 64, length 0 0x0000: 4500 0028 7897 4000 7506 e4bd cae5 22c8 E..(x.@.u.....". 0x0010: 9979 2154 f24d 0050 5b8b 0957 ef71 bb21 .y!T.M.P[..W.q.! 0x0020: 5010 0040 0506 0000 P..@.... 19:57:03.497746 IP 202.229.34.200.62029 > 153.121.33.84.http: Flags [P.], seq 1:623, ack 1, win 64, length 622 0x0000: 4500 0296 7898 4000 7506 e24e cae5 22c8 E...x.@.u..N..". 0x0010: 9979 2154 f24d 0050 5b8b 0957 ef71 bb21 .y!T.M.P[..W.q.! 0x0020: 5018 0040 e614 0000 4745 5420 2f20 4854 P..@....GET./.HT 0x0030: 5450 2f31 2e31 0d0a 486f 7374 3a20 7265 TP/1.1..Host:.re 0x0040: 6669 7269 6f2e 6e65 740d 0a43 6f6e 6e65 firio.net..Conne 0x0050: 6374 696f 6e3a 206b 6565 702d 616c 6976 ction:.keep-aliv 0x0060: 650d 0a43 6163 6865 2d43 6f6e 7472 6f6c e..Cache-Control 0x0070: 3a20 6d61 782d 6167 653d 300d 0a41 6363 :.max-age=0..Acc 0x0080: 6570 743a 2074 6578 742f 6874 6d6c 2c61 ept:.text/html,a 0x0090: 7070 6c69 6361 7469 6f6e 2f78 6874 6d6c pplication/xhtml 0x00a0: 2b78 6d6c 2c61 7070 6c69 6361 7469 6f6e +xml,application 0x00b0: 2f78 6d6c 3b71 3d30 2e39 2c69 6d61 6765 /xml;q=0.9,image 0x00c0: 2f77 6562 702c 2a2f 2a3b 713d 302e 380d /webp,*/*;q=0.8. 0x00d0: 0a55 7067 7261 6465 2d49 6e73 6563 7572 .Upgrade-Insecur 0x00e0: 652d 5265 7175 6573 7473 3a20 310d 0a55 e-Requests:.1..U 0x00f0: 7365 722d 4167 656e 743a 204d 6f7a 696c ser-Agent:.Mozil 0x0100: 6c61 2f35 2e30 2028 5769 6e64 6f77 7320 la/5.0.(Windows. 0x0110: 4e54 2031 302e 303b 2057 4f57 3634 2920 NT.10.0;.WOW64). 0x0120: 4170 706c 6557 6562 4b69 742f 3533 372e AppleWebKit/537. 0x0130: 3336 2028 4b48 544d 4c2c 206c 696b 6520 36.(KHTML,.like. 0x0140: 4765 636b 6f29 2043 6872 6f6d 652f 3530 Gecko).Chrome/50
■Wireshark ※未検証。 Wireshark によるパケット解析講座 1: Wiresharkの表示列をカスタマイズする https://unit42.paloaltonetworks.jp/unit42-customizing-wireshark-changing-column-display/
ネットワークを確認
$ ping -c 5 192.168.0.1 … ネットワークの疎通を5回確認。 $ traceroute 192.168.0.1 … 通信の経路を確認。 $ curl 192.168.0.1 … HTTPリクエストで確認。 $ host 153.121.33.84 … ホスト名を問い合わせ。 $ host refirio.net … IPアドレスを問い合わせ。 $ ifconfig … ネットワークの設定を確認。 $ netstat … 現在確立されている接続の一覧を表示。 $ netstat -a … すべての情報を表示。(不要なサービスが動いていないか確認。) $ netstat -an … 出力をIPアドレスなど数値のみに抑制する。 $ netstat -an | grep 80 … 80番ポートへの接続を表示。 $ netstat -s … プロトコル別に統計情報を表示。 $ nslookup … DNSサーバへ問い合わせ。 $ nslookup 192.168.0.1 … 192.168.0.1 の情報を表示。 $ nslookup example.com … example.com の情報を表示。 $ nslookup -q=A example.com … ホスト名をアドレスに変換する。 $ nslookup -q=PTR 192.168.0.1 … アドレスをホスト名に変換する。 $ nslookup -q=SOA example.com … ゾーンに関する様々な情報を表示。 $ service network restart … ネットワークサービスの再起動。
Ping値の測定(オンラインゲームのラグをテスト) https://squid-ink-cafe.com/lag/lag-ready-03/ ※ifconfigやnetstatなどは今は非推奨になっている。 代わりに ip や ss などのコマンドが用意されている。 Linuxネットワークコマンド新旧まとめ https://news.mynavi.jp/article/20180718-665930/ 非推奨になったLinuxネットワークコマンドの代替コマンド http://understeer.hatenablog.com/entry/2012/03/24/184346 自分のIPアドレスを知る方法 http://qiita.com/sharow/items/66d89136180884a2f7b7 グローバルIPをcurlで確認 http://qiita.com/kanpou_/items/734b947f5a95109e7bb9
ネットワークの設定を確認
有線LANインターフェースは、認識された順に eth0・eth1・eth2 と名前が付く。「eth」は「イーサネット」の略。 無線LANインターフェースは、認識された順に wlan0・wlan1・wlan2 と名前が付く。「wlan」は「ワイヤレスLAN」の略。 以下はさくらVPSの設定内容で、IPは固定されている。
# cat /etc/sysconfig/network … ネットワーク設定ファイルを確認。 NETWORKING=yes HOSTNAME=refirio.net … ホスト名。 NETWORKING_IPV6=yes #IPV6_DEFAULTDEV="eth0" #IPV6_DEFAULTGW="fe80::1 # cat /etc/sysconfig/network-scripts/ifcfg-eth0 … ネットワークインターフェース(eth0)の設定ファイルを確認。 DEVICE="eth0" IPADDR="153.121.33.84" … IPアドレス。 NETMASK="255.255.254.0" … サブネットマスク。 GATEWAY="153.121.32.1" … ゲートウェイ。 ONBOOT="yes" … コンピュータ起動時に自動的に有効化。 TYPE="Ethernet" DNS1="210.188.224.10" DNS2="210.188.224.11" ZONE=public # cat /etc/resolv.conf … 名前解決をする際に利用するDNSサーバの設定を確認。 search refirio.net nameserver 210.188.224.10 nameserver 210.188.224.11 # cat /etc/hosts … DNSサーバを利用しない、ローカルでの名前解決を行う際の設定を確認。 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 127.0.0.1 localhost refirio.net localhost4 localhost4.localdomain4 #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
Linuxで固定IP設定(設定ファイル・コマンド) - Qiita https://qiita.com/routerman/items/4d19b3084fa58723830c
自身のIPアドレスを調べる
■グローバルIPアドレスを調べる
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR IPADDR="203.0.113.1"
EC2ではこの方法は使えないので、以下のように外部ツールを使うといい。(EC2以外の環境でも有効な方法。)
$ curl -s ifconfig.me 203.0.113.1
■プライベートIPアドレスを調べる
$ ifconfig eth0 | grep inet inet addr:203.0.113.1 Bcast:49.212.203.255 Mask:255.255.254.0 inet6 addr: fe80::5054:5ff:fe02:6162/64 Scope:Link
とあるポート番号を誰が使っているか調べる
# lsof -i :80 … 80番ポートを使っているプロセスIDを調べる。 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 9126 nginx 6u IPv4 109070 0t0 TCP *:http (LISTEN) nginx 16210 root 6u IPv4 109070 0t0 TCP *:http (LISTEN) # lsof -i :10022 … 10022番ポートを使っているプロセスIDを調べる。 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 6373 root 3u IPv4 6846541 0t0 TCP www2310uo.sakura.ne.jp:10022->st1992.nas811.p-osaka.nttpc.ne.jp:61731 (ESTABLISHED) sshd 6375 refirio 3u IPv4 6846541 0t0 TCP www2310uo.sakura.ne.jp:10022->st1992.nas811.p-osaka.nttpc.ne.jp:61731 (ESTABLISHED) sshd 10283 root 3u IPv4 50789 0t0 TCP *:10022 (LISTEN)
プロセスを停止させたい場合、「# kill 9126」のようにするが、サービスの場合は可能なら正式な手続きで終了させたい。 上の内容や「# ps aux | grep 9126」からサービス名を推測することもできるが、以下の方法でプロセスIDからサービスを調べることができる。 プロセスIDからサービスを調べるには、以下のようにする(ただし子プロセスは考慮できておらず、親プロセスのIDを渡す必要があるので改良したい。)
# service --status-all | grep 9126 … プロセスIDが9126のサービス名を求める場合。
サービス名が判れば、以下のように終了できる。
# service httpd stop
■CentOS7の場合
# systemctl list-units --type=service … サービスの一覧を取得する。(CentOS7の場合。) UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrtd.service loaded active running ABRT Automated Bug Reporting Tool atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service 〜略〜 # systemctl status nginx.service … それぞれのサービスに対して、サービスの状態を調べる。(CentOS7の場合。) ● nginx.service - nginx - high performance web server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since 土 2018-02-03 19:59:02 JST; 2 months 22 days ago Docs: http://nginx.org/en/docs/ Process: 9121 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS) Main PID: 16210 (nginx) CGroup: /system.slice/nginx.service ├─ 9126 nginx: worker process … プロセスIDが記載されているので、対象のIDかどうかを比べる。 └─16210 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
という手順で調べられる。子プロセスも考慮できる。 サービスの目星がつかない場合、すべてのサービスに対して調べるのは現実的でないので、スクリプトを作成することを推奨。
# vi find_service_by_pid.sh … プロセスIDからサービス名を求めるスクリプトを作成。(CentOS7の場合。)
#!/bin/bash pid=$1 systemctl list-units --type=service | cut -d ' ' -f 3 | while read name do if [[ $name =~ ".service" ]] then if systemctl status $name | grep -E $pid then echo "Service is $name" fi fi done
# chmod +x find_service_by_pid.sh … 実行権限を付与。 # ./find_service_by_pid.sh 9126 … プロセスIDが9126のサービス名を求める場合。
サービス名が判れば、以下のように終了できる。
# systemctl stop nginx.service
とあるプロセスがどのポート番号を使っているか調べる
# lsof -p 9126 -P | grep LISTEN nginx 9126 nginx 6u IPv4 109070 0t0 TCP *:80 (LISTEN) nginx 9126 nginx 7u IPv4 109071 0t0 TCP *:443 (LISTEN)
ポート番号ではなく、サービス名で表示する場合は「-P」を省略する。
# lsof -p 9126 | grep LISTEN nginx 9126 nginx 6u IPv4 109070 0t0 TCP *:http (LISTEN) nginx 9126 nginx 7u IPv4 109071 0t0 TCP *:https (LISTEN)
通信量の多いプロセスを調べる
# yum -y install nethogs … CentOSにインストール。 # yum -y install epel-release … AmazonLinuxにインストール。 # yum -y install --enablerepo=epel nethogs # nethogs … ツールを実行。
結果のうち、PROGRAMがプロセスの起動コマンド、SENTが送信したデータ、RESEIVEが受信したデータ。(KB毎秒。) Linuxでネットワークトラフィックを監視する方法 | マイナビニュース https://news.mynavi.jp/article/20100730-linux-freebsd-net-traffic-tools/
通信量の多い相手を調べる
# yum -y install iftop … CentOSにインストール。 # yum -y install epel-release … AmazonLinuxにインストール。 # yum -y install --enablerepo=epel iftop # iftop … ツールを実行。
結果のうち、左側でデータの送信元と送信先が判る。右の数字3つは左から。 ・直近2秒間の1秒あたりの平均通信量。 ・直近10秒間の平均通信量。 ・直近40秒間の平均通信量。 を表す。
CDN(Content Delivery Network)
CDN(Content Delivery Network)で、日本語にするならコンテンツ配信サービス。 AWS提供のCDNとしてCloudFrontがある。 第1回 CDN の 仕組み (CDNはどんな技術で何が出来るのか) | REDBOX Labo https://blog.redbox.ne.jp/what-is-cdn.html 今すぐ使える!CDN ~はじめてのCloudFlare(クラウドフレア)導入~ | ブログ | SINAP - 株式会社シナップ https://sinap.jp/blog/2011/06/cdn-cloudflare.html
IPアドレスの逆引き設定
■逆引きの概要 IPアドレスの逆引き・正引きとは? | カゴヤのサーバー研究室 https://www.kagoya.jp/howto/network/nameresolution/ dig コマンドでDNS逆引きをする。 - それマグで! http://takuya-1st.hatenablog.jp/entry/20100903/1283490518 ■コマンドプロンプトでの確認
C:\Users\refirio>nslookup kagoya.com サーバー: UnKnown Address: 2001:a250:25:af00:6ee4:daff:fe39:3ee0 権限のない回答: 名前: kagoya.com Address: 203.142.206.20 C:\Users\refirio>nslookup 203.142.206.20 サーバー: UnKnown Address: 2001:a250:25:af00:6ee4:daff:fe39:3ee0 名前: www33z.kagoya.net Address: 203.142.206.20
■Linuxでの確認 Linuxの場合も同様に確認できる。
$ nslookup kagoya.com Server: 10.1.0.2 Address: 10.1.0.2#53 Non-authoritative answer: Name: kagoya.com Address: 203.142.206.20 $ nslookup 203.142.206.20 Server: 10.1.0.2 Address: 10.1.0.2#53 Non-authoritative answer: 20.206.142.203.in-addr.arpa name = www33z.kagoya.net. Authoritative answers can be found from:
■Webツールでの確認 nslookup(dig)テスト【DNSサーバ接続確認】 https://www.cman.jp/network/support/nslookup.html 対象のドメインを入力して実行すると、現在設定されている正引きの内容が返ってくる。 対象のIPアドレスを入力し、オプションに「PTR」を指定して実行すると、現在設定されている逆引きの内容が返ってくる。 ■AWSでの逆引き設定 Route53で完結しないので、逆引き設定の申請を行う必要がある。 EC2インスタンスからメール送信のための準備 | cloudpack.media https://cloudpack.media/11249 ■さくらVPSでの逆引き設定 DNSで完結しないので、コントロールパネルで行う必要がある。 さくらのVPSサービスで逆引き名の設定はできますか。 - さくらのサポート情報 https://help.sakura.ad.jp/hc/ja/articles/206229921-%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEVPS%E3%82%B5%... DNS逆引きレコードを変更する - さくらのサポート情報 https://help.sakura.ad.jp/hc/ja/articles/206208061
バウンスメール
バウンスメールとは何か? http://bouncehammer.jp/ja/what-is-bounced-email バウンスが発生する3つのタイミング http://bouncehammer.jp/ja/email-topics/when-does-email-bounce 携帯電話宛バウンスの見分け http://bouncehammer.jp/ja/email-topics/distinguish-between-the-unknown-and-the-filtered 携帯のドメイン指定フィルタが原因でバウンスしてしまいました。再送するにはどうすればよいですか? https://support.sendgrid.kke.co.jp/hc/ja/articles/206442433 ■バウンスメールの概要 メールは「宛先が見つからなかった」「宛先のメールボックスが一杯だった」などの理由で、メールが届かないことがある。 このような場合に英語のメールが送られてくることがあるが、これをバウンスメールと呼ぶ。 (「MAILER-DAEMON」という送信者から、オリジナルの文面とともに、メールのエラーコードなどが送られてくる。) バウンスメールの内容をよく読むと、「何故届かなかったのか」の理由が記載されていることを確認できる。 メールが届かなかった場合、メール送信ログとともにバウンスメールの内容も調べることになる。 ただし「メールは相手に到達したが、そのうえで迷惑メールに振り分けられた」のような場合、 メールからも送信ログからも原因を判断できないし、バウンスメールも送られてこない。(メール自体は正常に送り届けられたため。) また、バウンスメールを返すか否かは、送信先サーバの設定にも依存する。(設定次第では、バウンスメールは送られてこない。) バウンスメール (bounce message)とは https://wa3.i-3-i.info/word17740.html ■バウンスメールの送信 バウンスメールを返すか否かは、送信先サーバの設定にも依存する。 よって「バウンスメールが送られてこない=メールが届いた」というわけでは無いので注意。 以下は「存在しないアカウント宛に送られたメールには、バウンスメールを返さない」設定の例。 (迷惑メールの送信者に、余計な情報を与えないようにするための対応) unknown user のバウンスメールの削除 http://www.ice.is.kit.ac.jp/~umehara/misc/comp/20091218c.html ■バウンスメールの送信元 「BOUNCEメールの送り主」(1) Linux Square − @IT https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=44005&forum=10 バウンスメールは、原則として送信元サーバが作成する。 > バウンスメールを作成するのは、 > 送信先サーバから「受け取れないよ」と言われてしまった送信元サーバです。 > > メールはバケツリレーのように送信されるので、 > 送信元企業のメールサーバ → 送信先企業のDMZメールサーバ → 送信先企業のある組織のメールサーバ → グループウェア > > という構成なら、「送信先企業のある組織のメールサーバ」がバウンスメールを > 作成することもあり、この場合は送信先サーバのようにも見えると思います。 ■バウンスメールの送信先 バウンスメールは、「Return-Path」に対して通知される。 ただし Return-Path に差出人のメールアドレスと異なるメールアドレスを指定すると、迷惑メール扱いされやすくなるので注意。 詳細は Trouble.txt の「メールを送信しても届かない / 迷惑メールとして処理される」を参照。 Return-Pathとは何か? | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=12803 Return-Path(エンベロープFrom)とは? | JCOMサポート https://cs.myjcom.jp/knowledgeDetail?an=000003212 また、root宛にも同じ内容が通知されるみたい。 ただしメールを見落としがちだし確認も手間なので、root宛メールは自身のメールアドレス(もしくはサーバ管理用のメールアドレス)に転送しておくのが無難。 rootメールの転送については、Basis.txtの「root宛メールを転送」を参照。 以下は相手に届かないけどバウンスメールも送られない…というケース。 携帯のドメイン指定フィルタが原因でバウンスしてしまいました。再送するにはどうすればよいですか? https://support.sendgrid.kke.co.jp/hc/ja/articles/206442433-%E6%90%BA%E5%B8%AF%E3%81%AE%E3%83%89%E3%... ■送信先サーバが停止している場合 停止中のメールサーバへメールを配信するとどうなるのですか? -お世話- その他(パソコン・スマホ・電化製品) | 教えて!goo https://oshiete.goo.ne.jp/qa/450432.html > 電子メールは、複数のメールサーバを介してバケツリレーで流れていきます。 > 受信側のメールサーバがこけているときは、smtp接続できないのでメールは送られません。 > 送信側のメールサーバのキューに保存され、定期的に受信側に送ろうとします。 > 受信側が復活した時に、送信側のキューにたまっているメールは送られます。 > 送信側がPC(クライアント)の場合も、同じです。クライアントのメールソフトに残ったままです。 > (キューにたまったメールを定期的に送るための設定をどこで行なうかは)送信側メールサーバのキューの設定によりますね。 > 送信側メールサーバがsendmailと仮定して、以下の様な設定ができます。 > ・配信エラー等が発生してキューに残されてから再送信が可能になるまでの最短時間。 > ・メールが長時間キューに残されたままになっている(配信に失敗し続けている)場合に、そのメールが未配信であることを発信もとに通知する機能。 > ・メールをキューに保存する期間。この期間を過ぎたメールはキューから削除され、そのメールが配信できなかった事を発信者宛に通知できます。 > など設定できます。 > > (補足) > たいていは、メールサーバを2台たてて、DNSのMXレコードに定義する事が多いですね。 > DNSサーバで > mydomain.co.jp >   MX 10 mail1.mydomein.co.jp >   MX 20 mail2.mydomein.co.jp > こんな感じで定義すると、hogehoge@mydomain.co.jp宛に送信する時 > mail1がこけていたら、mail2が受け取ってくれます。 > smtp接続・送信が成功した時点で送信側のキューには何も残ってません。 > 送信不達で戻ってきた、メールのヘッダを表示させたら、 > Received: > という行が積み重なってますので、どこのサーバを経由してメールが流れていったか、 > どこで失敗したか、等がわかりますね。 > 送信側のサーバーによって違うかもしれませんが、OCNの場合次の通りです。 > (1)届かなかった旨のウォーニングメールが来る。(警告で、無視してもよい) > (2)送信側のサーバーが蓄積していて、5日間再送を繰り返す。 > (3)5日間の再送に失敗すると、届かなかった旨のエラーメールが来て終わり。
SMTP送信エラー
SMTPでメールを送信すると、即座に以下のエラーメッセージが返ってきたことがあった。
smtp; 552-5.2.2 The recipient's inbox is out of storage space and inactive. Please 552-5.2.2 direct the recipient to 552 5.2.2 https://support.google.com/mail/?p=OverQuotaPerm d2e1a72fcca58-71dd9de5883si463915b3a.169 - gsmtp
また、同じ内容がバウンスメールとしても送られてきた。 ただしSMTPでのメール送信時にエラーメッセージが返ってこなくても、しばらくしてからバウンスメールが送られてくることがある。 以下は「SMTPでのメール送信時に、エラーメッセージが返って来るか来ないかの差がある理由」をChatGPTに質問したときの回答。
SMTPでのメール送信時にエラーメッセージが即座に返ってくる場合と、後からバウンスメールとして返ってくる場合がある理由には、主にメール送信プロセスに関わる「同期エラー」と「非同期エラー」の違いが影響しています。 以下の点がその差を説明する重要な要素です。 1. 同期エラー(即座にエラーメッセージが返ってくる場合) SMTPサーバー間の通信は、リアルタイムでやり取りされるプロセスで、メールを送信する際に、送信側のサーバーが受信側のサーバーに直接接続し、メッセージの受け渡しが行われます。 この時点で、もし何らかの問題が発生した場合(例えば、受信者のメールサーバーがダウンしている、メールボックスが存在しないなど)、即座にエラーが返されます。 このようなエラーは「同期エラー」と呼ばれ、メールの送信が完了する前に検出されます。 例: ・メールアドレスが存在しない ・受信サーバーが接続を拒否した ・ドメインが存在しない 2. 非同期エラー(しばらくしてバウンスメールが返ってくる場合) 一方で、メールが一度受信サーバーに渡された後に問題が発生する場合もあります。 例えば、メールは一旦受信サーバーに到達したが、受信者のメールボックスがいっぱいで受け取れないなどの状況です。 このような場合、受信側サーバーはメールの受信を試み、問題が発生した場合に、送信者に対して後からバウンスメール(Delivery Status Notification)が送信されます。 これは「非同期エラー」として扱われます。 例: ・受信者のメールボックスがいっぱい ・一時的なネットワーク障害 ・ウイルスチェックやスパムフィルターによる拒否 エラーメッセージが即座に返らない理由 SMTPの設計上、メールは受信サーバーに一度送信された後、後続のプロセス(メールボックスの容量チェックやコンテンツチェックなど)は非同期に行われます。 そのため、メールが送信された時点では問題が検知されず、後のステージで問題が見つかった場合に、バウンスメールが発生します。 結論 ・同期エラーは、SMTPプロトコルの通信中にすぐに検出されるため、即座にエラーメッセージが返ってきます。 ・非同期エラーは、メールが一度送信された後に発生するため、後からバウンスメールとして送信者に通知されることがあります。 これにより、エラーが即座に返ってくるか、バウンスメールが後から送られるかの違いが生じるのです。
以下は「SMTPでのメール送信時に『受信者のメールボックスがいっぱい』のエラーが返されることがある理由」をChatGPTに追加質問したときの回答。
確かに、受信者のメールボックスがいっぱいでメールを受信できないという問題は、通常は非同期エラーに該当することが多いです。 しかし、今回の場合、SMTP送信時に即座にエラーメッセージが返ってきた理由は、受信側のメールサーバーの動作によるものです。 以下がその詳細です。 1. 受信サーバーのリアルタイムチェック機能 一部の受信サーバー、特に大手のメールプロバイダー(例:GoogleのGmailなど)は、メールの受信プロセスの初期段階で、メールボックスの容量をリアルタイムでチェックすることがあります。 このようなサーバーは、SMTP通信が行われている際にすでにメールボックスがいっぱいであることを検出すると、その場でエラーを返します。 これにより、同期エラーのように見える状況が発生します。 2. SMTPのエラーハンドリング SMTPには、メールの送信プロセスの途中でさまざまなステータスチェックが含まれています。 メールサーバーは、メールの受信が可能かどうかを確認しながら送信を処理します。 特に以下のようなSMTPの段階で問題が発生すると、即座にエラーが返されます。 ・MAIL FROM コマンドの後 ・RCPT TO コマンドの後(受信者が有効であるか、メールを受け取れる状態か確認) 上記のようなSMTPコマンドが実行された時点で、受信サーバーはメールボックスがいっぱいであることをすぐに認識し、エラーを返すことがあります。 このため、非同期エラーの性質を持ちながらも、SMTP通信中に即座に検出されることが可能です。 3. メールサーバーの設計による違い エラーのタイミングは、受信側メールサーバーの設計や設定に依存します。 以下のような設計がある場合、エラーが即座に返されます。 ・高頻度でリアルタイムにメールボックスの状態を監視し、SMTPプロトコル内で即座にエラーチェックを行う。 ・ストレージ制限を厳密に管理しており、容量オーバーの場合にはメールを受け取るプロセスの早い段階でそれを通知。 Gmailなどの大手サービスでは、メールボックスの容量オーバーやその他の受信不能な理由があれば、遅延なくエラーメッセージを即座に返すことで、送信者側で早めに問題を把握できるようになっています。 まとめ 今回のケースでは、受信サーバーがリアルタイムでメールボックスの容量チェックを行い、SMTP通信の初期段階でメールの受信が不可能であることを検出したため、即座にエラーメッセージが返されたのだと考えられます。 これは受信サーバー側の機能によるものであり、通常の非同期エラーとは異なり、同期エラーとして扱われています。
メールを送信する際、迷惑メール扱いされないための設定
・SPF、DKIM、DMARCなどについて後述する。 ・PHPからメールを送信する際にFromを任意のアドレスに設定できるが、 ドメインを変えると「送信元アドレスの詐称」とみなされる可能性が高くなるので注意。 そのサーバのドメインのアドレスを指定し、そのアドレスは「送信専用アドレス」とするなどを検討する。 ・メール送信サーバは、オートスケールを行わない前提。 ・以降の内容はAWSで2台固定(203.0.113.1 と 203.0.113.2)のWebサーバからメールを送信する前提。 DNSはRoute53を使用している。
メールを送信する際、迷惑メール扱いされないための設定(SPF)
■SPFの概要 メールを送信するサーバのIPアドレスを、送信したいドメインのDNSレコード内で宣言をしておく。 これにより、不正なサーバからのメール送信を禁止する。 ※SPFレコードは後付で用意されたもの。当初SPFはメモ書き用レコードであるTXTに設定されていた。 SPFレコードを解釈できないサーバ向けに、SPFとTXTの両方のレコードに同じ内容を設定しておくのが好ましい。 ※メール送信サーバをスケーリングさせる場合、SPFレコード反映のタイムラグが問題になる可能性がある。 そのため、メール送信サーバはマルチAZで手動スケーリングにするか、SESを使う必要がありそう。 SPFとは?SPFの仕組みとSPFレコードの設定方法について解説します│教えて!レンタルサーバーのこと - ロリポップ!レンタルサーバー https://lolipop.jp/media/what-is-an-spf-record/ SPFレコードとは?正しい書き方を徹底解説 - カゴヤのサーバー研究室 https://www.kagoya.jp/howto/it-glossary/mail/spf/ SPFレコードを Amazon Route 53 に登録する https://blog.apar.jp/linux/737/ SPFとは http://e-words.jp/w/SPF.html hatena は今すぐSPF宣言しましょう。 http://pen2.hateblo.jp/entry/20090614/1244983020 SPF(Sender Policy Framework) http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/ 10. SPFレコードの記述例 「ip4やip6の記法で簡潔に記述することを推奨する」 「RFCでは、連結したあとの1つのレコードが450バイト以下であることが目安とされている」 ■SPFレコードの設定 送信元メールアドレスの正当性付与の為、SPFレコードをRoute53へ登録。 「Route 53 → Hosted zones → (ドメインを選択) → Create Record Set」から登録する。 今回は2台のサーバ(203.0.113.1 と 203.0.113.2 とする)からrefirio.netドメインとしてメール配信を行うため、以下のように登録。 ---------------------------------------------------------------------- Name Type Value ---------------------------------------------------------------------- refirio.net SPF "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all" refirio.net TXT "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all" ---------------------------------------------------------------------- IPアドレスではなくAレコードで登録することもできるが、DNSの参照回数は10回が上限となっている。 参照回数を減らすために、AレコードではなくIPアドレスで登録する方が無難そう。 SPF について知らなかった 3 つのこと | はったりエンジニアの備忘録 https://blog.manabusakai.com/2017/08/spf-misconception/ 間違いから学ぶSPFレコードの正しい書き方 : 迷惑メール対策委員会 https://salt.iajapan.org/wpmu/anti_spam/admin/operation/information/spf_i01/ DNS - SPFチェックでエラーが出る|teratail https://teratail.com/questions/180645 また、以下のサイトからSPFレコードの登録内容を確認できる。 SPF Record Check & SPF Lookup - Sender Policy Framework (SPF) - MxToolBox https://mxtoolbox.com/spf.aspx 末尾の「all」は「-all」と「~all」がある。特に理由がなければ「-all」で良さそう。 SPFレコード”~all”と”-all”の違い | SugiBlog https://k-sugi.sakura.ne.jp/it_synthesis/linux/3632/ SPFレコードではAレコードを指定することもでき、具体的には以下のように設定する。 送信元メールアドレスの正当性付与の為、SPFレコードをDNSへ登録。 ---------------------------------------------------------------------- Name Type Value ---------------------------------------------------------------------- refirio.net SPF "v=spf1 a:web1.refirio.net a:web2.refirio.net -all" refirio.net TXT "v=spf1 a:web1.refirio.net a:web2.refirio.net -all" ---------------------------------------------------------------------- IPアドレスとAレコードの両方を設定することもできる。 ただしAレコードを登録する場合、AレコードでIPを正引きできないとfail扱いになるのであらかじめ設定しておく。 管理がややこしいので、IPアドレスかAレコードのどちらかに統一する方がいいかも…と思ったが、DNSの参照回数は10回が上限となっている。 参照回数を減らすために、AレコードではなくIPアドレスで登録する方が無難そう。 また「include」を使うことにより、外部の設定取り込むことができる。 後述の「Gmail用の設定」も参照。 以下は複数のincludeとIPアドレスを指定した場合の例。
"v=spf1 include:_spf.example.ne.jp include:spf.example.jp ip4:203.0.113.1 ip4:203.0.113.2 ~all"
SPF レコードの例 | なりすまし対策ポータル ナリタイ https://www.naritai.jp/guidance_spf_example.html ■設定反映を確認 SPFレコードの設定完了後、設定が反映されているか確認。 適当なサーバのコンソールから以下のコマンドを実行。
$ dig refirio.net txt
以下の項目が表示されればOK。
;; ANSWER SECTION: refirio.net. 227 IN TXT "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all"
更に以下のコマンドを実行。
$ dig refirio.net spf
以下の項目が表示されればOK。
;; ANSWER SECTION: refirio.net. 227 IN SPF "v=spf1 ip4:203.0.113.1 ip4:203.0.113.2 -all"
もしくは、以下のコマンドでもTXTレコードやSPFレコードの設定を確認できる。
$ host -t txt refirio.net $ host -t spf refirio.net
■正当性を確認 上記で問題がなければ、以下の手順で正当性が保たれているか確認。 適当なサーバのコンソールから以下のコマンドを実行。xxxxxx@gmail.com は自身のGmailのアドレスにする。 admin@refirio.net は送信元メールアドレスを設定する。 (もしくはPHPなどでメール送信プログラムを作成し、自身のGmailアドレスに送信してもいい。)
echo "Text Mail." | mail -s "test mail" -r admin@refirio.net xxxxxx@gmail.com
Gmailへログインし、受信したメールヘッダを確認。 以下のように spf=pass が表示されていれば成功。(問題がある場合、spf=fail となる。)
Authentication-Results: mx.google.com; spf=pass (google.com: domain of admin@refirio.net designates 203.0.113.1 as permitted sender) smtp.mailfrom=admin@refirio.net
独自ドメインのメール送信を SPF に対応させる方法 http://webos-goodies.jp/archives/51103006.html 以下のようなツールでも、SPFの反映をチェックできる。 SPF Records http://mxtoolbox.com/spf.aspx SPF Viewer https://dmarcian.com/spf-survey/ 例えば送信先をロリポップのメールアドレスにして、そのメールアドレスからGmailに転送した場合、spf=fail になる。 これは別サーバを経由しているためだが、現状決定的な解決策は無いみたい。 運用に関する提案 http://salt.iajapan.org/wpmu/anti_spam/admin/operation/suggestion/ 初回の設定は比較的すぐに反映されるようだが、変更した場合は24時間〜72時間程度かかるかも。 SPFレコードはDNSの新しい定義方法のため、DNSサーバによっては扱えない場合がある。 可能であれば、SPFとTXTの両方に同じ設定をしておくことが望ましい。 ただしこの場合、チェッカーによってはduplicateの警告が表示されるみたい。 Gmailが大丈夫なら、Yahoo!でも同様にテストしておく。(Yahoo!メールに送信し、メールヘッダを確認。) ■Gmail用の設定 送信(SMTP)に使われる Google の IP アドレスの範囲 - G Suite 管理者 ヘルプ https://support.google.com/a/answer/60764?hl=ja 「include:_spf.google.com」を設定するといいみたい。 以下は設定例。(詳細は要勉強。) ---------------------------------------------------------------------- Name Type Value ---------------------------------------------------------------------- test-web1.refirio.net A 203.0.113.1 test-web2.refirio.net A 203.0.113.2 test.refirio.net SPF "v=spf1 a:test-web1.refirio.net a:test-web2.refirio.net include:_spf.google.com -all" test.refirio.net TXT "v=spf1 a:test-web1.refirio.net a:test-web2.refirio.net include:_spf.google.com -all" test.refirio.net CNAME test-123456789.ap-northeast-1.elb.amazonaws.com. ----------------------------------------------------------------------
メールを送信する際、迷惑メール扱いされないための設定(DKIM)
■DKIMの概要 電子書面により、メールの改ざんを検知できる。 一例だが、おおまかに 1. OpenDKIMをインストールし、専用コマンドでキーペアを作成する。 2. Postfixの設定を調整し、メール送信時にOpenDKIMで署名されるようにする。(秘密鍵が使われる。) 3. DNSを調整し、誰でも署名の検証ができるようにする。(公開鍵を登録する。) 4. 送信したメールが受信者のメールサーバに到達したとき、受信サーバはDKIM署名の検証を行う。 この検証プロセスにおいて、受信サーバはメールヘッダのDKIM署名から送信ドメインを特定し、そのドメインのDNSレコードを問い合わせて公開鍵を取得する。 取得した公開鍵を用いて、署名されたメールの正当性(つまり、メールが途中で改ざんされていないこと)を検証する。 という流れになる。 上記のとおり送信サーバ側でソフトウェアのインストールや設定が伴うので、SPFに比べると導入の敷居は高い。 ■DKIMの設定 実際にメールサーバで設定したときのメモが「Mail.txt」の「DKIMの設定」にある。 実際にSESでDKIMを設定したときのメモが「AWS.txt」の「SES メール送信」にある。 DKIMとは?認証の仕組み、SPFやDMARCとの違い|メール配信システム・メルマガ配信サービスならCuenote FC https://www.cuenote.jp/fc/security/dkim.html SPFとDKIMの設定で迷惑メール扱いを回避する | LINUXの勉強ブログ https://www.jdbc.tokyo/2016/06/spf-dkim-setting/ DKIM (Domainkeys Identified Mail) : 迷惑メール対策委員会 http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/ Postfix + OpenDKIMで送信元ドメイン認証を実装するメモ - Qiita https://qiita.com/taku1201/items/3b2dffd950340b9726d0 さくらのDNSにDKIM用のレコードを登録しようとすると 「255文字以下で入力してください」 「行頭・行末に引用符「"」を記載してください」 というエラーになって登録できなかった。 よって以下のとおり、適当な場所で区切ったうえで各行を引用符でくくっている。
v=DKIM1; k=rsa; p=XXXXXjANBgkqhkiG9w0BXXXXXXXXXXXXXXXXXXXXAQEAxfCFe8mdOdtL3oRVepm7nJVGbWT3CBhZRGcCq/NzWFGP9SsAycraP5F1y9C8bnlh8thA1FJSPHgAWQig7yZfeqrYfC9wMnVjs1Cct0Z2XACOjjbXXVhW7y30jf12Pkhv3oQpIj6Z4QCzWZ+puj/jTk1ApMTMMi8ffvdr3Y8yw7LY83PLEbFIlkuqlGdXXXXXXXXXXXXXXXXXXXXIAkt/ENSo8xU1ZhXbhMJsVCOVzqj6GmPGhVrfBP9//mJDnpv2sxYZpgZ5mH5StDG7fHmsY9/y4/OSDjSZgG30+QOs1zJAxmUms9dazVP8HLXpfINjcPGPuzNjpGzsl57UwXVL/QIDAQAB ↓ "v=DKIM1; k=rsa; p=" "XXXXXjANBgkqhkiG9w0BXXXXXXXXXXXXXXXXXXXXAQEAxfCFe8mdOdtL3oRVepm7" "nJVGbWT3CBhZRGcCq/NzWFGP9SsAycraP5F1y9C8bnlh8thA1FJSPHgAWQig7yZf" "eqrYfC9wMnVjs1Cct0Z2XACOjjbXXVhW7y30jf12Pkhv3oQpIj6Z4QCzWZ+puj/j" "Tk1ApMTMMi8ffvdr3Y8yw7LY83PLEbFIlkuqlGdXXXXXXXXXXXXXXXXXXXXIAkt/" "ENSo8xU1ZhXbhMJsVCOVzqj6GmPGhVrfBP9//mJDnpv2sxYZpgZ5mH5StDG7fHms" "Y9/y4/OSDjSZgG30+QOs1zJAxmUms9dazVP8HLXpfINjcPGPuzNjpGzsl57UwXVL" "/QIDAQAB"
同一ドメインに複数のSPFレコードを設定する方法 【ブログ】 >> 群馬県高崎市のWordPressホームページ制作会社 | Kiraba(キラバ) https://kiraba.jp/about-multi-spf-records-setting/
メールを送信する際、迷惑メール扱いされないための設定(DMARC)
■DMARCの概要 SPFやDKIMの仕組みを用いて検証した結果、送信元メールアドレスが詐称されている場合の処理をポリシーとして定義しておく。 具体的には、「何もせずに受信」「本来のメールとは別の場所に隔離」「破棄」といったアクションを事前に定義しておき、 送信元メールアドレスが詐称されていた場合はポリシーに沿って対応する。 またDMARCを設定しておくと、受信者から認証結果のレポートを受け取れるようになる。 ■DMARCの設定 実際にDMARCを設定したときのメモが「Mail.txt」の「DMARCの設定」に、 また実際にSESでDMARCを設定したときのメモが「AWS.txt」の「SES メール送信」にある。
メールを送信する際、迷惑メール扱いされないための設定(送信元メールアドレス)
■「エンベロープFrom」と「ヘッダーFrom」 「エンベロープFrom」と「ヘッダFrom」の違いとは? - ベアメールブログ https://baremail.jp/blog/2021/05/25/1377/ エンベロープTo ... 郵便では封筒に書かれる宛先にあたるもの。メールでは送信先のアドレスにあたる。 このアドレスが正しければ、メールを送信できる。 エンベロープFrom ... 郵便では封筒に書かれる差出人にあたるもの。メールでは実際に送信した差出人(送信元)にあたる。 メールヘッダでは「Return-Path」として記録される。 ヘッダTo ... 郵便では便箋に書かれる宛先にあたるもの。メールではメールソフト上で確認できる宛先にあたる。 BCCで送信する場合、ここに設定したメールアドレスが削除される。 ヘッダFrom ... 郵便では便箋に書かれる差出人にあたるもの。メールではメールソフト上で表示される差出人(Fromアドレス)にあたる。 容易に詐称できる。 ■送信元メールアドレスの指定 メールを送信するプログラムを書く際、送信元のメールアドレスを指定できる。 送信元のメールアドレスは「ヘッダーFrom」とも呼ばれ、送信者が自由に変更できる。 例えばPHPの場合はmail関数でメールを送信できるが、第4引数でメールヘッダの内容を指定でき、ここでメールの送信元アドレスを指定できる。 具体的には以下のように記述すると、from@example.com がメールの送信元になる。
mail('to@example.com', '題名', 'メール本文', 'From: from@example.com');
さらに、PHPの場合はmail関数の第5引数でリターンパス(Return-Path)を指定できる。 リターンパスは「エンベロープFrom」とも呼ばれ、メッセージが何らかのトラブルにより届けられなかった場合の、エラーの通知先として利用される。 (それ以外に、Bccによるメール送信を可能にしている仕組みでもある。) 具体的には以下のように記述すると、system@example.com がリターンパスになる。
mail('to@example.com', '題名', 'メール本文', 'From: from@example.com', '-f system@example.com');
「エンベロープFrom」は「ヘッダーFrom」を指定しても上書きされない。 またリターンパスを指定しなかった場合「実行ユーザ名@ホスト名」となるが、サーバが複数台構成の場合に問題になることがある。 具体的には送信元が apache@web1.refirio.net や apache@web2.refirio.net となった場合、 送信元サーバが web1.refirio.net や web2.refirio.net とみなされるため、上で設定した refirio.net のDNS設定内容は参照されない。 「エンベロープFrom」と「ヘッダFrom」の違いとは? - ベアメールブログ https://baremail.jp/blog/2021/05/25/1377/ sendmail コマンドによるメール発信 - Postfix Advent Calendar 2014 https://fumiyas.github.io/2014/12/13/sendmail.postfix-advent-calendar.html PHP mail関数でenvelope-fromを指定する方法 http://kaworu.jpn.org/kaworu/2008-02-17-2.php このようなことを避けるため、「-f auto@refirio.net」のようにリターンパスを常に指定しておくのが無難。 そうでなければ以下のように、それぞれのホストに対して個別に設定を行う必要がある。 ----------------------------------------------------- Name Type Value ----------------------------------------------------- web1.refirio.net SPF "v=spf1 ip4:203.0.113.1 -all" web1.refirio.net TXT "v=spf1 ip4:203.0.113.1 -all" web2.refirio.net SPF "v=spf1 ip4:203.0.113.2 -all" web2.refirio.net TXT "v=spf1 ip4:203.0.113.2 -all" ----------------------------------------------------- ■送信元メールアドレスの詐称 送信元メールアドレスで異なるサーバのメールアドレスを指定している場合、なりすましメールと判定されて届きづらくなる可能性がある。 「ヘッダーFrom」だけでなく「エンベロープFrom」もSPFやDKIMなどのチェック対象となる。 また「ヘッダーFrom」や「エンベロープFrom」い送信元サーバと異なるメールアドレスが指定されている場合、 信頼性の低い送信者とみなされることがある。 よって原則、「エンベロープFrom」と「ヘッダーFrom」は送信サーバのメールアドレスを指定しておくのが無難。 2024年2月以降Gmailに送信するための新要件とは? 新しい送信者ガイドラインへの対応策 - ベアメールブログ https://baremail.jp/blog/2023/12/18/3640/
メールを送信する際、迷惑メール扱いされないための設定(その他)
■正引きの設定 メール送信サーバにて正引きが行えるよう、Route53にAレコードを登録しておく。 (http://web1.refirio.net/ http://web2.refirio.net/ で直接サーバにアクセスできるようになる。) ----------------------------------- Name Type Value ----------------------------------- web1.refirio.net A 203.0.113.1 web2.refirio.net A 203.0.113.2 ----------------------------------- ■メールを送らないドメイン用の設定 メールを受け取らないドメイン名に"Null MX"のリソースレコードを登録してみる - インフラエンジニアway - Powered by HEARTBEATS https://heartbeats.jp/hbblog/2016/12/null-mx.html 以下は設定例。(詳細は要勉強。) ---------------------------------------------------------------------- Name Type Value ---------------------------------------------------------------------- test.refirio.net MX 0 . ---------------------------------------------------------------------- ■メールヘッダの警告削除 メールヘッダに X-Authentication-Warning が含まれている場合、以下の対応も行う。 メールヘッダに X-Authentication-Warning: が付かないようにする http://www.omakase.org/mail/_x-authentication-warning.html phpからメールを送るとX-Authentication-Warningヘッダがご丁寧に http://www.orenante.com/?p=743 AWSでの対応は以下にまとめられているが、2013年の記事。 Amazon EC2 Eメール送信ベストプラクティス | Developers.IO https://dev.classmethod.jp/cloud/aws/ec2-send-email-best-practice/ ■Postmasterツール 自分の送ったメールがGmailでどれぐらい迷惑メール判定されているかがわかるツール。 (登録しても内容が表示されない場合、日を置いて確認する。メールトラフィックが少なすぎる場合も表示されないらしい。) Postmaster Tools https://gmail.com/postmaster/ にアクセスし、「Get Started」から開始する。 「メールの認証に使用するドメイン」を登録すると
refirio.net の所有権の確認 1. refirio.net の DNS 設定に TXT レコードを追加します。 TXT レコード: google-site-verification=XXXXX
のように表示されるので、DNSに登録する。 「ダブルクォートで囲う必要がある」「すでにTXTレコードがあれば、既存のものに改行して追加する」という点に注意。 Route53で、refirio.net のTXTレコードを以下のように変更。
"v=spf1 a:web1.refirio.net a:web2.refirio.net -all"
"v=spf1 a:web1.refirio.net a:web2.refirio.net -all" "google-site-verification=XXXXX"
以下のコマンドで反映を確認。
$ dig refirio.net any
Postmaster Tools で「確認」ボタンを押して完了する。 ドメインが「確認済み」になった。 Postmaster Tools で refirio.net のドメインをクリックして診断を表示する。 自社のメールがGmailでどれだけスパム判定されてるか、グーグルのPostmaster Toolsで調べてみた | 編集長ブログ―安田英久 | Web担当者Forum https://webtan.impress.co.jp/e/2015/08/25/20863 AWS Route 53でTXTレコードを追加できない場合の対処法 - Qiita https://qiita.com/s_osa/items/1e4bf69f3c77dab91275 amazon web services - Tried to create 2 record set type=TXT in Route53 - Server Fault https://serverfault.com/questions/616407/tried-to-create-2-record-set-type-txt-in-route53 ■逆引きの設定 サーバによっては、はじめから設定済みになっていることもある。 DNSの上位管理者が設定するため自分では設定できないことが多いが、専用画面から設定できることもある。 AWSの場合、具体的な操作内容は AWS.txt の「メールの制限緩和」を参照 逆引きとは何ですか?どういった用途で利用しますか? https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=94 逆引きの設定方法とは:DNS Tips - @IT https://www.atmarkit.co.jp/ait/articles/1501/05/news014.html DNS逆引きレコードの設定 | さくらのクラウド ドキュメント https://manual.sakura.ad.jp/cloud/server/reverse-hostname.html EC2インスタンスからメール送信のための準備 https://cloudpack.media/11249 ■IPv6 さくらの専用サーバなど、送信元IPがIPv6のアドレスのものになることがある。 この場合、IPv4のアドレスをSPFに登録しても効果がない可能性がある。 IPv4からIPv6への移行が推奨されているので、サーバの設定でIPv6の設定を無効にするのではなくSPFにIPv6の設定を追加する方が良さそう。
$ ifconfig eth0 Link encap:Ethernet HWaddr 44:8A:5B:3B:96:30 inet addr:203.0.113.1 Bcast:203.0.113.255 Mask:255.255.255.0 inet6 addr: 2001:DB8203:a:153:120:12:84/64 Scope:Global inet6 addr: fe81::469b:5bff:fe3b:9630/64 Scope:Link
この場合、以下のようにIPv6のアドレスをSPFに登録するといい。(未検証。)
ip6:2001:DB8203:a:153:120:12:84/64
■バウンスメールを解析 Command.txt の同項目を参照。 ■Gmailのメール認証規制強化 Gmailは2024年2月から迷惑メール対策を強化するとのこと。 Gmailのメール認証規制強化への対応って終わってますか? - エムスリーテックブログ https://www.m3tech.blog/entry/2023/10/24/110000 GoogleとYahooの新Eメール認証要件への短い対応タイムライン | Proofpoint JP https://www.proofpoint.com/jp/blog/email-and-cloud-threats/google-and-yahoo-set-new-email-authentica... Gmailが2024年2月から(大量)送信者に求めてることが分からない闇への防衛術(前編) #Security - Qiita https://qiita.com/nfujita55a/items/37b05801209f6058808e Gmailの新スパム規制対応全部書く https://zenn.dev/ken_yoshi/articles/gmail-new-requirements-2024 ■その他の参考ページ Gmailを利用してメール送信ドメイン認証(SPF/DKIM/DMARC)の判定結果を簡単に確認する:Tech TIPS - @IT http://www.atmarkit.co.jp/ait/articles/1701/11/news029.html GmailやYahooメールで、迷惑メールと判定されないように、GoogleApps+独自サーバ(GMOクラウド)+PHPでメールを送る場合にやること http://rough-and-ready-co-jp.blogspot.jp/2013/02/gmailyahoogoogleappsgmophp.html Gmailスパムフィルタと壮絶に闘ってみた http://tatete.blogspot.jp/2012/07/gmail.html 評判のさくらのVPSでSMTP(Sendmail)を公開する時にやっておきたいこと http://server-setting.info/blog/smtp-sakuravps-presetting.html Amazon EC2のサーバからメール送信をするまでにやるべきこと (スパムメール扱いを回避する!) http://d.hatena.ne.jp/rx7/20100319/p1 Yahoo!メール迷惑メールに振り分けられる http://taka-mori.hateblo.jp/entry/20090805/1249441550 Gmailでスパム扱いされるときの対処方法(迷惑メールフィルタ) - Qiita https://qiita.com/miwato/items/7316e55ebd2ce5a0261c 知ってた?Gmailが迷惑メール判定する7つの理由と解除方法 | フォームズのブログ https://blog.formzu.com/reason_for_being_treated_as_spam また、Trouble.txt の「メールを送信しても届かない / 迷惑メールとして処理される」も確認する。 ブラックリストに登録されている場合、リストからの削除依頼を行う必要がある。などの作業もある。 ブラックリストに登録されているか確認できるツール。 The Spamhaus Block List https://www.spamhaus.org/sbl/ APEWS http://www.apews.org/ ■PHPでのメール送信例 メールを送信する際、mb_send_mailの第5引数でバウンスメールの受け取りアドレスを設定できる。 ここにSPFなどで設定したメールアドレスを指定しておく。原則としてFromのアドレスと同じになるはず。 DNS側でSPFを設定しても、PHP側でこの指定をしていないとSPFがpassにならない可能性がある。 PHPの場合、mb_send_mail() の第5引数で指定できる。
<?php mb_language('Japanese'); mb_internal_encoding('UTF-8'); // メールを送信 if (mb_send_mail( 'to@example.com', 'テストメール', 'バウンスメールのテスト。' . "\n" . 'これはテストです。', 'From: auto@refirio.net', '-f auto@refirio.net' // バウンスメールの受け取りアドレス(Return-Path) )) { echo 'OK'; } else { echo 'NG'; }
ネットワーク図
draw.io https://www.draw.io/ draw.ioの使い方を解説〜無料の高機能作図ツールを使って資料の質をあげよう!|ferret https://ferret-plus.com/8408 draw.ioでAWSのシステム構成図を描いてみる - Qiita https://qiita.com/siruko/items/059f8ec33555b56314cf 基本セットから「Cloud」を選択。 ロードバランサーがあり、EC2が2台あり、RDSがMaster/Slaveであり、ファイルはS3に置く。 くらいのものだと思いますが、draw.io(先方希望のツール)でシステム構成図をいただくことは可能でしょうか? 「aws ネットワーク図」で画像検索するとサンプルは出てくる。
全体の流れ
ブラウザからDBに行き着くまでただまとめる https://zenn.dev/moko_poi/articles/c2402f13a870a1

Advertisement