備忘録

備忘録

PostfixとOpenDKIMを利用してメールサーバを構築する方法

Ⅰ. はじめに

タイトルの通り「PostfixとOpenDKIMを利用してメールサーバを構築する方法」です。

Ⅱ. やり方

1. OpenDKIMをインストールする
apt install opendkim opendkim-tools
2. OpenDKIMで利用する秘密鍵と公開鍵を生成する
mkdir /etc/dkimkeys/example.com
opendkim-genkey -D /etc/dkimkeys/example.com -d example.com -s default
chown -R opendkim:opendkim /etc/dkimkeys/
3. OpenDKIMの設定ファイルを編集する

※複数ドメインの対応が必要な場合はKeyFileの代わりにKeyTableとSigningTableを利用する
/etc/opendkim.conf

Syslog yes
SyslogSuccess yes
LogWhy yes

Mode sv
Domain example.com
KeyFile /etc/dkimkeys/example.com/default.private
#KeyTable refile:/etc/opendkim/KeyTable
#SigningTable refile:/etc/opendkim/SigningTable
Selector default

ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts

Socket inet:8892@localhost

/etc/opendkim/TrustedHosts

127.0.0.1
4. Postfixをインストールする
apt install postfix
5. Postfixの設定ファイルを編集する

/etc/postfix/main.cf

myhostname = example.com
mydestination = $myhostname, localhost
myorigin = /etc/mailname

# メール配信を全てのIPアドレスで許可する(テスト用途)
# mynetworks = 0.0.0.0/0

# OpenDKIM
smtpd_milters = inet:127.0.0.1:8892
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

/etc/mailname

example.com

/etc/postfix/master.cf

# Postfixをポート2525で起動する
2525      inet  n       -       y       -       -       smtpd
6. OpenDKIM, Postfixを起動する
systemctl enable opendkim
systemctl enable postfix

systemctl restart opendkim
systemctl restart postfix
7. DNSレコードを設定する
タイプ 名前 意味
TXT @ v=spf1 ip4:1.2.3.4 -all SPF
TXT default._domainkey v=DKIM1; h=sha256; k=rsa; p=MII... DKIM公開鍵
TXT _adsp._domainkey dkim=unknown ADSP
A mail.example.com 1.2.3.4 MXレコード用Aレコード
MX @ mail.example.com MXレコード
TXT _dmarc v=DMARC1; p=none; pct=100; adkim=r; aspf=r; DMARC

※DKIM公開鍵の場所

/etc/dkimkeys/example.com/default.txt
8. テストメールを送信する
echo "Test body" | mail --subject "Test subject" --append="FROM:noreply@example.com" abc@gmail.com
echo "Test body" | mail --subject "Test subject" --append="FROM:TestUser <noreply@example.com>" abc@gmail.com

実行結果

  • OpenDKIMによる署名が実行されたログが出力されている
$ tail -f /var/log/syslog
Jul 18 02:59:17 opendkim[46116]: E65EF140128: DKIM-Signature field added (s=default, d=example.com)
  • GmailでSPF, DKIM, DMARCがPASS(正しく認証出来ている状態)と表示されている


留意点

ファイアウォール設定を必ず確認する。
踏み台にならないように適切な設定を行う事。

FAQ

Q1. OpenDKIMのログに以下のメッセージが表示される。原因は?
can't determine message sender; accepting

メールクライアント側が原因である可能性が高い。
RFCに違反するような形式のメールを送信しようとした時に発生する。
https://serverfault.com/questions/412389

Q2. サブドメイン(例. mail.example.com)で運用する場合のDNSレコード設定例を知りたい
タイプ 名前 意味
TXT mail v=spf1 ip4:1.2.3.4 -all SPF
TXT default._domainkey.mail v=DKIM1; h=sha256; k=rsa; p=MII... DKIM公開鍵
TXT _adsp._domainkey.mail dkim=unknown ADSP
A mail.example.com 1.2.3.4 MXレコード用Aレコード
MX mail mail.example.com MXレコード
TXT _dmarc.mail v=DMARC1; p=none; pct=100; adkim=r; aspf=r; DMARC

