下記は、access_dbやmailertableの説明が詳しく書かれている

 

■構成

・postfix1を動作させるホスト

※access_dbでsendmailにリレー許可されていてsendmailが受信したメールをAaliasesによって転送する転送先MTA

ホスト名:pc3_centos7_k1

DNS上のA:mail.postfix1.local

メモリ:2GB

CPU:2コア

OS:CentOS7.3

IPアドレス:192.168.101.31

 

・postfix2を動作させるホスト

※access_dbでsendmailにリレー許可されているMTA

ホスト名:pc3_centos7_k2

DNS上のA:mail.postfix2.local

メモリ:2GB

CPU:2コア

OS:CentOS7.3

IPアドレス:192.168.101.32

 

・postfix3を動作させるホスト

※access_dbでsendmailにリレー許可されていないMTA

ホスト名:pc3_centos7_k3

DNS上のA:mail.postfix3.local

メモリ:2GB

CPU:2コア

OS:CentOS7.3

IPアドレス:192.168.101.33

 

・sendmail、bindを動作させるホスト

ホスト名:pc3_centos7_k4

DNS上のA:mail.sendmail1.local

メモリ:1GB

CPU:1コア

OS:CentOS7.3

IPアドレス:192.168.101.34

 

・postfix0を動作させるホスト

※インターネット上のMTAを想定

ホスト名:optiplex3020

DNS上のA:mail.postfix0.local

メモリ:8GB

CPU:4コア

OS:CentOS7.8

IPアドレス:192.168.100.2

 

■構築

・bind構築

主にsendmailが引くDNSサーバをsendmailと同じホスト(pc3_centos7_k4)に構築。

[root@pc3_centos7_k4 named]# rpm -q bind
bind-9.11.4-26.P2.el7_9.3.x86_64

[root@pc3_centos7_k4 etc]# pwd
/etc
[root@pc3_centos7_k4 etc]# diff named.conf.org named.conf
13c13
<       listen-on port 53 { 127.0.0.1; };
---
>       listen-on port 53 { 192.168.101.34; };
21c21
<       allow-query     { localhost; };
---
>       allow-query     { 192.168.0.0/16; };
29c29
<          cause your server to become part of large scale DNS amplification
---
>          cause your server to b.locale part of large scale DNS amplification
57a58,83
>
> zone "postfix0.local" IN {
>   type master;
>   file "postfix0.zone";
> };
>
> zone "postfix1.local" IN {
>   type master;
>   file "postfix1.zone";
> };
>
> zone "postfix2.local" IN {
>   type master;
>   file "postfix2.zone";
> };
>
> zone "postfix3.local" IN {
>   type master;
>   file "postfix3.zone";
> };
>
> zone "sendmail1.local" IN {
>   type master;
>   file "sendmail1.zone";
> };

[root@pc3_centos7_k4 named]# pwd
/var/named
[root@pc3_centos7_k4 named]# ll
合計 36
drwxrwx---. 2 named named   23  1月 12 05:24 data
drwxrwx---. 2 named named   60  1月 12 07:30 dynamic
-rw-r-----. 1 root  named 2253  4月  5  2018 named.ca
-rw-r-----. 1 root  named  152 12月 15  2009 named.empty
-rw-r-----. 1 root  named  152  6月 21  2007 named.localhost
-rw-r-----. 1 root  named  168 12月 15  2009 named.loopback
-rw-r-----. 1 root  named  261  1月 12 07:28 postfix0.zone
-rw-r-----. 1 root  named  263  1月 12 07:28 postfix1.zone
-rw-r-----. 1 root  named  261  1月 12 07:29 postfix2.zone
-rw-r-----. 1 root  named  261  1月 12 07:29 postfix3.zone
-rw-r-----. 1 root  named  261  1月 12 07:27 sendmail1.zone

drwxrwx---. 2 named named    6 12月 16 01:32 slaves

