2018/06/30(土)Certbotによるワイルドカード証明書と自動更新の設定

どこよりも簡単なワイルドカード証明書設定メモ。


2018年からLet's Encryptがワイルドカード証明書に対応しました。

これを利用するためにはdns-01という、DNSのTXTレコードを使った認証が必要で、このDNS認証手順を自動化する必要があります

DNSレジストラサービスを使用している場合を想定して、dns-01認証の方法をまとめました。

構成

  • Debian Stretch
  • Apache
  • BIND
  • 設定対象DNS : example.jp

DNSは外部サービスを使用しているものとします。外部サービスでも、CloudfireやAWS、Google Cloud DNSといった有名サービスを使っている場合、DNSサーバは不要です。検索すれば、それらの設定方法が出てきます。

続きを読む

2017/10/30(月)LAN内に外部公開サーバを置いて、内部からアクセスさせる

ルーティングテーブル書き換え(route)によるアクセス制御から、unboundによるDNSの一部書き換えに移行したメモ。

状況

LAN内のLinuxマシンを、家庭用ルータのポートマッピングを使って外部公開している状況を想定しています。小規模の会社とかでも、こういう設定をされていることがありますね。

home-LAN-newtork.png

この場合、内側のPCから外部公開時のホスト名である「global.my.ip」にアクセスするとグローバルIPを引いてしまいます。そして、PCからルーターの外側IPにアクセスすることになるのですが、NEC等のルータではこの際ポートマッピングが有効にならずアクセス不能となります。*1

ルータのルーティングテーブルを書き換えることができれば色々と解決策はあるのですが、そんな機能を持った機種はまずありません……。*2

*1 : Buffaloはたしかアクセスできたような気がする。

*2 : Atermとかでは外向きの静的ルーティングはできても、内向きは無効です……

力技で解決していた

どうにもならないので、PCを起動するたびに、外部IPを確認して、外部IPにアクセスするときはLinuxサーバ(192.168.1.8)にルーティングするような設定をしていました。

@echo off
' route-add.bat
for /f "usebackq tokens=2 skip=1" %%i in (`nslookup global.my.ip 192.168.1.1 ^| findstr "[0-9]\.[0-9]"`) do set IP=%%i
route add %IP% 192.168.1.8

これで、PCから外部IP向けのパケットがLinuxサーバに向かうので、Linuxサーバ側でNAT処理をします。

MY_LOCAL="192.168.1.2"
MY_GLOBAL=`dig +short global.my.ip`
#---------------------------------------------------------------------------
# Special forward for myself
#---------------------------------------------------------------------------
iptables -t nat -A OUTPUT      -d $MY_GLOBAL -s $MY_LOCAL \
         -j DNAT --to-destination $MY_LOCAL
#---------------------------------------------------------------------------
# Special forward for local network
#---------------------------------------------------------------------------
iptables -t nat -A PREROUTING  -d $MY_GLOBAL -s $MY_LOCAL/24 \
         -j DNAT --to-destination $MY_LOCAL

これで無事アクセスはできるのですが、スマホ等からのアクセスは断絶されたままでした。

unboundによるDNSの書き換え

unboundというDNSキャッシュサーバには、特定のホスト名やドメインだけ、DNSの結果を書き換える機能が付いています。

本当は外部IPでのアクセスがすべてLinuxサーバに転送されるのが理想なのですが、そうも言ってらもないので、この方法で解決を試みました。以下、Debianサーバでの設定例です。

sudo su
apt-get install unbound

/etc/unbound/unbound.conf を編集して以下を追加します。

server:
        interface: 0.0.0.0
        access-control: 127.0.0.1 allow
        access-control: 192.168.0.0/16 allow

続いて /etc/unbound/unbound.conf.d/global.my.ip.conf というファイルを新規作成します。

local-data: "global.my.ip A 192.168.1.8"

作成したら unbound にリロードさせます。

service unbound reload

確認

$ dig @localhost global.my.ip
;; ANSWER SECTION:
global.my.ip.           3600    IN      A       192.168.1.8

ルータの設定書き換え

ルータのDHCPの設定を書き換えて、DNSのプライマリサーバに 192.168.1.8 を指定します。セカンダリは 192.168.1.1 を指定しておくと良いでしょう。

まとめ

NECのルータは性能は悪くないけど、細かい設定ができないのでちょっと面倒ですね。

UPnPタイムアウトを設定できないし(高級機のみ可)。Buffaloのほうがいいのかもしれない。ポート転送が内側に対しても効いた気がするし。

その後 2020/4/15

IPv6化して解決したため、unboundを削除しました。

2015/01/30(金)Debian - jessie インストールメモ

記述が散らばってきたのと、さすがに古くなった部分があるのでまとめメモ。

キーボード環境の設定

apt-get install console-setup
dpkg-reconfigure locales

コンソールとGRUB画面の設定

高解像度すぎて使いにくいのでほどほどに。

# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="video=800x600-16"
GRUB_GFXMODE=800x600
GRUB_GFXPAYLOAD_LINUX=keep
# update-grub

