skucky.com
はじめにお断りしておきますが、自宅サーバー構築メモと題を掲げているものの、正確にはサーバー復旧メモ(自分用備忘録)と言った方が良く、人様がご覧になって参考にできるような物ではないということを申し上げておきます。 しかも、サーバー構築が終わってから記憶をたどりながら執筆しているため、その参考にならなさ加減に拍車をかけいることでしょう。
当ページは、長年無音サーバーを運用してきましたが、どうも動作が不安定(Segmentaion faultの多発とか)で毎日電源ブッチで強制再起動するような運用が日々繰り返され、「サーバーの意味ないじゃん!」と言うこともあり、また、時を同じくしてカミさんの嫁入り道具の一つであるデスクトップ一体型VAIOちゃんのHDDがお釈迦になってただの箱と化し、リソースの有効活用も兼ね(VAIOちゃんのHDDだけ交換したら普通に使えました)、VAIOちゃんに自宅サーバーとして第二の人生を歩んでもらおうとサーバーを再構築するに至ったというのが事の経緯です。
どうせ再構築するならDebianやめて(Segmentaion fault多発の原因がDebianの問題なのか、長年使い古してきたハードとの相性の問題なのかよくわからないと言う事もあり)、最近流行りの?Ubuntuにしてみようかと思い立ち、Ubuntuサーバーをインストールし、サーバーを構築するまでの備忘録としてまとめたのがこのページです。結果的には非常に安定して動作しています!財布の紐を握っているカミさんを説得させ高いお金を出してサーバーを新調するのは至難の業であり、説得させるまで長い年月を要し、そのうち自分の年金で買ってくれと言われかねない事態も想定されたため、リソースを有効活用して再構築して正解でした(しかも、交換したHDDは普段クライアントとして使用している自作PCのバックアップ用ディスクを流用。つまり実質0円でサーバーを更改しました)。
UbuntuのHPから「Ubuntuのダウンロード」のリンクをたどり、用途別に必要なISOイメージをダウンロードします。自分はサーバー用途で利用したいのでUbuntu Serverをチョイスしました。
ISOイメージをダウンロード後、USBメモリでインストーラを作成します。昔はインストーラといえばCDでしたが、最近はUSBメモリに書き込みできるらしいです。この辺の情報もWEB上でいくらでも探すことができるので、詳細はそちらを参照いただくとして、自分の場合はWin32 Disk Imagerと言うソフトでUSBメモリを作成しました。
インストーラの指示に従ってインストールすればOK。特につまづいた点は無し(記憶にないと言った方が正しいかも・・)。サーバー用途というだけあってKDEやらGNOMEやら余計なデスクトップ環境の莫大な量のソフトが最初からインストールされないのは素晴らしい。個人的に思うのはサーバーを保守するうえで余計なソフトがインストールされているとそれだけで日々のアップデートが大変だし、セキュリティホールも増えるってもんです。この辺の心意気なかなか良いではないか、やるな!Ubuntu。ただし、ダウンロードしたUbuntu Serverは日本語対応していないので、こちらのサイトを参考に日本語化パッチを当てます。
インストール時はNICが自動認識され、ネットワーク関連の設定ができないまま勝手にインストールが進む関係で、そのままインストールが終了し、システムを立ち上げるとデフォルトでDHCPが有効になっている。サーバーとして利用するならば静的アドレスとしてIPアドレスを割り当てる必要があるということで、設定するファイルは/etc/netplan/00-installer-config.yamlである。参考にさせていただいたサイトはこちらです。
留意したところとしては、ネームサーバーとしても自宅サーバーを利用したかったので、そのアドレスにNICに割り当てたIPアドレスを指定した点くらいでしょうか。
network: |
ethernets: |
enp4s0: |
dhcp4: no |
addresses: |
- 192.168.1.201/24 |
gateway4: 192.168.1.1 |
nameservers: |
addresses: |
- 192.168.1.201 |
dhcp6: true |
version: 2 |
設定が終わったら、以下のコマンドで設定を反映しておく。因みに、コマンドの補完はbashなら当たり前だが、パラメータ(ここで言う"apply")まで補完できるのはありがたい。
quark:~# netplan apply |
設定ファイルは/etc/hosts。以下の通り設定する。
127.0.0.1 | localhost |
192.168.1.201 | quark |
# | |
# 〜中略〜 | |
# |
普段使用しているクライアントからサーバの様子を見たり、ファイルを転送する時に基本となるサービスがtelnetだったりftpだったりと言う事でこれらのサービスをインストールする(デフォルトではデーモンが入っていない)。
インストールは以下のコマンドを実行すればOK。
quark:~# apt -y install vsftpd |
quark:~# apt -y install telnetd xinetd |
quark:~# apt -y install inetutils-inetd |
インストール後の設定ファイルは、/etc/vsftpd.conf、/etc/vsftpd.chroot_listと/etc/inetd.confである。参考にしたサイトはこちらとこちらです。
/etc/vsftpd.chroot_listの方は、hogehogeとしていますが、普段FTPを利用したいユーザー名を指定します。
# |
# 〜中略〜 |
# |
write_enable=YES |
ascii_upload_enable=YES |
ascii_download_enable=YES |
chroot_local_user=YES |
chroot_list_enable=YES |
chroot_list_file=/etc/vsftpd.chroot_list |
ls_recurse_enable=YES |
# |
# 〜中略〜 |
# |
hogehoge #実際にFTPログインするユーザーを指定する |
telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd |
これで設定は終わりで、あとはサービスをそれぞれ再起動すればFTPとTELNETは使えるようになりますが、不正アクセスの痕跡が後を絶たないので、多少なりともセキュリティ対策を施しておきます。メジャーなところでTCP Wrapperの設定をしておきます。
ALL:ALL #王道の設定(すべてのアクセスを拒否) |
in.telnetd: 192.168.1.12 |
in.telnetd: 192.168.1.13 |
in.telnetd: 192.168.1. |
in.ftpd: 192.168.1. |
ALL:127.0.0.1 |
基本的にFTPもTELNETもLAN内から使用するのでローカルのIPからのみアクセスを許可する設定にしておきます。ですが、出先からもちょっとTELNETしてサーバーの様子を確認したいというケースもあるかと思います。その場合は、ルーターのVPN機能をあらかじめ有効にしておき、スマホでVPN接続すれば適当なエミュレータアプリでアクセスできるので便利です。自分はTerminusというアプリを利用しています。
インターネットへの接続も含めネットワーク周りの環境ができたら、まずはネームサーバーを最優先に立ち上げる。さもないと、メールサーバもWEBサーバも自前のサーバで立ち上げられない。
BINDの設定ファイルは/etc/bind/named.conf。同ファイルにはデフォルトである程度の記述がされているが、さすがにそのままでは使えない。具体的な修正箇所は下記に示す/etc/bind/named.confの内容に「以下を追加」というコメントがある次行から空白行までの設定を追記した。特にコメントの無い設定はデフォルトのままである。
設定内容について簡単に言えば、LAN内と外部(インターネット)用とに分けてskucky.comドメインにあるホスト名の名前解決を行うために元となる設定を行ったといったところ。実際のIPとホスト名を関連付けするには、後述のゾーンファイルで設定する。
// |
// named.confの全内容(コメント箇所は除く) |
// |
include "/etc/bind/named.conf.options"; |
include "/etc/bind/named.conf.local"; |
//以下を追加 |
acl internal { |
127.0.0.1; |
192.168.1.0/24; |
}; |
view "inside" { |
match-clients { internal; }; |
recursion yes; |
zone "." { |
type hint; |
file "/etc/bind/db.root"; |
}; |
zone "localhost" { |
type master; |
file "/etc/bind/db.local"; |
}; |
zone "127.in-addr.arpa" { |
type master; |
file "/etc/bind/db.127"; |
}; |
zone "0.in-addr.arpa" { |
type master; |
file "/etc/bind/db.0"; |
}; |
zone "255.in-addr.arpa" { |
type master; |
file "/etc/bind/db.255"; |
}; |
zone "1.168.192.in-addr.arpa" { |
type master; |
file "/etc/bind/db.lan"; |
}; |
zone "skucky.com" { |
type master; |
file "/etc/bind/db.192"; |
}; |
}; |
view "outside" { |
match-clients { any; }; |
allow-query { any; }; |
recursion no; |
zone "skucky.com" { |
type master; |
allow-transfer { internal; 69.67.108.10; }; |
file "/etc/bind/db.skucky.com"; |
notify yes; |
}; |
}; |
なお、上記ファイルからincludeされている/etc/bind/named.conf.optionsとか言うファイルも以下のように設定しておく(わざわざファイルを分ける程の事でもないけれど)。
options { |
directory "/var/cache/bind"; |
allow-query { internal; }; |
}; |
次に、ゾーンファイルを作成する。ここで作成したゾーンファイルはLAN内で名前解決(正引き・逆引き両方)に使うファイルと外向け用(正引き用のみ)に使うファイルの3種類(named.confで設定しているその他のゾーンファイルはデフォルトのままで問題無し)。それぞれの設定内容は以下の通り。
・/etc/bind/db.lan(LAN内逆引き用ゾーンファイル)
$TTL 86400 | |||
@ | IN | SOA | ns1.skucky.com. root.skucky.com. ( |
2021053001 | ; Serial | ||
604800 | ; Refresh | ||
86400 | ; Retry | ||
2419200 | ; Expire | ||
604800 ) | ; Negative Cache TTL | ||
IN | NS | ns1.skucky.com. | |
IN | MX 10 | mail.skucky.com. | |
201 | IN | PTR | quark.skucky.com. |
12 | IN | PTR | lepton.skucky.com. |
・/etc/bind/db.192(LAN内正引き用ゾーンファイル)
$TTL 86400 | |||
@ | IN | SOA | ns1.skucky.com. root.skucky.com. ( |
2021053001 | ; Serial | ||
604800 | ; Refresh | ||
86400 | ; Retry | ||
2419200 | ; Expire | ||
86400 ) | ; Negative Cache TTL | ||
IN | A | 192.168.1.201 | |
IN | NS | ns1.skucky.com. | |
IN | MX 10 | mail.skucky.com. | |
ns1 | IN | A | 192.168.1.201 |
www | IN | CNAME | ns1 |
quark | IN | CNAME | ns1 |
IN | A | 192.168.1.201 | |
lepton | IN | A | 192.168.1.12 |
pop | IN | CNAME | |
smtp | IN | CNAME |
・/etc/bind/db.skucky.com(外向け正引き用ゾーンファイル)
$TTL 86400 | |||
@ | IN | SOA | ns1.skucky.com. root.skucky.com. ( |
2021053001 | ; Serial | ||
604800 | ; Refresh | ||
86400 | ; Retry | ||
2419200 | ; Expire | ||
86400 ) | ; Negative Cache TTL | ||
IN | A | 219.117.212.112 | |
IN | NS | ns1.skucky.com. | |
IN | NS | ns2.granitecanyon.com. | |
IN | MX 10 | mail.skucky.com. | |
ns1 | IN | A | 219.117.212.112 |
www | IN | CNAME | ns1 |
IN | A | 219.117.212.112 | |
pop | IN | CNAME | |
smtp | IN | CNAME |
それと、世界中のDNSの頂点に君臨するDNSの親玉のようなサーバーの情報がここにありますので、db.rootというファイル名で保存しておきます。
参考記事:Linux World 2003年9月号
あと、これが今回Ubuntuに変更して一番ハマったところですが、nslookupで名前解決出来ているか確認したところ、どうにも解決できず、色々調べた結果、どうやら/etc/resolv.confは再起動時に勝手に書き換えられるものらしい事が判明。最近のUbuntuでは/etc/systemd/resolved.confというファイルでDNSを指定する必要があるらしいとのこと。また、/etc/resolv.confは/run/systemd/resolve/stub-resolv.confのシンボリックリンクとなっており、「編集すんなよ!」とコメントに記載されています。
何はともあれネット上にある先人達の知恵を拝借して必要な設定を行い、名前解決の確認が無事できました。BINDの設定も問題ないことがこれで確認できます。
[Resolve] |
DNS=192.168.1.201 |
Domains=skucky.com |
quark:~# systemctl restart systemd-resolved |
quark:~# systemd-resolve --status |
~中略~ |
Current DNS Server: 192.168.1.201 |
DNS Server: 192.168.1.201 |
~中略~ |
quark:~# nslookup |
> ns1.skucky.com |
Server: 127.0.0.53 |
Address: 127.0.0.53#53 |
Non-authoritative answer: |
Name: ns1.skucky.com |
Address: 192.168.1.201 |
MTAには使い慣れた?postfixを選択。参考にしたサイトはこちらです。
quark:~# apt -y install postfix |
設定ファイルは/etc/postfix/main.cfだが、雛型として置いてある同ファイルにはコメントも無く、あっさりしたファイルで、先頭行にも「より完全なバージョンで、コメント付きの/usr/share/postfix/main.cf.distを見てくれ」とか書いてあるので、そちらの方を雛型として利用することにする。
どこを修正したのかよく覚えていないので、現状の設定で有効となっている行をすべて記載すると下記の通り。
smtpd_banner = $myhostname ESMTP |
biff = no |
append_dot_mydomain = no |
compatibility_level = 2 |
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem |
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key |
smtpd_tls_security_level=may |
smtp_tls_CApath=/etc/ssl/certs |
smtp_tls_security_level=may |
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache |
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination |
myhostname = quark.skucky.com |
alias_maps = hash:/etc/aliases |
alias_database = hash:/etc/aliases |
mydestination = mydestination = $myhostname, skucky.com, quark, localhost.localdomain, localhost, mail.skucky.com |
relayhost = |
mynetworks = 192.168.1.0/24,127.0.0.0/8 |
mailbox_size_limit = 1073741824 |
recipient_delimiter = + |
inet_interfaces = all |
inet_protocols = all |
home_mailbox = Maildir/ |
virtual_alias_maps = hash:/etc/postfix/virtual |
mail_owner = postfix |
mydomain = skucky.com |
myorigin = $mydomain |
local_recipient_maps = unix:passwd.byname $alias_maps |
sendmail_path = /usr/sbin/postfix |
newaliases_path = /usr/bin/newaliases |
mailq_path = /usr/bin/mailq |
setgid_group = postdrop |
message_size_limit = 10485760 |
header_checks = regexp:/etc/postfix/header_checks |
body_checks = regexp:/etc/postfix/body_checks |
smtpd_sender_restrictions = reject_unknown_sender_domain |
smtpd_client_restrictions = permit_mynetworks check_sender_access hash:/etc/postfix/access reject_rbl_client relays.ordb.org reject_rbl_client sbl-xbl.spamhaus.org permit |
普段プライベートのメアドはGmailを使用しているので、独自ドメインのメアドはGmailに転送し、一極集中して管理するためメールの転送設定を行います。設定は容易で普段Ubuntuにログインしているユーザーのホームディレクトリに.forwardというファイルを作成し、転送先のGmailアドレスを記載しておくだけです。複数のメアドを指定することもできます。
hogehoge@gmail.com |
hagehage@gmail.com |
#~中略~ |
ServerName www.skucky.com |
<FilesMatch \.php$> |
SetHandler application/x-httpd-php |
</FilesMatch> |
DirectoryIndex index.html index.php |
#~中略~ |
次に、バーチャルホストの設定というものをやります。平たく言えばWEBサイトのホームディレクトリをどのパスにするかやログの設定などをお好みに合わせて設定しているだけです。
#~中略~ |
<VirtualHost *:> |
ServerAdmin kakizawa@skucky.com |
DocumentRoot /var/www/ |
ErrorLog ${APACHE_LOG_DIR}/error.log |
CustomLog ${APACHE_LOG_DIR}/access.log combined |
SetEnvIf Remote_Addr "192.168.1." nolog |
SetEnvIf Request_URI "default.ida" worm nolog |
SetEnvIf Request_URI "root.exe" worm nolog |
SetEnvIf Request_URI "cmd.exe" worm nolog |
SetEnvIf Request_URI "Admin.dll" worm nolog |
SetEnvIf Request_URI "mem_bin" worm nolog |
SetEnvIf Request_URI "srcipts" worm nolog |
SetEnvIf Request_URI "awstats" worm nolog |
SetEnvIf Request_URI "stats" worm nolog |
SetEnvIf Request_URI "mambo" worm nolog |
SetEnvIf Request_URI "modules" worm nolog |
SetEnvIf Request_URI "MSOffice/cltreq.asp" worm nolog |
SetEnvIf Request_URI "vti_bin" worm nolog |
SetEnvIf Remote_Addr 60.35 robot nolog |
SetEnvIf Remote_Addr 65 robot nolog |
SetEnvIf Remote_Addr 66.94.224.0/19 robot nolog |
SetEnvIf Remote_Addr 66.98 robot nolog |
SetEnvIf Remote_Addr 66.196 robot nolog |
SetEnvIf Remote_Addr 66.249 robot nolog |
SetEnvIf Remote_Addr 68.142 robot nolog |
SetEnvIf Remote_Addr 202.160.176 robot nolog |
SetEnvIf Remote_Addr 209.237 robot nolog |
CustomLog /var/log/apache2/worm.log combined env=worm |
CustomLog /var/log/apache2/robot.log combined env=robot |
CustomLog /var/log/apache2/access.log combined env=!nolog |
</VirtualHost> |
#~中略~ |
我が家の自宅サーバーでは監視カメラも利用しており、撮影した動画はBasic認証でセキュリティを保持しています。まぁ、他人様に見られてもどうってことない庭先の映像が映っているだけですけどね。でも不特定多数の人に自由に見られるのは少し心配と言う事もあるので、簡易的なセキュリティ対策としてBasic認証の設定だけしています。
<Directory /var/www/webcam> |
AuthType Basic |
AuthName "Basic Autentication" |
AuthUserFile /etc/apache2/.htpasswd |
require valid-user |
</Directory> |
.htpasswdファイルは実際にBasic認証させるユーザー、パスワードを指定して下記の通り実行すれば作成できる。
quark:~# htpasswd -c -b /etc/apache2/.htpasswd ユーザ名 パスワード |
もう一つ今回の自宅サーバー更改で難航したのが、アクセスカウンタの表示でした。phpの出力結果がどうにも表示できず、色々試してみたのですが、なかなか表示されず、恐らくApacheの設定ファイル上の問題だったと記憶していますが、灯台下暗し的な根本的な設定が欠けていたのが原因だったかと思います。もう1か月くらい前の話なので、よく覚えていないです、はい。
とりあえず、以上の設定でDNS、メール、WEBサーバの設定が完了し、ある程度サーバっぽく動作させることができると思います。