[root@pc3_centos7_k4 named]# cat sendmail1.zone
$TTL 1D
@ IN SOA  ns.sendmail1.local. root.sendmail1.local.(
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.sendmail1.local.
ns      A    192.168.101.34
mail    A       192.168.101.34
@       MX  10  mail.sendmail1.local.

[root@pc3_centos7_k4 named]# cat postfix0.zone
$TTL 1D
@ IN SOA  ns.sendmail1.local. root.sendmail1.local.(
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.sendmail1.local.
ns      A       192.168.101.34
mail    A       192.168.100.2
@       MX  10  mail.postfix0.local.

[root@pc3_centos7_k4 named]# cat postfix1.zone
$TTL 1D
@ IN SOA  ns.sendmail1.local. root.sendmail1.local.(
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.sendmail1.local.
ns      A       192.168.101.34
mail    A       192.168.101.31
@       MX  10   mail.postfix1.local.

[root@pc3_centos7_k4 named]# cat postfix2.zone
$TTL 1D
@ IN SOA  ns.sendmail1.local. root.sendmail1.local.(
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.sendmail1.local.
ns      A       192.168.101.34
mail    A       192.168.101.2
@       MX  10  mail.postfix2.local.

[root@pc3_centos7_k4 named]# cat postfix3.zone
$TTL 1D
@ IN SOA  ns.sendmail1.local. root.sendmail1.local.(
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.sendmail1.local.
ns      A       192.168.101.34
mail    A       192.168.101.3
@       MX  10  mail.postfix3.local.

[root@pc3_centos7_k4 named]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.101.34

[root@pc3_centos7_k4 named]# cat /etc/NetworkManager/NetworkManager.conf
---(略)---
[main]
dns=none

---(略)---

・postfix0構築(インターネット上のMTA)

[root@optiplex3020 postfix]# rpm -q postfix
postfix-2.10.1-9.el7.x86_64

[root@optiplex3020 postfix]# pwd
/etc/postfix
[root@optiplex3020 postfix]# diff main.cf.org main.cf
75c75
< #myhostname = host.domain.tld
---
> myhostname = mail.postfix0.local
83a84
> mydomain = postfix0.local
98c99
< #myorigin = $myhostname
---
> myorigin = $myhostname
113c114
< #inet_interfaces = all
---
> inet_interfaces = all
116c117
< inet_interfaces = localhost
---
> #inet_interfaces = localhost
119c120,121
< inet_protocols = all
---
> #inet_protocols = all
> inet_protocols = ipv4
164,165c166,167
< mydestination = $myhostname, localhost.$mydomain, localhost
< #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
---
> #mydestination = $myhostname, localhost.$mydomain, localhost
> mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
250c252
< #mynetworks_style = subnet
---
> mynetworks_style = subnet
264c266
< #mynetworks = 168.100.189.0/28, 127.0.0.0/8
---
> mynetworks = 192.168.100.0/24, 127.0.0.0/8
419c421
< #home_mailbox = Maildir/
---
> home_mailbox = Maildir/

[root@optiplex3020 postfix]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.101.34

[root@optiplex3020 postfix]#cat /etc/NetworkManager/NetworkManager.conf
---(略)---
[main]
dns=none

---(略)---

・postfix1構築(sendmeilの転送先)

※リゾルバはpostfix0と同じ

※main.cfはpostfix0とだいたい同じ

・postfix2構築(sendmeilでリレー許可されてるMTA)

※リゾルバはpostfix0と同じ

※main.cfはpostfix0とだいたい同じ

・postfix3構築(sendmeilでリレー許可されていないMTA)

※リゾルバはpostfix0と同じ

※main.cfはpostfix0とだいたい同じ

・sendmail構築

[root@pc3_centos7_k4 mail]# rpm -q sendmail{,-cf}
sendmail-8.14.7-6.el7.x86_64
sendmail-cf-8.14.7-6.el7.noarch

[root@pc3_centos7_k4 mail]# pwd
/etc/mail
[root@pc3_centos7_k4 mail]# ll
合計 292
-rw-r--r--. 1 root root    92 11月 28  2019 Makefile
-rw-r--r--. 1 root root   531  1月 12 09:20 access
-rw-r-----. 1 root root 12288  1月 12 09:20 access.db
-rw-r-----. 1 root root 12288  1月 12 07:47 access.db.org
-rw-r--r--. 1 root root   469 11月 28  2019 access.org
-rw-r--r--. 1 root root     0  1月 12 07:48 aliasesdb-stamp
-rw-r--r--. 1 root root   233 11月 28  2019 domaintable
-rw-r-----. 1 root root 12288  1月 12 07:47 domaintable.db
-rw-r--r--. 1 root root  5584  4月  1  2020 helpfile
-rw-r--r--. 1 root root    80  1月 12 09:22 local-host-names
-rw-r--r--. 1 root root    64 11月 28  2019 local-host-names.org
-rw-r--r--. 1 root root   997 11月 28  2019 mailertable
-rw-r-----. 1 root root 12288  1月 12 07:47 mailertable.db
-rw-r-----. 1 root root 12288  1月 12 07:47 mailertable.db.org
-rw-r--r--. 1 root root   997 11月 28  2019 mailertable.org
-rwxr-xr-x. 1 root root  2700 11月 28  2019 make
-rw-r--r--. 1 root root 58664  1月 12 09:17 sendmail.cf
-rw-r--r--. 1 root root 58498  4月  1  2020 sendmail.cf.org
-rw-r--r--. 1 root root  7370  1月 12 09:17 sendmail.mc
-rw-r--r--. 1 root root  7306 11月 28  2019 sendmail.mc.org
-rw-r--r--. 1 root root 41680  4月  1  2020 submit.cf
-rw-r--r--. 1 root root  1041  4月  1  2020 submit.mc
-rw-r--r--. 1 root root   127 11月 28  2019 trusted-users
-rw-r--r--. 1 root root  1847 11月 28  2019 virtusertable
-rw-r-----. 1 root root 12288  1月 12 07:47 virtusertable.db

[root@pc3_centos7_k4 mail]# diff sendmail.mc.org sendmail.mc
12a13,15
> Dwmail
> Dmsendmail1.local
> define(`confDOMAIN_NAME',`$w.$m')dnl
118c121
< DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
---
> dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

[root@pc3_centos7_k4 mail]# m4 sendmail.mc > sendmail.cf

[root@pc3_centos7_k4 mail]# diff access.org access
12a13,14
> Connect:192.168.101.31                        RELAY
> Connect:192.168.101.32                        RELAY

[root@pc3_centos7_k4 mail]# makemap.sendmail hash access.db < access

[root@pc3_centos7_k4 mail]# ll /etc/aliases{,.org}
-rw-r--r--. 1 root root 1518  6月  7  2013 /etc/aliases
-rw-r--r--. 1 root root 1518  6月  7  2013 /etc/aliases.org

・procmail構築

※sendmailのMDAはprocmail

※後回し

 

■検証

・受信確認

①自ドメイン宛てかつ存在するアカウント宛のメールを受信してメールボックスに保存すること

 ※postfix0から自ドメイン宛かつ存在するアカウント宛のメールを受信してメールボック

  スに保存すること → OK 

 ※メールボックス形式かメールディレクトリ形式か確認する

   → デフォルトでは /var/spool/mail/rootにメールボックス形式で受信された

②自ドメイン宛て以外のメールは受信しないこと 

③自ドメイン宛てかつ存在しないアカウント宛のメールを受信せず500番台エラーでリターンメールを返信すること → 送信側MTAがMUAにbounceメールを送信した

 ※自ログと相手ログできちんと500番台エラーを確認 → OK

 --------------------telnetによるメール送信テスト---------------------------

 ※ postfix1からpostfix0にsendmail1でリレーしてメールを送信する場合

 ※ postfix1のホストのターミナルからtelnetを起動して下記のように入力

  $ telnet mail.sendmail1.local 25

  HELO mail.postfix1.local

  MAIL FROM: dagyah@postfix1.local

  RCPT TO: root@postfix0.local

  DATA

  From: dagyah@postfix1.local
  Subjet: うんこしたい
 うんこしたいお
 .

 QUIT

   -----------------------------------------------------------------------

・送信確認

①自ホストをaccess_dbに記載しないと自ホスト内からメールを送信しないこと

 ※mailxコマンドで試す 

[root@pc3_centos7_k4 mail]# diff access_20210113 access
10,12c10,12
< Connect:localhost.localdomain           RELAY
< Connect:localhost                           RELAY
< Connect:127.0.0.1                            RELAY
---
> #Connect:localhost.localdomain          RELAY
> #Connect:localhost                          RELAY
> #Connect:127.0.0.1                           RELAY

[root@pc3_centos7_k4 mail]# makemap.sendmail hash access.db < access ;echo $?
0 

→上記のようにlocalhost等を注釈化してもメールを送信できた

 

②自ホストをaccess_dbに記載したら自ホスト内からメールを送信すること

 ※telnetで試す

 ※mailxコマンドで試す → OK

 ※送信メールがsentメールボックスに保存されること → OK

 

・リレー確認

※自ログと相手ログできちんと400番台500番台エラーを確認

※リターンメールの有無←普通どうするんだっけ

①許可したMTAからのメールをリレーすることを確認

 ※postfix1からpostfix0にsendmail1でリレーしてメールを配送できることを確認

 --------------------telnetによるメール送信テスト---------------------------

 ※ postfix1のホストのターミナルからtelnetを起動して下記のように入力

  $ telnet mail.sendmail1.local 25

  HELO mail.postfix1.local

  MAIL FROM: dagyah@postfix1.local

  RCPT TO: root@postfix0.local

  DATA

  From: dagyah@postfix1.local
  Subjet: うんこしたい
 うんこしたいお
 .

 QUIT

   -----------------------------------------------------------------------

→OK

[root@optiplex3020 new]# cat 1610473572.Vfd00I90ec6M281336.optiplex3020
Return-Path: <dagyah@postfix1.local>
X-Original-To: root@postfix0.local
Delivered-To: root@postfix0.local
Received: from mail. (unknown [192.168.101.34])
        by mail.postfix0.local (Postfix) with ESMTP id 327B6408E6F9
        for <root@postfix0.local>; Wed, 13 Jan 2021 02:46:12 +0900 (JST)
Received: from mail.postfix1.local ([192.168.101.31])
        by mail. (8.14.7/8.14.7) with SMTP id 10CHjHNA014217
        for root@postfix0.local; Wed, 13 Jan 2021 02:45:39 +0900
Date: Wed, 13 Jan 2021 02:45:17 +0900
Message-Id: <202101121745.10CHjHNA014217@mail.>
From: dagyah@postfix1.local
Subjet: うんこしたい

うんこしたいお

②許可してないMTAからのメールをリレーしないことを確認

[検証1] postfix0をaccess_dbで禁止しpostfix0からpostfix1にsendmail1でリレーしてメールを

             配送できないことを確認

 --------------------telnetによるメール送信テスト---------------------------

 ※ postfix0のホストのターミナルからtelnetを起動して下記のように入力

  $ telnet mail.sendmail1.local 25

  HELO mail.postfix0.local

  MAIL FROM: dagyah@postfix0.local

  RCPT TO: root@postfix1.local

  DATA

  From: dagyah@postfix0.local
  Subjet: しょんべんしたい
 おしっこもれちゃうお><
 .

 QUIT

   -----------------------------------------------------------------------

→OK

[root@optiplex3020 new]# telnet mail.sendmail1.local 25
Trying 192.168.101.34...
Connected to mail.sendmail1.local.
Escape character is '^]'.
220 mail. ESMTP Sendmail 8.14.7/8.14.7; Wed, 13 Jan 2021 02:57:47 +0900

HELO mail.postfix0.local
250 mail. Hello gateway [192.168.101.2], pleased to meet you
MAIL FROM: dagyah@postfix0.local
250 2.1.0 dagyah@postfix0.local... Sender ok
RCPT TO: root@postfix1.local
550 5.7.1 root@postfix1.local... Relaying denied
RCPT TO: root@postfix1.local
550 5.7.1 root@postfix1.local... Relaying denied
DATA
503 5.0.0 Need RCPT (recipient)
QUIT
221 2.0.0 mail. closing connection
Connection closed by foreign host.

 

・sendmail1側のログ

[root@pc3_centos7_k4 mail]# tail /var/log/maillog

---(略)---

Jan 13 02:58:11 pc3_centos7_k4 sendmail[14222]: 10CHvlDX014222: ruleset=check_rcpt, arg1=root@postfix1.local, relay=gateway [192.168.101.2], reject=550 5.7.1 root@postfix1.local... Relaying denied
Jan 13 02:58:45 pc3_centos7_k4 sendmail[14222]: 10CHvlDX014222: ruleset=check_rcpt, arg1=root@postfix1.local, relay=gateway [192.168.101.2], reject=550 5.7.1 root@postfix1.local... Relaying denied
Jan 13 02:59:21 pc3_centos7_k4 sendmail[14222]: 10CHvlDX014222: from=dagyah@postfix0.local, size=0, class=0, nrcpts=0, proto=SMTP, daemon=MTA, relay=gateway [192.168.101.2]

 

[検証2] postfix0をaccess_dbで禁止すると、mailertableでpostfix1.localドメイン宛のメール

     の経路をmail.postfix1.localに指定しても、postfix0からpostfix1にsendmail1でリレ

     ーしてメールを配送できないことを確認


[root@pc3_centos7_k4 mail]# diff mailertable mailertable.org
30,32c30
< # where D.S.N is an RFC 1893 compliant error code.
< postfix1.local          esmtp:[192.168.101.31]
---
> # where D.S.N is an RFC 1893 compliant error code.

[root@pc3_centos7_k4 mail]# makemap -v hash /etc/mail/mailertable.db < /etc/mail/mailertable;echo $?
key=`postfix1.local', val=`esmtp:[192.168.101.31] '

0

→mailertable.dbのタイムスタンプが更新されたことを確認

[root@optiplex3020 new]# telnet mail.sendmail1.local 25
Trying 192.168.101.34...
Connected to mail.sendmail1.local.
Escape character is '^]'.
220 mail.sendmail1.local ESMTP Sendmail 8.14.7/8.14.7; Wed, 13 Jan 2021 03:57:47 +0900

HELO mail.postfix0.local
250 mail.sendmail1.local Hello gateway [192.168.101.2], pleased to meet you
MAIL FROM: dagyah@postfix0.local
250 2.1.0 dagyah@postfix0.local... Sender ok
RCPT TO: root@postfix1.local
550 5.7.1 root@postfix1.local... Relaying denied
DATA
503 5.0.0 Need RCPT (recipient)
QUIT
221 2.0.0 mail.sendmail1.local closing connection
Connection closed by foreign host.

→リレーを拒否した

・mailertable動作確認

①mailertableのレコードに書かれたMX情報はDNSのMX情報が無くてもMX転送されるか確認

 ※postfix1からpostfix0宛(インターネット上のMTA)のメールのリレーを試す

 ※sendmail1のリゾルバを無効にしてmailertableにpostfix1への配送情報があれば

  sendmail1からpostfix1にメールを送信できるか?

   → sendmailのクライアントキューに入って滞留してしまった 

   → 何か設定が間違ってるかもしれない 

③①のレコードがあってもaccess_dbでリレーを許可してない場合はリレーされないことを確認

 →リレーされなかった

 

・aliases動作確認

①aliasesにhoge rootと書かれてたらhoge宛のメールがrootのメールボックスに保存されることを確認

 →mailer-daemon宛のbouncemailがrootのメールボックスに保存された

②aliasesにroot root@fuga.comと書かれていたらroot宛のメールがroot@fuga.comに転送されることを確認

 ※この場合ローカルのrootのメイルボックスには保存されないことを確認

 ※fuga.comはDNSのMXレコードで転送先解決

 ※fuga.comはmailtableで転送先解決

[root@pc3_centos7_k4 mail]# diff /etc/aliases{.org,}
96a97,98
>
> root:         root@postfix1.local

[root@pc3_centos7_k4 mail]# newaliases
/etc/aliases: 77 aliases, longest 19 bytes, 794 bytes total
[root@pc3_centos7_k4 mail]# echo $?
0

→/etc/aliases.dbのタイムスタンプが更新された

・postfix2からroot@sendmail1.localにメールを送信

[root@pc3_centos7_k2 ~]# mail root@sendmail1.local
Subject: ぷにぷに
postfix2からroot@sendmail1.localへメール送信
.
EOT

→sendmail1のrootのメールボックスには何も書き込まれなかった。

 postfix1のrootのメールボックス(転送先)にメールが書き込まれた

 

・differキューの動作確認

 ※400番台エラー時に一定期間differキューに格納されること

  → mailqコマンドで確認できる

 ※differキュー内のメールは一定間隔ごとに再送されること

 ※differキュー内のメールは一定期間後に破棄されること

 ※differキュー内に滞留しているメールは適切なコマンドで状態を確認できること

・リターンメールの動作確認

 ※500番台エラー時にリターンメールを送信すること

 →送信された

 ※リターンメールが届かなかった場合に設定どおりに振る舞うこと

・複数のインタフェースから接続を許可する設定

[root@pc3_centos7_k4 mail]# cat -n  /etc/mail/sendmail.mc

----(略)----
    121 DAEMON_OPTIONS(`Port=smtp,Addr=192.168.101.34, Name=MTA')dnl
    122 DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

----(略)----

[root@pc3_centos7_k4 mail]# netstat -napt | grep 25
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State        PID/Program name

tcp        0        0      127.0.0.1:25                0.0.0.0:*                    LISTEN      20237/sendmail: acc
tcp        0        0      192.168.101.34:25        0.0.0.0:*                    LISTEN       20237/sendmail: acc

 →192.168.101.34と127.0.0.1に接続してメールメール受信できた

 
 
 

オイラにとって必要なものを手に入れるには下記の場合分けで行う。

①すでに世の中にあってお金を出せば手に入るものなら、自分で作るコストより買う方が安いなら買う

②まだ世の中にないもので時間をかければ自分で作れるものなら、作るコストが欲しさに見合うなら作る。作るコストが欲しさに見合わないなら手に入れるのをあきらめてそれ無しでやりくりする方法を考える。

 

②の「まだ世の中にないけど欲しいもの」としては下記が考えられる。

a.これからの最良の人生計画

b.ある種の情報

c.ある種の物やサービス

 

a.は時間をかけてでも欲しい情報だが、時間をかけすぎても人生が終わっちゃうw

みんな自分なりの時間制限を設けて自分にとって現実的な時間配分で今から残りの人生計画を建てたり修正したりしながら生きている(と思う)

b.ある種の情報とはいろいろあるが、a.もその一種である。自分や他者が自分に掲げた課題を消化してこなすのに必要な情報も含まれる。時間をかけて独学でコツコツ作り上げるのも「醍醐味」があっていとおかしかもしれないが、目的が明確でお金を出せば手に入りうる類の情報ならむしろ他者から買った方がいい場合もある。

c.は自分の職場で上司や顧客からオイラに依頼されている業務も該当するが、これらは自分でやれるならやるしやれないならあきらめて自分ではやれないと宣言するしかない。

まだ世の中には無い物やサービスを自分が主体的に取り組んで「作って」上司や顧客やチームに還元することこそがまさに「仕事」なわけだが、他人からそれを安く買ってマージンを乗せて顧客に転売してもいいし、自分ひとりでコツコツ作り上げて納品してもいい。

 

だからそれがなに?

 

 

 

 

 

 

 

 

 

インフラは(間違いだらけの)マニュアル読んで手順通りに作業して行けば中身はブラックボックスのままでも勝手にセットアップされて勝手にサクサク動くプラモデルではない。

 

アプリケーション開発こそがITエンジニアリングの主役だとオイラも思う。

まだこの世に存在しないクリエイティブなソフトウェアを創造して具体化する行為はITエンジニアリングの花形であるとオイラも思う。

アプリケーション開発者にとっては「脇役」のインフラエンジニアリングはプラモデルほど簡単ではない。

どこがどう難しいのかをオイラなりに下記に箇条書きするンゴ

 

・冒頭で書いたようにマニュアルが結構間違ってる。

・わりとバグがあるが、インフラで使われるミドルウェアやOSやハイパバイザなどのソフトウェアは多くの場合大規模で複雑でどっかのだれかが書いたもので中身が分からないので勢いサポートに丸投げするか切り分けして「工夫して」分析して解決しないといけないケースが結構ある。

・OSSの場合マニュアルがなく、配布物内のreadmeやconfigやmanなどを漁ることになり、一貫性が無いので土地勘が必要だったりする。(インフラエンジニアは基本的にはソースコードまでは読まない人が多い)

・マニュアル以外に多様な前提知識が必要だったりする。例えば、python2とpython3は前方後方ともに互換性がないとか、nfs3とnfs4は全く別のプロトコルだけどnfs4は後方互換が実装される場合が多いとか、その他プロトコル、OS、ハイパバイザ、・・・、などの前提知識をもっててはじめて、マニュアルの「インストール要件」を把握できる。

・パフォーマンスがゆるゆるのスタートアップ環境の試作はyumやaptでインストールするだけでデフォルト設定で勝手に動き出す(場合が多い)。その際の所要時間は1分とかだったりする。しかし、下記の場合は所要時間が下調べや事前検証を含めて数日から数週間になる。

 - 大容量、高負荷

 - セキュリティ要件が厳しくミッションクリティカル

 - ハードウェアやOSやハイパバイザやネットワークと蜜結合になって機能実現している。

  例えば、DBサーバ、HAクラスタソフト、バックアップソフトなど

 - マルチベンダー

 - 他システムやバックボーンとのインタフェースがあるケース

  例えば、別システムとのデータ入出力、パブリッククラウドやプライベートクラウドの上に

  システムを構築しているなど。

・ひとつのシステム(OS)上にたくさんのミドルウェアをインストールしすぎると、ハードウェア

 リソース以外にソフトウェアリソース(ソケットのポート番号、カーネルパラメータ、OS固有の

 各種id(ユーザ名、グループ名などの衝突)の取り合いが起こる場合がある

・よく見落とされる基本的なコツがある例えば、

 - インストールして実行した場合衝突したり取り合いになるリソース(HWとSW)と取り合い

  にならないリソースがある

 - サービス起動には順序性がある

 - サービスには実行ユーザと実行グループがある

 - サービスは複数のプロセスやスレッドがプロセス間通信しあって動作している

 - サービスがread/writeするファイルは普通のファイル入出力の他にメモリマッピングして

  いる場合がある。

 - カーネルパラメータやulimitなどOSやユーザで固有の設定が必要になるものがある

 - プロセスどうしで共有されるメモリやプロセスだけで占有されるメモリがある

 - メモリ確保がプロセスによって起動時に一定サイズを予約する場合と必要になったときに

  都度OSからもらう場合がある

 - メモリ確保がプロセスやサービス(共有メモリ)内の場合とページキャッシュ内の場合が

  ある

 - ソフトウェアによってディスクIOに関してrandomIOが多いものとsequentialIOが多いもの

  がある

 - cpu時間の使い方がソフトウェアによって違いがある。例えば、短時間だけ1コアを100%

  に張り付かせてすぐ解放するものや、長時間cpu時間を消費するものや、サービスが

  複数の子プロセスや子スレッドを負荷に応じて生成して高負荷時に複数コアが100%に

  張り付かされる特性のものがある