Origami Devices

USB充電本作ったりしてます。

Raspberry Pi と iptables (2)

いま自分の /etc/iptables/rules.v4 は今こんな感じになっています。SSH は 8022/tcp を使う、OpenVPN を使う、Fusion IP-Phone Smart に Asterisk から接続する、という前提でのフィルタルールです。

*filter
:INPUT ACCEPT [4652:603240]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [509:67851]
# BASIC
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type any -j ACCEPT
-A INPUT -p 50 -j ACCEPT
-A INPUT -p 51 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# NetBIOS DROP without LOG
-A INPUT  -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
-A INPUT  -p udp -m multiport --dports 135,137,138,139,445 -j DROP
-A OUTPUT -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
-A OUTPUT -p udp -m multiport --sports 135,137,138,139,445 -j DROP
# Dropbox DROP without log
-A INPUT  -p udp --dport 17500 -j DROP
# BOOTP
-A INPUT -i eth0 -p udp --sport bootpc --dport bootps -j ACCEPT
# Service
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 433 -j ACCEPT
# -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8022 -j ACCEPT
-A INPUT -p udp --dport 1194 -j ACCEPT
# Asterisk
-A INPUT -p tcp -s 61.213.230.153 --dport 5060 -j ACCEPT
-A INPUT -p udp -s 61.213.230.153 --dport 5060 -j ACCEPT
-A INPUT -p udp -s 61.213.230.153 --dport 50600:50900 -j ACCEPT
# DROP AND LOG
-A INPUT -j LOG --log-level info --log-prefix iptables:DROP: ! -i lo -p tcp
-A INPUT -j DROP ! -i lo -p tcp
-A INPUT -j LOG --log-level info --log-prefix iptables:DROP: ! -i lo -p udp
-A INPUT -j DROP ! -i lo -p udp
# REJECT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
*nat
:PREROUTING ACCEPT [2394:272073]
:INPUT ACCEPT [1625:233719]
:OUTPUT ACCEPT [131:9942]
:POSTROUTING ACCEPT [131:9942]
-A POSTROUTING -o eth0 -s  192.168.253.0/24 -j MASQUERADE
#-A POSTROUTING -s 192.168.253.0/24 -o eth0 -j SNAT --to-source 192.168.0.XXX
COMMIT

(192.168.0.XXX は、Raspberry Pi 自体の IP アドレス(LAN内)です)

このフィルタルールでは、 DROP の記録をそのまま /var/log/messsage に書くことになります。(--log-level info にした場合、kern.info の扱いになるため)

DROP ログをほかのファイルに出力したい場合は、 /etc/rsyslog.conf を編集してください。別ファイルにした場合はローテートの設定をお忘れなく。

  • 「NetBIOS DROP without LOG」節

NetBIOS の内向き・外向き両方向のパケットを drop し、なおかつログに残さない設定です。LAN 内に Windows PC がある場合、NetBIOS 関連のパケットがよく飛んできて /var/log/messages を埋めかねないので、ここではそうしています。実際に設定するかはお好みでどうぞ。

  • Dropbox DROP without log」節

Dropbox が動作している PC が LAN 内にいる場合、同じく大量のパケットが飛んでくるので、ログに残さず Drop しています。Dropbox 側の設定で Dropbox の「基本設定」→「バンド幅」→「LAN 同期を有効にする」*1をオフにしておけば LAN 内にパケットをばらまくことはなくなりますが、LAN 同期を無効にできない環境の場合は必要になるでしょう。

NAT の 「-A POSTROUTING -o eth0 -s 192.168.253.0/24 -j MASQUERADE」で、IPマスカレードをやっています。ただし、フィルタ側にも「-A INPUT -p udp --dport 1194 -j ACCEPT」を書いておかないと外から 1194/udp の接続が通らないので忘れないようにしてください。

Raspbian の場合は SNAT でも MASQUERADE でもどちらも使えます。MASQUERADE のほうが一般的なので、そちらを使ったほうがよいでしょう。

61.213.230.153 に対してフィルタを開けているのは、これは Fusion IP-Phone Smart を使うことを前提としています。必ず相手先の SIP サーバに限定してフィルタを開けてください。最近は SIP を狙った不正なアクセスが大変多いので、これをやっておかないとかなり面倒なことになります。

  • SSH のポートについて

