/etc/protocols on FreeBSD/NetBSD

投稿日: Leave a comment

FreeBSD機 (Core2 duo),NetBSD機 (Raspberry pi)に同じpf.confを入れたが,FreeBSDでは動いて,NetBSDでは動かず.

具体的には,以下のルールがNetBSDでは弾かれる.icmp6は知らん,と.

pass inet6 proto icmp6 all

man pf.confを見るとicmp6って書いてあるが,その下に/etc/protocolsを見るとも書いてある.

proto <protocol>
      This rule applies only to packets of this protocol. Common
      protocols are icmp(4), icmp6(4), tcp(4), and udp(4). For a list of
      all the protocol name to number mappings used by pfctl(8), see the
      file /etc/protocols.

念のため,FreeBSDとNetBSDでicmp6がどう載っているか比べてみた.

FreeBSD

ipv6-icmp 58 IPV6-ICMP icmp6 # ICMP for IPv6

NetBSD

ipv6-icmp 58 IPv6-ICMP # ICMP for IPv6 [RFC2460]

NetBSDにはicmp6が入っていなかった.NetBSD,FreeBSDどちらもipv6-icmpなら載っているので,pf.confにはipv6-icmpと書くことにした.

pass inet6 proto ipv6-icmp all

NetBSD/evbarm(2) with pf

投稿日: Leave a comment

FreeBSD/armが安定しなかったので,NetBSD/evbarmを入れることにした.出戻り

今回は,http://nyftp.netbsd.org/pub/NetBSD-daily/HEAD/ からスナップショットのSDイメージを持ってきてさくっとインストール.アップデートもここからユーザーランドを持ってこれるので自ビルドする必要はなさそう.

sshdをインターネットにさらそうと思っているので,sshguardを入れるべく,pfを使えるようにする.そのためにはカーネルを作り直さないとダメみたいなので,FreeBSDの母艦PCでクロスビルドする.

1. ソースの取得

ここと同じ.今回は /home/netbsd/current/src に展開.

2. kernel config

/src/sys/arch/evbarm/conf/RPI の末尾を見ると,

% tail RPI

# data mover pseudo-devices
#pseudo-device swdmover # software dmover(9) back-end
#pseudo-device dmoverio # /dev/dmover dmover(9) interface

# userland interface to drivers, including autoconf and properties retrieval
pseudo-device drvctl

# local configuration
cinclude "arch/evbarm/conf/RPI.local"

とあるので,RPI.localを作っていろいろ追加していけばよさそう.ということで,こんなRPI.localにした.

% cat RPI.local
file-system UNION # union file system
pseudo-device pf # PF packet filter 
pseudo-device pflog # PF log if
pseudo-device vlan # IEEE 802.1q encapsulation

※ついでに使うかわからないけど,union file systemとvlanも入れておいた.

3. クロス環境の構築

基本的にはここと同じだが,archとしてearmhf を指定することと,FreeBSD/amd64のclangでコンパイルできなかったので,gccを使うことに注意.

まず,gccを入れてなかったのでインストールから.

# pkg install gcc

gcc-4.7.1がgcc47として入るので,クロス環境の構築時に指定してあげる.earmhfも指定する.

% cd /home/netbsd/current/src
% HOST_CC=gcc47 HOST_CXX=g++47 ./build.sh -O ../objarm -m evbarm -a earmhf -U tools

4. カーネル構築

クロス環境の構築に引き続きカーネルを構築.コマンドはほとんど同じ.

HOST_CC=gcc47 HOST_CXX=g++47 ./build.sh -O ../objarm -m evbarm -a earmhf -U kernel=RPI

基本的にクロスコンパイラーを使うのでHOST_CCとか指定する必要はなさそうだが,一応入れておいた.

5. カーネルの入れ替え

objarm/sys/arch/evbarm/compile/RPI/netbsd.binをコピーして,NetBSD on Raspberry pi の /boot/kernel.img としておいて再起動.

カーネルはSDカード先頭のFATパーティションに置くことになっているが,/bootにマウントされているので,動作中に置き換え出来る.