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
■ドメイン
■ドメインとサブドメイン ドメインは、インターネット上の住所 サブドメインは、ドメイン内に割り当てられるドメイン ドメインとは?メリット・種類・決め方をかんたんに解説|ドメイン取るならお名前.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サーバがルートサーバやjpサーバなどに問い合わせ、その結果を一定時間保持しているらしい 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 ■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 】コマンド――ドメイン名から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コマンドでの接続) 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 ■メール送信 メールを送ろう。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
■メールを送信する際、迷惑メール扱いされないための設定
・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 ■送信元メールアドレスについて補足 メールを送信するプログラムを書く際、送信元のメールアドレスを指定できる 送信元のメールアドレスは「ヘッダーFrom」とも呼ばれ、送信者が自由に変更できる 例えばPHPの場合はmail関数でメールを送信できるが、第4引数でメールヘッダの内容を指定でき、ここでメールの送信元アドレスを指定できる 具体的には以下のように記述すると、from@example.com がメールの送信元になる
mail('to@example.com', '題名', 'メール本文', 'From: from@example.com');
さらに、PHPの場合はmail関数の第5引数でリターンパス(Return-Path)を指定できる リターンパスは「エンベロープFrom」とも呼ばれ、メッセージが何らかのトラブルにより届けられなかった場合の、エラーの通知先として利用される 具体的には以下のように記述すると、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設定内容は参照されない 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」で異なるサーバのメールアドレスを指定している場合、 なりすましメールと判定されて届きづらくなる可能性があるので避ける (原則、「エンベロープFrom」と「ヘッダーFrom」は同じメールアドレスを指定しておくのが無難だと思われる また送信専用のメールアドレスを用意し、そのメールアドレスを指定しておくのが無難だと思われる) 2024年2月以降Gmailに送信するための新要件とは? 新しい送信者ガイドラインへの対応策 - ベアメールブログ https://baremail.jp/blog/2023/12/18/3640/ ■設定反映を確認 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の設定 実際にSESでDMARCを設定したときのメモが「AWS.txt」の「SES メール送信」にある DMARCとは?送信ドメイン認証の仕組みを理解して、なりすまし対策をしよう! | メルラボ https://mailmarketinglab.jp/about-dmarc/ 送信ドメイン認証技術(SPF、DKIM )やDMARCとはどのような仕組みか?|メールマーケティングのCuenote https://www.cuenote.jp/library/marketing/dmarc.html なりすましを撲滅する?「DMARC」の概要をざっくり理解しよう | メルラボ https://mailmarketinglab.jp/about-dmarc/ Amazon Linux 2でDKIMの設定 (ついでにSPF/DMARCも) - Qiita https://qiita.com/biatunky/items/9009c95754da4b2e5571
■メールを送信する際、迷惑メール扱いされないための設定(その他)
■正引きの設定 メール送信サーバにて正引きが行えるよう、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