上記の例では SSH 用に 8022/tcp を使っています。22/tcp は気が遠くなるくらいに不正アクセスの試行が多いので、もはや外に向けて 22/tcp を開けておく必然性はないと思ったほうがいいです。可能であれば、もはや SSH のポートを直接外にさらすのはやめて、 OpenVPN を介するくらいのほうがちょうどいいのかもしれません。

*1:Dropbox v3.0.3 にて確認

Raspberry Pi と iptables

  • Raspbian には iptables は入っている

Raspbian には iptables が標準で入りますが、RHEL 系とは違って /etc/sysconfig/iptables に相当するものがありません。

起動時点で iptables のルールを設定するためには、iptables-persistent というパッケージを別途インストールする必要があります。 /etc/init.d の下に専用のスクリプトを自分で作って突っ込んでいる場合はそれはそれでいいですが…

ここでは、Debian の流儀でちゃんとやります。

まず、現在 iptables のルールが設定されているかを確認しましょう。

# sudo /sbin/iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

こんな表示だったら、いま設定されているルールはありません。既にルールが設定されている場合は、どこで設定したかを思い出してください。 /etc/rc.local あたりに何か書いてあるかもしれません。

さて、まずは iptables-persistent をインストールします。

# sudo aptitude install iptables-persistent

インストール時点で「Save current IPv4 rules?」「Save current IPv6 rules?」と聞かれますが、どちらも Yes で答えてください。

あとは /etc/iptable/rule.v4 および /etc/iptables/rule.v6 を書き換えるだけです。

iptables-persistent が正常に起動しない場合

# sudo /etc/init.d/iptables-persistent restart
[FAIL] Loading iptables rules... IPv4... IPv6...failed.

rules.v4 または rules.v6 のどちらかに記述エラーがあると思われます。ただ、このメッセージからは rules.v4 なのか rules.v6 なのかどちらかわかりません。

/etc/init.d/iptables-restore は、ルールの読み込みを /sbin/iptables-restore と /sbin/ip6tables-restore にやらせています。このどちらかでエラーが起きていると上記の表示が出るので、 --test と --verbose をオプションに付けてテストさせ切り分けをしましょう。

# /sbin/iptables-restore  --test --verbose < /etc/iptables/rules.v4
# /sbin/ip6tables-restore --test --verbose < /etc/iptables/rules.v6 
# /sbin/iptables-restore  --test --verbose < /etc/iptables/rules.v4
# Generated by iptables-save v1.4.14 on Mon Dec 22 14:23:59 2014
iptables-restore: line 2 failed

--test --verbose オプションを付けると、1行ずつ実行しながらエラー時にそこで表示をしてくれます。ちなみに、読み込ませたルールファイルのコメント行も表示してきます。上記の例では、2行目に何かいるということです。このときは2行目だけ改行コードがなぜか CRLF になってしまっていて、それが原因でエラーになってしまっていました。iptables のルールファイルは、行末に CRLF がいるとエラーになるのです…

iptables は他にも「空行は許されるが、スペース文字しかない行は許されない」などもありますので、スペース文字が変なところに隠れていないか気を付けてください。

