前回紹介した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ソースコード中の %pISpfsc
は IPv4/IPv6 addresses (generic, with port, flowinfo, scope)なので、LinuxはちゃんとIPアドレスが記録されますね。
いやーー完全に初見だったhttps://t.co/NPyt0pYDOe
— spg (@spg_games) May 31, 2021
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
portsのパッチ作成をしていて、path指定が悪かったのかすんなりpatch当たらなくて何が正解なんだ...と思ってたら make makepatchですんなりパッチ作成出来た。
— spg (@spg_games) May 16, 2021
ドキュメントというかソース読むのが手っ取り早いよなぁ😇
/usr/ports/Mk/bsd.port.mk
を見れば、make fetch
, make extract
, make patch
, make install
など各種フェーズの操作が可能な事が分かります。
まとめ
今回FreeBSDのWireguardでアクセス元IPアドレスをロギングするパッチを作成してみました。WireguardなどのリモートアクセスのVPNは基本FWで制限をかけるのはアクセス性が悪くなってしまうので、認証をしっかりさせてかつアクセス元をロギングする方が良いかなと思っています。
最近だと境界型セキュリティ、ゼロトラストの対比でディスられていますし😇