ADSPについて

C#で文字列の類似度を求める方法

Ⅰ. はじめに

タイトルの通り「C#で文字列の類似度を求める方法」です。

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
dotnet add package Fastenshtein --version 1.0.0.8
2. サンプルプログラムを書く
using Fastenshtein;

static double GetStringDiffRate(string str1, string str2)
{
  var levenshteinDistance = Levenshtein.Distance(str1, str2);
  var length = (str1.Length > str2.Length) ? str1.Length : str2.Length;
  var diffRatio = 1.0 - ((double)levenshteinDistance / length);
  return diffRatio;
}

static void Main()
{
  var diffRate = GetStringDiffRate("abcd1", "abcd2");
  Console.WriteLine(diffRate);
}

実行結果

0.8

C#で文字列のレーベンシュタイン距離求める方法

Ⅰ. はじめに

タイトルの通り「C#で文字列のレーベンシュタイン距離を求める方法」です。

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
Install-Package Fastenshtein
2. サンプルプログラムを書く
var levenshteinDistance = Fastenshtein.Levenshtein.Distance("value1", "value2");
Console.WriteLine(levenshteinDistance);

実行結果

1

systemdをcron代替として利用する方法

Ⅰ. はじめに

タイトルの通り「systemdをcron代替として利用する方法」です。
例として「10秒ごとにecho helloを実行する方法」をこの記事で紹介します。

一時的なスケジュールを簡単に作成する方法はこちら

Ⅱ. やり方

1. サービスユニットファイルを作成する

/etc/systemd/system/Hello.service

[Unit]
Description=Hello service

[Service]
Type=oneshot
ExecStart=echo hello
2. タイマーユニットファイルを作成する

/etc/systemd/system/Hello.timer

[Unit]
Description=Hello timer

[Timer]
# OS起動後10分経過後に実行する
OnBootSec=10min

# OS起動後1時間15分経過後に実行する
# OnBootSec=1hour 15min

# 10秒ごとに実行
OnUnitActiveSec=10s

# タイマー精度
AccuracySec=100ms

# OSが停止等で前回未実行の場合直ちに実行する
# Persistent=true
3. 起動する
systemctl start Hello.timer
4. 状態確認
systemctl list-timers

f:id:kagasu:20210629174213p:plain

結果

10秒ごとに実行されている

$ journalctl -fu Hello
Jun 29 17:42:13 localhost echo[4056]: hello
Jun 29 17:42:13 localhost systemd[1]: Hello.service: Succeeded.
Jun 29 17:42:13 localhost systemd[1]: Finished Hello service.
Jun 29 17:42:23 localhost systemd[1]: Starting Hello service...
Jun 29 17:42:23 localhost echo[4066]: hello
Jun 29 17:42:23 localhost systemd[1]: Hello.service: Succeeded.
Jun 29 17:42:23 localhost systemd[1]: Finished Hello service.
Jun 29 17:42:33 localhost systemd[1]: Starting Hello service...
Jun 29 17:42:33 localhost echo[4080]: hello
Jun 29 17:42:33 localhost systemd[1]: Hello.service: Succeeded.
Jun 29 17:42:33 localhost systemd[1]: Finished Hello service.

node-fetchでCookieを設定する方法

Ⅰ. はじめに

タイトルの通り「node-fetchでCookieを設定する方法」です。

Ⅱ. やり方

1. サンプルプログラムを書く
const fetch = require('node-fetch');

(async () => {
  const url = 'https://google.com'

  // 初回リクエスト。Set-Cookieレスポンスヘッダを読み取る。
  const res = await fetch(url)
  const cookies = res.headers.raw()['set-cookie']
  const cookie = cookies.map(x => x.split(';')[0]).join('; ')

  // リクエストヘッダにCookieを設定してリクエストする
  await fetch(url, {
    headers: {
      'Cookie': cookie
    }
  })
})()

実行結果

省略