法楽日記

デジタル散策記&マインド探訪記

FreeBSD 11.1R: prison_check_af()

socreate() の中で prison_check_af() という関数が呼び出されています。これは、socket() システムコールの引数で指定された family が現在の jail 環境の中で利用可能かどうかを調べるためです。

prison_check_af() は、引数で指定された ucred 構造体の環境で(この構造体のメンバ cr_prison が指す jail 環境で)family が利用可能かどうかを調べるための関数です。利用可能な場合は 0 を、利用不可な場合は EPROTONOSUPPORT を返します。ソースコードによると、仮想ネットワーク(VIMAGE)が利用可能な場合はあらゆる family が利用可能で、利用不能な場合は下記のルールに従うようです。

  • AF_INET: 現在の jail 環境に IPv4 アドレスが割り当てられていれば利用可能
  • AF_INET6: 現在の jail 環境に IPv6 アドレスが割り当てられていれば利用可能
  • AF_LOCAL: 常に利用可能
  • AF_ROUTE: 常に利用可能
  • それ以外: security.jail.socket_unixiproute_only の値が 0 なら利用可能

なお、jail は FreeBSD 4.0 で導入された機能で、OSレベルの仮想化機構です。jail については FreeBSD Handbook の第14章「Jails」で解説されています。また、「The Design and Implementation of the FreeBSD Operating System, Second Edition」の第5章第9節「Jail」(p.180〜184)でも解説されています。この書籍については https://www.mckusick.com/books.html に情報が掲載されています。

prison_check_af() を含めた jail の実装は、sys/kern/kern_jail.c と sys/sys/jail.h で定義されています。また、thread 構造体は sys/sys/proc.h で、ucred 構造体は sys/sys/ucred.h で、それぞれ定義されています。