備忘録

備忘録

pproxyを利用してポートごとに利用するproxyサーバを変更する方法

Ⅰ. はじめに

タイトルの通り「pproxyを利用してポートごとに利用するproxyサーバを変更する方法」です。
f:id:kagasu:20210920133528p:plain

Ⅱ. やり方

1. サンプルプログラム
import asyncio
import pproxy

basePort = 8000
loop = asyncio.get_event_loop()

def getProxies():
  return [
    '10.0.0.1:1080',
    '10.0.0.2:1080',
    '10.0.0.3:1080',
  ]

def startProxyServer(proxies):
  for i, x in enumerate(proxies):
    server = pproxy.Server(f'http+socks5://0.0.0.0:{basePort + i}')
    remote = pproxy.Connection(f'socks5://{x}')
    handler = loop.run_until_complete(server.start_server(dict(rserver=[remote])))
    print(f'socks5://0.0.0.0:{basePort + i} -> socks5://{x}')

if __name__ == '__main__':
  proxies = getProxies()
  startProxyServer(proxies)

  try:
    loop.run_forever()
  except KeyboardInterrupt:
    print('exit!')

  loop.close()

実行結果

省略

Postfixで任意のヘッダを削除する方法

Ⅰ. はじめに

タイトルの通り「Postfixで任意のヘッダを削除する方法」です。

Ⅱ. 前提条件

  • Postfixがpcre有効状態としてコンパイルされている事
    ※以下コマンドを実行してpcreと表示されればOK
$ postconf -m | grep pcre
pcre

Ⅲ. やり方

1. postfix-pcreをインストールする
apt install postfix-pcre
2. dynamicsmap.cfの設定を確認する

postfix-pcreをインストールすると自動的に設定されます。

$ cat /etc/postfix/dynamicmaps.cf | grep pcre
pcre	postfix-pcre.so	dict_pcre_open	
3. Postfixの設定を変更する

/etc/postfix/main.cf

smtp_header_checks = pcre:/etc/postfix/smtp_header_checks

/etc/postfix/smtp_header_checks

# Received ヘッダを消す
/^Received:/ IGNORE

# X-Originating-IP ヘッダを消す
# /^X-Originating-IP:/ IGNORE
4. Postfixを再起動する
systemctl restart postfix

実行結果

Received ヘッダが消えた

Before f:id:kagasu:20210718014054p:plain
After f:id:kagasu:20210718014100p:plain

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.key
#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

# メール配信を全ての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/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)
  • GmailSPF, DKIM, DMARCがPASS(正しく認証出来ている状態)と表示されている

f:id:kagasu:20210717231246p:plain

留意点

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

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

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

Ⅰ. はじめに

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

Ⅱ. やり方

1. 必要なパッケージをNuGetからインストールする
Install-Package Fastenshtein
2. サンプルプログラムを書く
static double GetStringDiffRate(string str1, string str2)
{
  var levenshteinDistance = Fastenshtein.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