ついでに「mitigations=off」してMeltdown対策などをオフにすると、古いIntel CPUでは(セキュリティを犠牲にして)パフォーマンスが向上するらしい。

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="video=800x600-16 mitigations=off"

fbterm

# apt-get install fbterm unifont
# usermod -aG video <user id>
# vi ~/.fbtermrc
font-names=unifont
font-size=16

このままだとアンチエイリアスが掛からないので設定する。(設定済の場合は不要)

# vi ~/.font.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="font">
	<edit name="antialias" mode="assign">
		<bool>true</bool>
	</edit>
</match>
</fontconfig>

固定IP

# vi /etc/network/interfaces
auto eth0
iface eth0 inet static
	address 192.168.1.20
	netmask 255.255.255.0
	gateway 192.168.1.1
#	mtu 9000

rpcbindとeximを止める

# apt-get remove --purge rpcbind nfs-common
# apt-get remove --purge exim4 exim4-base exim4-config exim4-daemon-light

rootとwheel

# vi /etc/pam.d/su
auth       required   pam_wheel.so group=adm
# gpasswd -a USER adm

firewallの導入

# touch /etc/network/if-pre-up.d/iptables
# ln -s /etc/network/if-pre-up.d/iptables /etc/
# chmod +x /etc/network/if-pre-up.d/iptables
# vi /etc/iptables

設定詳細はこちらの記事

hosts.allow/deny

ALL : my_hostname
ALL : localhost
sshd : .jp

sshdのパスワード認証とrootログインを禁止

# vi /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
# /etc/rc.d/ssh restart

鍵認証設定後に。

localeの変更

# dpkg-reconfigure locales

tmpfsの設定変更

デフォルトだと実メモリの半分以上をtmpfsに割り当てられてしまいます。実使用分しかメモリを消費しないとはいえ気持ち悪いです。

/etc/default/tmpfsを書き換えればいろいろ設定できるはずと思ったら、Debian jessieは「sysvinit」ではなくなってるらしく/etc/default/tmpfsに設定しても意味がない

/etc/systemd 以下に書くのが正解なようですが、どう書けばいいかの情報がないのでしばらく保留……。

ntp設定

server   ntp.example.jp iburst
# IPv6
server   -6 ntp.example.jp iburst

状態確認

ntpq -p

PostgreSQLのリポジトリ追加

PostgreSQLの最新版が使えなかったり、アップグレードごとにメジャーバージョンが入れ替わって(古いバージョンのメンテが終わって)毎度DB移行が面倒なので。

# vi /etc/apt/sources.list
deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main
# apt-get install gnupg
# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

PostgreSQLの設定

いつも /var/lib/postgresql ではなく /home/postgres にDBファイルを置くのだけども、ファイル移動したりシンボリックリンクしたりスマートじゃない方法で解決してました。

postgresql-commonだけ先に入れて、データディレクトリを変更。

# apt-get install postgresql-common
# vi /etc/postgresql-common/createcluster.conf
data_directory = '/home/postgres/%v/%c'

その後、任意のpostgresqlを導入。

後から変更

デフォルトDBの削除。

# pg_dropcluster --stop 9.4 main
# rm -rf /var/lib/postgresql

データディレクトリを変更してDB作成。

# vi /etc/postgresql-common/createcluster.conf
data_directory = '/home/postgres/%v/%c'
# pg_createcluster 9.4 main --options

pg_cluster系コマンドで複数のDBの起動などもできるらしい。

autovacuumの設定

デフォルトではオートvacuumが3worker×1分ごとに動作しようとし(必ず動作するわけではない)、そのたびにHDDにfsyncしてしまいます。ほとんど使用しないDBには無駄なディスク負荷なので、postgresql.conf の設定を変更しました。

autovacuum_max_workers = 1
autovacuum_naptime = 1d

GNU parted

# parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) unit gb
(parted) print free
(parted) mkpart primary ext4 0 100%
(parted) print

コンソール日本語入力

# apt-get install uim-fep uim-anthy
# vi /usr/share/uim/generic-key-custom.scm
(define-custom 'generic-on-key '("zenkaku-hankaku" "<Control> ")
(define-custom 'generic-off-key '("zenkaku-hankaku" "<Control> ")

あとは「uim-fep」コマンドで起動。「CTRL+SPACE」でon/off。

その他

雑多メモ

特定のポートを使用中のプロセスを調べる。

# lsof -i:111
# netstat -ap

特定のファイルを含むパッケージを調べる。

$ dpkg -S [filename]

UUIDの確認。

# blkid /dev/sda1
# ls -l /dev/disk/by-uuid/

ia32-libsの代替。

# apt-get install lib32z1

開発環境一式。

# apt-get install build-essential

sshログイン時のメッセージ表示はpam.d/sshdで制御できる。

session    optional     pam_motd.so motd=/run/motd.dynamic noupdate
session    optional     pam_motd.so

バージョンの確認。

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.1 (jessie)
Release:        8.1
Codename:       jessie