■目次
ネットワークサブネットマスクプライベートIPアドレス例示用のドメインとIPアドレスドメインの情報セキュア通信RFCSSHでアクセスするSSHで多段接続とポートフォワーディングサーバ同士でSSH接続SSHの操作ログを記録telnetでアクセスするパケットキャプチャを行うネットワークを確認ネットワークの設定を確認とあるポート番号を誰が使っているか調べるとあるプロセスがどのポート番号を使っているか調べる通信量の多いプロセスを調べる通信量の多い相手を調べるメールを送信する際、迷惑メール扱いされないための設定メールを送信する際、バウンスメールの受け取りアドレスを設定するメールを送信する際、ハードバウンスが発生しないようにする
■ネットワーク
基礎からのネットワーク&サーバ構築 改訂版 まとめ - Qiita https://qiita.com/chrischris0801/items/b2e14655b86c96ca585f ■通信の用語 ネットワーク ... 複数のコンピュータを繋ぐ通信網 AWSではVPCと呼ばれる サブネット ... ネットワーク内に作成する、規模の小さなネットワーク サブネットワークの略 ゲートウェイ ... 異なるネットワーク間の相互通信を可能にする仕組み、または機器のこと インターネットゲートウェイとも呼ばれる ルーター ... 異なるネットワーク間を中継する通信機器 デフォルトゲートウェイ ... 異なるネットワークへの出口 つまりルーターのこと ルートテーブル ... 個々のネットワークの宛先への経路一覧を保持している、テーブル状のデータ構造 ルーターやネットワーク接続されたコンピュータが持っている ルーティングテーブルとも呼ばれる デフォルトルート ... ルートテーブルに設定されていないIPアドレス宛てのすべてのパケットは、デフォルトルート経由で送信される 一般的にデフォルトルートは、デフォルトゲートウェイを指すようになっている デフォルトルートは 0.0.0.0 と表記され、「すべてのアドレス」ということ ブロードキャストアドレス ... ネットワーク内のすべての端末にデータを送信するために使われる特殊なアドレス 255.255.255.255
■サブネットマスク
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アドレス。ネットワークにならない
■プライベート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
■例示用のドメインと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/
■ドメインの情報
$ 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 レコードの意味は以下の通り 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レコードと同一の内容を設定しておく 俺の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 ゾーンファイル (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 以下のようにすると、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 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
■セキュア通信
エンジニアなら知っておきたい、絵で見てわかるセキュア通信の基本 - 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
■RFC
RFC(Request for Comments)は インターネットで用いられるさまざまな技術の標準化や運用に関する事項など 幅広い情報共有を行うために公開される文書 インターネット10分講座 - JPNIC https://www.nic.ad.jp/ja/newsletter/No24/090.html
■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接続の確認 以下はAWSのEC2に接続する例だが、他への接続でも書き方は同じ $ 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で多段接続とポートフォワーディング
■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(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 ■ConEmuで多段接続 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でファイル送受信する | ♪8thNote♪ http://blog.c-production.com/?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 … 接続 ■鍵で接続 パブリックIPを持たないEC2インスタンへアクセスする場合など 「-i」に続けて秘密鍵を指定できる 秘密鍵を指定してアクセスする手順 秘密鍵はあらかじめ入手済みとする # 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-agentの使い方 - Qiita http://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf ■設定ファイルを利用して接続 設定ファイルに接続方法を書いておくことにより、簡単に接続できる 例えば踏み台サーバに以下の設定を記載しておくと、 「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
■telnetでアクセスする
ネットワーク関連のデバッグなどに、telnetを使うと原因究明しやすいことがある (SSH登場前は、telnetを使ってリモートサーバにログインすることが一般的だった ただし現在はあくまでもデバッグ目的の利用とし、リモートサーバの操作はデータが暗号化されるSSHを使うことを推奨) telnetの基本的な使い方は、以下のページが詳しい WindowsのTelnetクライアントの使い方 http://www.atmarkit.co.jp/ait/articles/0207/06/news002.html Unixの場合ははじめからインストール済みになっているかもしれないが、 使えない場合は以下でインストールする # 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 153.121.33.84 22 … SSHのポートに接続 Trying 153.121.33.84... SSH-2.0-OpenSSH_5.3 … ENTERを入力 Protocol mismatch. … プロトコルが異なるので操作はできない > quit … 接続終了 $ 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. telnetでログインしてサーバを操作したい場合、あらかじめ対象サーバにtelnetサーバをインストールする必要がある ただしtelnetは通信が暗号化されないため、「一時的にSSHサーバを削除する」のような場合を除いて使わないことを推奨 SSHサーバー構築(OpenSSH) - CentOSで自宅サーバー構築 http://centossrv.com/openssh.shtml
■パケットキャプチャを行う
# 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
■ネットワークを確認
$ 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 … ネットワークサービスの再起動 ※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 $ whois refirio.jp … ドメインのwhois情報を確認 whoisコマンドが見つからない(CentOSなど)場合、以下のようにすればインストールできる # yum install jwhois
■ネットワークの設定を確認
有線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
■とあるポート番号を誰が使っているか調べる
# 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秒間の平均通信量 を表す
■メールを送信する際、迷惑メール扱いされないための設定
※PHPからメールを送信する際にFromを任意のアドレスに設定できるが、 ドメインを変えると「送信元アドレスの詐称」とみなされる可能性が高くなるので注意 そのサーバのドメインのアドレスを指定し、そのアドレスは「送信専用アドレス」とするなどを検討する ※メール送信サーバはオートスケーリングでない前提 ※SPFレコードは後付で用意されたもの。当初SPFはメモ書き用レコードであるTXTに設定されていた SPFレコードを解釈できないサーバ向けに、SPFとTXTの両方のレコードに同じ内容を設定しておくのが好ましい ※メール送信サーバをスケーリングさせる場合、SPFレコード反映のタイムラグが問題になる可能性がある そのため、メール送信サーバはマルチAZで手動スケーリングにするか、SESを使う必要がありそう ※以下の内容はAWSで2台のWebサーバからメールを送信する前提 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バイト以下であることが目安とされている」 メールヘッダに 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 ■設定(IPアドレスを指定する場合・推奨) 送信元メールアドレスの正当性付与の為、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" ---------------------------------------------------------------------- ■設定(Aレコードを指定する場合) メール送信サーバにて正引きが行えるよう、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 ----------------------------------- 送信元メールアドレスの正当性付与の為、SPFレコードをRoute53へ登録 ---------------------------------------------------------------------- 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レコードでIPを正引きできないとfail扱いになる 管理がややこしいので、IPアドレスかAレコードのどちらかに統一する方がいいかも ■設定(送信元メールアドレスについて補足) メール送信時の引数(PHPの場合はmail関数の第5引数)で「-f auto@refirio.net」と指定すると、送信元サーバが refirio.net とみなされる 指定しなかった場合「実行ユーザ名@ホスト名」となるが、サーバが複数台構成の場合に問題になることがある 具体的には送信元が apache@web1.refirio.net や apache@web2.refirio.net となった場合、 送信元サーバが web1.refirio.net や web2.refirio.net とみなされるため、上で設定した refirio.net の設定内容は参照されない この値は、メールヘッダでFromやSenderを設定しても上書きできない 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" ----------------------------------------------------- ■設定の反映を確認 レコード完了後、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 ただし、Gmail自身はこの設定内容をあまり重視していないらしい 独自ドメインのメール送信を 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!メールに送信し、メールヘッダを確認) ■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 ■AWSに制限解除を申請(迷惑メール対策ではないが、AWSの場合は忘れずに申請しておく)
Use Case Description: Removal of E-mail sending limit width rDNS registration Elastic IP Address 1: 203.0.113.1 Elastic IP Address 2: 203.0.113.2 Reverse DNS Record for EIP 1: web1.refirio.net Reverse DNS Record for EIP 2: web2.refirio.net
一日ほどで以下のメールが届いた
件名:Your AWS Inquiry 本文: Hello, We have configured the reverse DNS records you requested. Your request was mapped for web1.refirio.net as rDNS for 203.0.113.1 and web2.refirio.net as rDNS for 203.0.113.2. Please note that propagation of this update to DNSBL services that Amazon works with may take up to a week. Email sending limitations have also been removed for any resources for the region your EIP is located in. Please let us know if you have any questions.
■その他の参考ページ 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 ブラックリストに登録されているか確認できるツール The Spamhaus Block List https://www.spamhaus.org/sbl/ APEWS http://www.apews.org/ DKIMというものもあるらしい。要調査 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/ DKIM、SPF、DMARCを設定すると良いらしい。要調査 そもそも「SES経由で配信するようにすれば一発で解決しますよ。」のようなことも書かれている Gmailでスパム扱いされるときの対処方法(迷惑メールフィルタ) - Qiita https://qiita.com/miwato/items/7316e55ebd2ce5a0261c Gmailを利用してメール送信ドメイン認証(SPF/DKIM/DMARC)の判定結果を簡単に確認する:Tech TIPS - @IT http://www.atmarkit.co.jp/ait/articles/1701/11/news029.html Amazon SES でメールを送る場合、DNS に SPF 設定は不要だという話 - Qiita https://qiita.com/koseki/items/4f291579cf4ceb9f9e47
■メールを送信する際、バウンスメールの受け取りアドレスを設定する
PHPの場合、mb_send_mail() の第5引数で指定できる
<?php mb_language('Japanese'); mb_internal_encoding('UTF-8'); // メールを送信 if (mb_send_mail( 'example@example.com', 'テストメール', 'バウンスメールのテスト。' . "\n" . 'これはテストです。', 'From: auto@refirio.net', '-f auto@refirio.net' // バウンスメールの受け取りアドレス(Return-Path) )) { echo 'OK'; } else { echo 'NG'; }
■メールを送信する際、ハードバウンスが発生しないようにする
メールアドレスをリアルタイムに検証してハードバウンスをなくす方法 https://sendgrid.kke.co.jp/blog/?p=7837 バウンス理由の一覧 http://libsisimai.org/ja/reason/