【FreeBSD】Wireguardでアクセス元IPアドレスをロギングするパッチを作った

前回紹介したFreeBSDへのWireguardのinstallですが、アクセス元IPアドレスをロギング出来るようにしようとソースコードを読んだところ、ロギングの仕組みがなかったので😇今回パッチを作成してみました。

ソースコード

Wireguardのソースコードは以下にあります。

FreeBSDのソースコードとLinuxのソースコードを見比べると、ログフォーマットが若干違う事が事が分かります。

  • FreeBSDの場合
# find wireguard-freebsd/ -name "*" | xargs grep "Receiving handshake initiation"
wireguard-freebsd/src/if_wg.c:          DPRINTF(sc, "Receiving handshake initiation from peer %" PRIu64 "\n", peer->p_id);
  • Linuxの場合
# find wireguard-linux/ -name "*" | xargs grep "Receiving handshake initiation"
wireguard-linux/drivers/net/wireguard/receive.c:                net_dbg_ratelimited("%s: Receiving handshake initiation from peer %llu (%pISpfsc)\n",

ちなみにLinuxソースコード中の %pISpfscIPv4/IPv6 addresses (generic, with port, flowinfo, scope)なので、LinuxはちゃんとIPアドレスが記録されますね。

FreeBSDの場合、debugログは以下のようにI/Fにdebugフラグを有効にしないとログが出なく、かつアクセス元IPアドレスがログに記録されないためパッチを作成しました。

ifconfig vmx0 debug

パッチ作成

以下のリポジトリに上げておきました。
https://github.com/spg-games/wireguard-kmod-logging-patch

sin_addrの通り、IPv6の考慮がされていないので修正しておきます😇
FreeBSDでもIPv4/IPv6のprintfのフォーマット指定子があれば、それを使うのが良さそうですね。
その辺り調べてMLでpatch作成報告してみたいと思います。

とりあえず上記パッチを当てると以下のようなログがI/Fのdebugフラグを有効にしなくても記録されます。

# /var/log/messages
May 30 08:53:15 spg-games kernel: wg0: Receiving handshake initiation from peer 1 203.0.113.100

余談

今回FreeBSDのportsでmake installでパッチ適用されるようにfiles配下にパッチファイルを置いたのですが、当初patchのpathが悪かったのか、build時に適用先pathを毎回聞かれていました。
portsのパッチ作成はwork配下のソースコード改変後、以下のコマンド一発でパッチ作成が可能です。

make makepatch

/usr/ports/Mk/bsd.port.mk を見れば、make fetch, make extract, make patch, make installなど各種フェーズの操作が可能な事が分かります。

まとめ

今回FreeBSDのWireguardでアクセス元IPアドレスをロギングするパッチを作成してみました。WireguardなどのリモートアクセスのVPNは基本FWで制限をかけるのはアクセス性が悪くなってしまうので、認証をしっかりさせてかつアクセス元をロギングする方が良いかなと思っています。
最近だと境界型セキュリティ、ゼロトラストの対比でディスられていますし😇

Share Comments
comments powered by Disqus