# /sbin/iptables-restore  --test --verbose < /etc/iptables/rules.v4
# Generated by iptables-save v1.4.14 on Mon Dec 22 14:23:59 2014
Flushing chain `INPUT'
Flushing chain `FORWARD'
Flushing chain `OUTPUT'
# BASIC
# Service
# Asterisk
# LOG
# DROP AND REJECT
# Completed on Mon Dec 22 14:23:59 2014
# Generated by iptables-save v1.4.14 on Mon Dec 22 14:23:59 2014
Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'
# Completed on Mon Dec 22 14:23:59 2014

うまくいけば、コメント行と、ルールのフラッシュ内容がこんな形で出てきます。あとはもう一度、 sudo /etc/init.d/iptables-persistent restart してあげれば大丈夫でしょう。

Raspberry Pi と NTP または RTC の話

Raspberry Pi には RTC が載っていない

意外に忘れ去られがちなのだが、実は Raspberry Pi には一貫して RTC モジュールが載っていない。標準提供されている Raspbian を使う分には ntpd が動いているのであまり気にしなくても(internet に常時接続されている環境なら)いいのだが、そうでない場合は ntpd の設定を忘れると結構悲惨なことになりかねない。

RTC モジュールを載せる場合

たまにオフラインでも使用する場合がある、という場合は、RTC モジュールを載せてしまうという手もある。
h's IT Notes: Raspberry Piにリアルタイムクロックをインストールする

GPIOポートのピンアサインは(このモジュールを使う場合においては)同じなので、 Type B、Type B+ どちらでも使用できる。

Raspberry Pi とバイパスコンデンサの話

前提

Raspberry Pi を Internet に接続する前提で Type A を常用している人はあまりいないと思うので、ここでは Type B と Type B+ の話を前提とする。

Type B

Type B にはちょっと困ったことがある。特に散々語られたのが「USBデバイスをつなげると Raspberry Pi が fault する」というやつだ。再起動すればまた動作するのだが。で、原因は「USBデバイスを接続すると、そのデバイスをつないだ途端に端子電圧が低下する」という、これまた困った現象であった。原因は、Type B は USB ポートへの給電能力がしょぼいことにある。

これまでに先人が主な対策として挙げられてきたのは、下記の2点。

  1. セルフパワーで動作する USB ハブを介する
  2. バイパスコンデンサを増強する

難易度を考えると 1. のほうがお手軽なのだが、根本的な対処を考えると 2. をやっておいたほうがいいかもしれない。(またはこの問題が起こりにくい Type B+ を使うというのも手だ。価格差もあまりない。)

Type B 買っちゃったよ! という人は、下記を参考にしてバイパスコンデンサの増設または交換をするといいかもしれない。(はんだごてを扱ったことがない人は素直に諦めて B+ を買うか、または今からはんだごての腕を磨くしかないかもしれないが)

RaspberryPiにコンデンサ追加で電源強化

私もRaspberry Piのコンデンサを交換してみた。 - じとめすきーの覚え書き

ただし、どちらの方法にも留意点がある。まずバイパスコンデンサの増設。既設のコンデンサを剥す必要がないので、はんだ付けに失敗する可能性は低いのだが、問題はケースに収めようとしてコンデンサの足を曲げると、その真下にあるのはLDOレギュレータなのである。LDOレギュレータは安価なのだがとにかく変換効率が悪く、おそらく四分の一程度が熱として放出されてしまっている。

http://blog.minicube.net/2013/01/raspberry-pi33vldo.html

つまり、このLDOレギュレータの熱で電解コンデンサを炙っちゃうことになるのだ。放熱対策をしっかりやる必要があるだろう。

次に既設のコンデンサを剥す場合。これはもうご紹介先のブログの記事の通り、うまくやらないとランドを剥いでしまう可能性があるので、はんだごてをうまく使える人でないとちょっとおすすめできない。ただ、この方法でやればLDOレギュレータで炙られることはないので、長期運用を考えるならこちらのほうがよい。

Type B+

Type B+ は LDOレギュレータではなくスイッチングレギュレータに変更され、そのせいか Type B で目立っていた電源の問題はかなり影をひそめた。ひとつだけ気を付けなければならないのは、USBポートへの給電能力自体はそれほど向上していないにUSBポートだけは4つへ倍増してしまったので、「つなぎ過ぎればアウト」というのはあまり変わらない。4つあってもなあ、と思うのだが…

Raspberry Pi と玄箱HG とのベンチマーク比較

この二つを比較したベンチマークがそういえばなかったな、と思い出したので UnixBench をとってみた。いや、今更玄箱HGでベンチマークとる人もいないか…

玄箱HG

HDD は Seagate ST340015A。実はこのディスク、玄箱HGと同様10年きっちり動き続けた。よく動いてるなと感心する。

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.2)

   System: kurohg: GNU/Linux
   OS: GNU/Linux -- 2.4.17_mvl21 -- #24 2004年 10月 19日 火曜日 17:17:03 JST
   Machine: ppc (unknown)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0:  (173.7 bogomips)

   03:27:36 up 6 days,  4:06,  1 user,  load average: 0.59, 0.26, 0.10; runlevel

------------------------------------------------------------------------
Benchmark Run: Thu Sep 11 2014 03:27:36 - 03:56:03
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables         511136.7 lps   (10.1 s, 7 samples)
Double-Precision Whetstone                      135.4 MWIPS (10.0 s, 7 samples)
Execl Throughput                                154.8 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks         32450.8 KBps  (30.1 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           11691.5 KBps  (30.1 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks         51555.6 KBps  (30.1 s, 2 samples)
Pipe Throughput                              109310.8 lps   (10.1 s, 7 samples)
Pipe-based Context Switching                  52269.0 lps   (10.1 s, 7 samples)
Process Creation                                668.5 lps   (30.1 s, 2 samples)
Shell Scripts (1 concurrent)                    308.1 lpm   (60.4 s, 2 samples)
Shell Scripts (8 concurrent)                     42.5 lpm   (60.8 s, 2 samples)
System Call Overhead                         166635.8 lps   (10.1 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0     511136.7     43.8
Double-Precision Whetstone                       55.0        135.4     24.6
Execl Throughput                                 43.0        154.8     36.0
File Copy 1024 bufsize 2000 maxblocks          3960.0      32450.8     81.9
File Copy 256 bufsize 500 maxblocks            1655.0      11691.5     70.6
File Copy 4096 bufsize 8000 maxblocks          5800.0      51555.6     88.9
Pipe Throughput                               12440.0     109310.8     87.9
Pipe-based Context Switching                   4000.0      52269.0    130.7
Process Creation                                126.0        668.5     53.1
Shell Scripts (1 concurrent)                     42.4        308.1     72.7
Shell Scripts (8 concurrent)                      6.0         42.5     70.8
System Call Overhead                          15000.0     166635.8    111.1
                                                                   ========
System Benchmarks Index Score                                          66.1

Raspberry Pi Type B

使っているのは KINGMAX の 8GB SDHC (一応 Class10のやつ)。おい、長期運用するんじゃないのか。これ。

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.2)

   System: raspberrypi: GNU/Linux
   OS: GNU/Linux -- 3.12.22+ -- #691 PREEMPT Wed Jun 18 18:29:58 BST 2014
   Machine: armv6l (unknown)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0: ARMv6-compatible processor rev 7 (v6l) (0.0 bogomips)

   03:22:47 up 8 min,  1 user,  load average: 0.88, 0.79, 0.41; runlevel 2

------------------------------------------------------------------------
Benchmark Run: Thu Sep 11 2014 03:22:47 - 03:51:02
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        1680433.3 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                      268.6 MWIPS (10.0 s, 7 samples)
Execl Throughput                                234.5 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks         40456.9 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           12784.3 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks         96520.2 KBps  (30.0 s, 2 samples)
Pipe Throughput                              171084.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  23291.0 lps   (10.0 s, 7 samples)
Process Creation                                748.3 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                    419.5 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                     53.2 lpm   (60.9 s, 2 samples)
System Call Overhead                         390523.5 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    1680433.3    144.0
Double-Precision Whetstone                       55.0        268.6     48.8
Execl Throughput                                 43.0        234.5     54.5
File Copy 1024 bufsize 2000 maxblocks          3960.0      40456.9    102.2
File Copy 256 bufsize 500 maxblocks            1655.0      12784.3     77.2
File Copy 4096 bufsize 8000 maxblocks          5800.0      96520.2    166.4
Pipe Throughput                               12440.0     171084.9    137.5
Pipe-based Context Switching                   4000.0      23291.0     58.2
Process Creation                                126.0        748.3     59.4
Shell Scripts (1 concurrent)                     42.4        419.5     98.9
Shell Scripts (8 concurrent)                      6.0         53.2     88.7
System Call Overhead                          15000.0     390523.5    260.3
                                                                   ========
System Benchmarks Index Score                                          95.1

Index Score で見れば玄箱HGの4割増し程度の性能である。性能だけを考えれば、普通にどこかの安いVPSでも借りた方がよろしい。特に Web がらみは。ただ、自分専用のメールサーバをやらせるとか簡単なスクリプトを試すとか、そういう目的であれば十分に使える。

はじめに

Raspberry Pi が発売されてからそれなりの年月が経ちましたが、もともとが教育用コンピュータであるという位置づけ、そしていろいろなことで遊ぶという用途が喧伝されたことから、Raspberry Pi を長期運用するということがあまり語られていないように思います。そもそもの用途とちゃうやろ、と言われるとそれまでなのですが。

ただ、自分は Raspberry Pi をこれまで使ってきた玄箱HG(結局10年ほど使ってきたことになります。実際にはまだ動いています)の代わりとして使いたいという気持ちがあるので、Raspberry Pi もまた長期にわたって使い続けたいと思っております。

このblogが、同じく Raspberry Pi を長く使い続ける方のご参考になれば幸いです。