AWSでDHCPv6を有効にする

AWSユーザーガイドのIPv6への移行 シナリオにしたがってCentOS7のDHCPv6を有効にした手順を未来の自分にメモします。

 まずインスタンス内から外に向けてping6 を打ってみます。

$ ping6 ipv6.google.com
connect: Network is unreachable

届きませんでしたね。そこで以下のカスタムファイルを作成して保存します。

# vi /etc/cloud/cloud.cfg.d/99-custom-networking.cfg
network: version: 1 config: - type: physical name: eth0 subnets: - type: dhcp - type: dhcp6

ここからifcfg-eth0を手動で編集します。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPV6INIT=no ↓ IPV6INIT=yes
DHCPV6C=yes (追記 NM_CONTROLLED=no (追記

/etc/sysconfig/network を開いて以下の行を追記して保存します。

# vi /etc/sysconfig/network
NETWORKING_IPV6=yes (追記

続いて次のコマンドで/etc/sysctl.d 下のインターフェイス固有ファイルにaccept_ra=1を設定します。

# echo "net.ipv6.conf.eth0.accept_ra=1" > /etc/sysctl.d/enable-ipv6-ra.conf && sysctl -p /etc/sysctl.d/enable-ipv6-ra.conf

accept_ra = 1 と確定していればOKです。

# ssysctl -a | grep "net.ipv6.conf.eth0.accept_ra"
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
net.ipv6.conf.eth0.accept_ra = 1
net.ipv6.conf.eth0.accept_ra_defrtr = 1
net.ipv6.conf.eth0.accept_ra_pinfo = 1
net.ipv6.conf.eth0.accept_ra_rt_info_max_plen = 0
net.ipv6.conf.eth0.accept_ra_rtr_pref = 1

最後にsystemctl restart network でインターフェイスを再起動してping6を確認します。

$ ping6 ipv6.google.com
PING ipv6.google.com(nrt20s08-in-x0e.1e100.net (2404:6800:4004:808::200e)) 56 data bytes 64 bytes from nrt20s08-in-x0e.1e100.net (2404:6800:4004:808::200e): icmp_seq=1 ttl=104 time=2.32 ms 64 bytes from nrt20s08-in-x0e.1e100.net (2404:6800:4004:808::200e): icmp_seq=2 ttl=104 time=2.40 ms 64 bytes from nrt20s08-in-x0e.1e100.net (2404:6800:4004:808::200e): icmp_seq=3 ttl=104 time=2.35 ms 64 bytes from nrt20s08-in-x0e.1e100.net (2404:6800:4004:808::200e): icmp_seq=4 ttl=104 time=2.38 ms

今度はping6 が到達するようになりました。

参考サイト:

Amazon Virtual Private Cloud – ユーザーガイド

Crontis: AWS EC2 IPv6 not working

AWSのCentOS7にdnsmasqをインストールしてみた

Amazon EC2 Linux インスタンスでの DNS 解決の失敗を回避するにはどうすればよいですか? | aws.amazon.com

によるAmazon Linux2 のDNSキャッシュサーバーのチュートリアルを試してみたのですがCentOS7の場合は設定詳細が若干、違うようなのでGoogle先生に訊いたところミッションクリティカルな記事があったのでシェアしたいと思います。

AWS環境のRHEL7/8にDNSキャッシュ(dnsmasq)を設定してみた

# yum -y install dnsmasq
# groupadd -r dnsmasq # useradd -r -g dnsmasq dnsmasq

・・・confファイルを設定して /etc/resolv.dnsmasq のところで躓きましたがスクリプトをコンソールにコピペすれば良く自己解決しました。

DNSIP="$(awk -e '/^nameserver/{ print $2}' /etc/resolv.conf)"
echo $DNSIP

sudo bash -c "echo \"nameserver $DNSIP\" > /etc/resolv.dnsmasq"

systemctl status dnsmasq してサービスのステータスを確認、正常起動。

[root@www ~]# systemctl status dnsmasq
 dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-03-22 18:13:50 JST; 1h 31min ago
 Main PID: 17028 (dnsmasq)
   CGroup: /system.slice/dnsmasq.service
           mq17028 /usr/sbin/dnsmasq -k

Mar 22 18:13:50 www systemd[1]: Stopped DNS caching server..
Mar 22 18:13:50 www systemd[1]: Started DNS caching server..
Mar 22 18:13:50 www dnsmasq[17028]: listening on lo(#1): 127.0.0.1
Mar 22 18:13:50 www dnsmasq[17028]: started, version 2.76 cachesize 500
Mar 22 18:13:50 www dnsmasq[17028]: compile time options: IPv6 GNU-getopt D...fy
Mar 22 18:13:50 www dnsmasq[17028]: reading /etc/resolv.dnsmasq
Mar 22 18:13:50 www dnsmasq[17028]: using nameserver 10.0.0.2#53
Mar 22 18:13:50 www dnsmasq[17028]: read /etc/hosts - 2 addresses
Mar 22 18:49:59 www dnsmasq[17028]: reading /etc/resolv.dnsmasq
Mar 22 18:49:59 www dnsmasq[17028]: using nameserver 10.0.0.2#53
Hint: Some lines were ellipsized, use -l to show in full.
# dig aws.amazon.com @127.0.0.1 

してレコードを無事、引くことができました。

[root@www ~]# dig aws.amazon.com @127.0.0.1

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.4 <<>> aws.amazon.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53163
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aws.amazon.com.                        IN      A

;; ANSWER SECTION:
aws.amazon.com.         39      IN      CNAME   tp.8e49140c2-frontier.amazon.com.
tp.8e49140c2-frontier.amazon.com. 39 IN CNAME   dr49lng3n1n2s.cloudfront.net.
dr49lng3n1n2s.cloudfront.net. 39 IN     A       143.204.75.74

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Mar 22 19:49:24 JST 2021
;; MSG SIZE  rcvd: 137

PHP再コンパイル

Apache2.4をWorkerモードで起動したい・・・そんな理由で結局、PHP7.4を再コンパイルしました。

# vi /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_worker_module modules/mod_mpm_worker.so ←チェックアウト
#LoadModule mpm_event_module modules/mod_mpm_event.so ←コメントアウト

お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。

とでたのでyum install –enablerepo=remi, remi-php74 php-mysqlnd php74-php-mysqlnd

apache停止 PHP再コンパイル apachectl -V でWorker モード起動確認しました。

[root@www conf.modules.d]# apachectl -V
[Sat Jun 27 17:27:57.558701 2020] [so:warn] [pid 3872:tid 140188049873088] AH01574: module php7_module is already loaded, skipping
Server version: Apache/2.4.43 (codeit) Server built: May 7 2020 12:24:30 Server's Module Magic Number: 20120211:92 Server loaded: APR 1.7.0, APR-UTIL 1.6.1 Compiled using: APR 1.7.0, APR-UTIL 1.6.1 Architecture: 64-bit Server MPM: worker threaded: yes (fixed thread count) forked: yes (variable process count)

新たに警告、module php7_module is already loaded, skipping がでましたが起動には問題ないのでこちらは追々、解決していくことにします。

AWSのCentOS7にPHP7.4をソースからインストール – OpenSSL1.1.1 TLS1.3 対応

AWSのCentOS7.8にPHP7.4をyumでインストールしたものの、OpenSSLのバージョンが1.0.2k-fips 26 Jan 2017と古いままだったのでOpenSSL-1.1.1g PHP7.4.7 をソースビルドしてCode-ITリポジトリからApache2.4をインストールした顛末をメモ。

CentOS7にOpenSSL1.1.1をインストール | Qiita

OpenSSLは上記記事を参考に/usr/local/openssl-1.1.1 にインストール済みです。ただパスが通っていないので以下の通りにシンボリックリンクを貼りました。追記)/usr/local/openssl-1.1.1 への環境変数も追加で登録しました。

# mv /usr/bin/openssl /usr/bin/openssl.bak
# ln -s /usr/local/openssl-1.1.1/bin/openssl /usr/bin/openssl

# export PATH=/usr/local/openssl-1.1.1/bin:$PATH

CentOS 6 の環境にPHP7をインストールしてApacheで動かすまで

少々古い記事ですがPHP7.4のコンパイルに必要そうなパッケージはyumで一気に揃えます。

# yum -y install httpd-devel gd-devel libxml2-devel mysql-devel t1lib-devel
# yum -y install bzip2-devel curl-devel gmp-devel aspell-devel recode-devel
# yum -y install libmcrypt-devel

PHP7.4.7は公式から/usr/local/src にwget でダウンロード、解凍します。

# cd /usr/local/src
# wget https://www.php.net/distributions/php-7.4.7.tar.gz
# tar zxvf php-7.4.7.tar.gz
# cd php-7.4.7 # ./configure --with-apxs2=/usr/bin/apxs --bindir=/usr/local/bin --with-openssl=/usr/local/openssl-1.1.1 --with-libxml --with-mysqli --with-zlib --with-curl --with-xsl --with-gettext --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gmp \ --enable-mysqlnd \ --enable-mbstring \ --enable-bcmath \ --enable-pcntl \ --enable-cgi \ --enable-cli \ --enable-exif \ --enable-ftp \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-sysvmsg \ --enable-shmop \ --enable-calendar \ --enable-opcache \ --enable-intl \ --disable-debug

途中、make testでopcacheインストールしてないよ!とかいろいろ怒られましたがyumでその都度インストール対応しました。

# yum --enablerepo=epel,remi-php74 install php-opcache

make & make install

# make
# make install

で表題の件。

CentOS7にyumでHTTP/2.0対応Apache/OpenSSLを導入してみる

CodeITリポジトリ導入。Apache2.4本体、秘密鍵のインストールして起動・・・

# cd /etc/yum.repos.d && wget https://repo.codeit.guru/codeit.el`rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release)`.repo
# yum install httpd

# cd /etc/pki/tls/certs/
# make localhost.crt
# make localhost.key # cd ../private/ # cp ../certs/localhost.key ./
# cp localhost.key localhost.key.orig ## 秘密鍵のパスフレーズを解除 # openssl rsa -in localhost.key.orig -out localhost.key

## Apache httpd HTTPSとHTTP/2通信用の設定
## ssl.confの # Virtual Host Context 行下に追記

# vi /etc/httpd/conf.d/ssl.conf

Protocols h2 http/1.1 (追記 # systemctl start httpd

起動しようとしたのですが失敗しました。

systemctl status httpd.service -l でエラーメッセージを取得すると、

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP

Google先生に訊いてみるとApache がWorker として起動していてPHPと不整合している旨了解しました。/etc/httpd/conf.modules.d/00-mpm.conf を編集して

#LoadModule mpm_event_module modules/mod_mpm_event.so ←チェック
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so ←チェックを外す

するとApache 起動しました。

PHPインストール時のMPMのエラーを手っ取り早く解消する

AWSのt2.microではPHPのソースビルドでも「aws virtual memory exhausted: メモリを確保できません」エラーが出てスワップを作らないとインストールできなかったほど限界で、マルチスレッドからシングルスレッドになりスピードダウンは否めないのでWorkerモードしてもどの程度負荷軽減できるか課題の残るところです。phpinfo.php で確認すると無事、OpenSSL1.1.1g TLS1.3 対応しました。

スワップ作成は以下のサイトが参考になりました。

[Rails] CapistranoでEC2へデプロイ:EC2仮想メモリ不足トラブルシュート

AWS CentOS7 にPHP最新版をインストールする

PHPのバージョン最新版をAWSのCentOS7にインストールしようとして試行錯誤した顛末。

お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。と表示された対応 | Qiita

そもそもremiリポジトリがなく最初にインストールするところから始めました。

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

鍵がない!(NOKEY)と怒られたので、wget でとりに行きました。

# wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# rpm -Uvh remi-release-7.rpm

ここでエラー: 依存性の欠如:
epel-release = 7 は remi-release-7.7-2.el7.remi.noarch に必要とされています

ん・・・epel が必要らしいことがbash のlocale をJPにして気付きました。

# yum -y install epel-release

こんなこともしばらく触れないうちに忘れてしまうものなんですね・・・で表題の件。PHPをモジュールごとまるっとインストールします。

PHP バージョン情報 | OpenStandia™ (オープンスタンディア) 最新版は7.4.7

# yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-mysql

# php -v
PHP 7.4.7 (cli) (built: Jun 9 2020 10:57:17) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

無事、Wordpress を初期設定できました。ありがとうございました。

AWS SCPオプションでつまづく

AWS にデータベース用のインスタンスをプライベートネットワーク上に作成、ローカルからSCPを使ってキーファイルを転送しようとしたところ、connection refused で弾かれました。コマンドのポート指定オプションを間違えていたようです。

$ scp -P 20022 -i /path/to/identityfile localfilename remoteuser@hostname:~/

大文字の-Pで転送できました。(ホッ

追記) 踏み台サーバーからログインするために.ssh/config のパーミッション設定は必須でした。

# chmod 700 ~/.ssh
# chmod 600 ~/.ssh/config

AWS セッションマネージャーをインストールしてみた

概要
いつの日か、あなたがSSHキーを吹っ飛ばしても落ち着いて対応できる道しるべ 〜SSMの手順を添えて〜

不測の事態に備えてAWS のCentOS7のインスタンスにセッションマネージャーをインストールする手順をメモ。

まずはAmazon Linux2 などデフォルトで搭載されているSSMエージェントをインストールしてみる。

Linux 用の EC2 インスタンスに手動で SSM エージェント をインストールする

# sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
# sudo systemctl status amazon-ssm-agent 起動確認 # sudo systemctl enable amazon-ssm-agent 自動起動

AWSコンソール→IAMからロールの作成

ユースケース→EC2→次のステップ:アクセス権限でポリシー一覧からAmazonEC2RoleforSSMを選択、タグを付けてロール名を登録、作成。

AWSコンソール→EC2→アクション→インスタンスの設定→IAMロールの割り当て/置換で先ほど作成したロールを適用して関連付けしたら完了。

AWSコンソール→System Manager→セッションマネージャーから[セッションの開始]で関連付けられたインスタンスを選択して[セッションを開始する]

GUIからサーバーに入ることができました。

SSHポート変更SELinuxでつまづく

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版 でCentOS7.8 をAWS に実際にインスタンスとして起動、設定をしたのでメモ。

タイムゾーン設定
AWS EC2 Amazon Linuxインスタンス起動後、最初にやることまとめ

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# vi /etc/sysconfig/clock
ZONE="Asia/Tokyo" UTC= true
# shutdown -r now

yum ファステストミラー設定、グループインストール、アップデート
CentOS7 で yum groupinstall が出来ないんですけど。。。

# vi /etc/yum/pluginconf.d/fastestmirror.conf

include_only=.jp

# yum -y install bash-completion
# yum -y groupinstall base "Development tools" --setopt=group_package_types=mandatory,default,optional
# yum -y update

SSHポート変更
(AWSコンソールのEC2→セキュリティグループ→インバウンドルールの編集からカスタムTCPポート20022を許可)

# vi /etc/ssh/sshd_config
Port 20022
# setenforce 0 # vi /etc/selinux/config
SELINUX=permissive # semanage port -a -t ssh_port_t -p tcp 20022 # systemctl restart sshd # systemctl enable sshd

ここでSELinuxのコンテキスト変更せずにインスタンス再起動するとsshd 起動エラーを起こして通信できなくなる罠。AWSで再起動後、SSHが繋がらなくなった場合の対処法。SELinuxが原因でした。

semanage port -a -t ssh_port_t -p tcp 20022

ふしあなさん、/etc/ssh/sshd_config に英文の注意書きがありましたね・・・これに気付くまでインスタンス削除、起動を10回繰り返しましたよorz

設定の途中で一時的にPermissive にしてもセキュリティ上は最終的にSELinux は有効にすることが望ましいと思います。Amazon LinuxでSELinuxを有効にする。

AWS ではセキュリティグループでポート管理を行うのでインスタンス内でfirewalld をアクティブにしないのがベストプラクティスのようですね。

AWSコンソールからVPC→アクション→DNS解決の編集を有効化

AWSコンソールからVPC→アクション→DNSホスト名の編集を有効化

AWSコンソールからRoute53→ホストゾーン作成

AWSコンソールからRoute53→EC2のElastic IP からAレコード転記

あらかじめGodaddyで取得した独自ドメインのネームサーバーにホストゾーンで生成されたアドレスを転記

GoDaddyからRoute53によるDNS管理に変える方法

nslookup ブラウザで名前解決できることを確認して作業終了しました。