2013年09月18日

RPi - Raspberry Pi で Tor ルーター ( Onion Pi )を構築する方法

Tor は貴方が何処からインターネットにアクセスしたのかを隠蔽してくれる(送信元 IP アドレスによる追跡・特定を困難にする)アプリケーションです。 今日は先日ちょっとした話題になった Raspberry Pi を使った Tor ルーターのセットアップ方法をご紹介しますよ。 え、追跡されて困るような行いをするつもりは無いから Tor は必要ない?、ええ勿論、悪いことをする必要はありませんが、自由・平等であるべきインターネットにおいて悪意のある・同意無き追跡者から身を守る方法を知っておくのも大事なのではないでしょうか。

onion pi
 


Raspberry Pi + Tor ルーター ( Onion Pi )の概要と仕組み


Raspberry Pi Foundation が「 Onion Pi の Tor プロキシで NSA と PRISM を撃退できる」と賛辞を贈ったことで話題となった Onion Pi 。 今日はこれを作ります。

Raspberry Piで組み立てる“PRISM対策Torルータ”、「Onion Pi」登場 - ITmedia ニュース
Onion Pi ...


Tor に関する基本的な知識はこちらをどうぞ。 

ネットワーク経路を複雑化・追跡困難にするTorってどんなもの?


Tor を使うと、まるで玉ねぎの皮を剥くが如く、追跡者がその芯(個人)を特定することは非常に困難な作業になるんですね。

さて今回構築する具体的な構成はこう。

Raspberry Pi Tor Router


Raspberry Pi に USB 型 無線 LAN アダプタを接続して無線 LAN アクセス・ポイント( AP )を作ります。

この無線 LAN アクセス・ポイントに接続したクライアントは Raspberry Pi を出口としてトラフィックを送信し、これを受信した Raspberry Pi は単純なルーターとして有線 LAN 側にトラフィックを転送するのではなく Tor ネットワークへ転送する理由です。

Raspberry Pi には Wi-Fi アクセス・ポイント、 Tor プロキシ、ルーターとしての3つの仕事をしてもらうことになりますね。


Raspberry Pi を使った Onion Pi ( Tor Proxy, Wi-Fi AP, Router ) の作り方


今回僕が利用する無線 LAN アダプタは I-O DATA 社の販売する WN-G300UA 。

I-O DATA IEEE802.11n/g/b準拠 300Mbps(規格値) 無線LANアダプター WN-G300UA
アイ・オー・データ (2012-10-20)
売り上げランキング: 78


Raspberry Pi にインストールする OS は Raspbian 。セットアップと基本設定はこちらの記事をどうぞ。

RPi - Raspberry Pi ファースト・インプレッション + 押さえておきたい初期設定


WN-G300UA は特別な設定・ドライバの追加は必要無く接続すれば wlan0 として認識されます。

pi@raspberrypi ~ $ ifconfig wlan0
wlan0     Link encap:イーサネット  ハードウェアアドレス 34:76:c5:1c:e3:af 
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)


この wlan0 へ固定 IP アドレスを設定しましょう。 これは AP に接続したクライアントから見てトラフィックの出口(ゲートウェイ)になる IP アドレスです(今回はクライアントの利用するネットワーク・アドレスを 10.0.0.0/16 、そのゲートウェイを 10.0.0.1 とします)。

pi@raspberrypi ~ $ sudo ifconfig wlan0 10.0.0.1 netmask 255.255.0.0 up


再起動時にも反映されるよう /etc/network/interfaces ファイルを編集して、

pi@raspberrypi ~ $ sudo vi /etc/network/interfaces


wlan0 インターフェースに固定アドレスを設定。

iface wlan0 inet static
address 10.0.0.1
netmask 255.255.0.0

#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp


割愛しますが有線 LAN ( eth0 )側の設定・インターネットへの接続確認も終らせておいて下さいね。

続いて AP に接続したクライアント端末に IP アドレスをリースする為に DHCP サーバーをインストール(自動起動は無効/ disable にします)。

pi@raspberrypi ~ $ sudo apt-get install isc-dhcp-server
pi@raspberrypi ~ $ sudo update-rc.d isc-dhcp-server disable


設定は /etc/dhcp/dhcpd.conf を編集。

pi@raspberrypi ~ $ sudo vi /etc/dhcp/dhcpd.conf


今回は次のような設定を追加します。 routers は Raspberry Pi の無線 LAN アダプタに設定した IP アドレス。 range はネットワークのアドレス範囲から適当な開始・終了アドレスを指定。

ping-check true;

subnet 10.0.0.0 netmask 255.255.0.0 {
        option routers                  10.0.0.1; # RPi wlan0 address
        option subnet-mask              255.255.0.0;
        option domain-name              "local";
        option domain-name-servers      8.8.8.8,8.8.4.4; # Google DNS
        default-lease-time 600; # 10 min
        max-lease-time 7200; # 2h
        range 10.0.1.1 10.0.255.254;
}


DHCP サーバーでアドレスを配布するインタフェースも /etc/default/isc-dhcp-server で指定しておきましょう。

pi@raspberrypi ~ $ sudo vi  /etc/default/isc-dhcp-server


一番下にある INTERFACES で wlan0 を指定。

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="wlan0"


さあ、準備は出来ました。 次のコマンドで DHCP サーバーを起動します。

pi@raspberrypi ~ $ sudo /etc/init.d/isc-dhcp-server start
[ ok ] Starting ISC DHCP server: dhcpd.


続いて無線 LAN アクセス・ポイント( AP )を作りましょう。 これには hostapd パッケージを利用。

pi@raspberrypi ~ $ sudo apt-get install hostapd
pi@raspberrypi ~ $ sudo update-rc.d hostapd disable


インストールが終わったら hostapd.conf を作成。 

pi@raspberrypi ~ $ sudo vi /etc/hostapd/hostapd.conf 


中身はこんな内容で。

interface=wlan0
driver=nl80211
ssid=TorAP
hw_mode=g
channel=3
wpa=2
wpa_passphrase=mypassword
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP


と、ここで問題が・・・。 driver で指定する値は利用するアダプタによって変わりますが、僕の WN-G300UA ( Realtek Semiconductor 社の RTL8192CU チップを使用)ではドライバを hostapd が認識せず何を設定してもうまく動きません。

pi@raspberrypi ~ $ sudo lsusb 
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter


対応方法はこう。 まず作成した hostapd.conf ファイルの driver 行をコメントアウト(又は削除)して Realtek Semiconductor 社のダウンロードページからユーティリティを含むドライバ・ソース(wpa_supplicant_hostapd-0.8_rtw_20120803.zip)をダウンロードします。

これを Raspberry Pi にコピー、中身に含まれる hostapd をビルド( make )します。

pi@raspberrypi ~ $ unzip wpa_supplicant_hostapd-0.8_rtw_20120803.zip
pi@raspberrypi ~ $ cd wpa_supplicant_hostapd-0.8/hostapd/
pi@raspberrypi ~/wpa_supplicant_hostapd-0.8/hostapd $ make


make が終わると同じ場所に作られた RTL8192CU に対応した hostpad (0.8.x)が作られるので、

pi@raspberrypi ~/wpa_supplicant_hostapd-0.8/hostapd $ ./hostapd -v
hostapd v0.8.x
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Copyright (c) 2002-2011, Jouni Malinen <j@w1.fi> and contributors


これを先程 apt-get でインストールした hostapd に上書きコピーします。

pi@raspberrypi ~/wpa_supplicant_hostapd-0.8/hostapd $ sudo cp ./hostapd /usr/sbin/
pi@raspberrypi ~/wpa_supplicant_hostapd-0.8/hostapd $ sudo cp ./hostapd_cli /usr/sbin/


さあ、これで AP モードが使えますよ!

pi@raspberrypi ~$ sudo hostapd /etc/hostapd/hostapd.conf 
Configuration file: /etc/hostapd/hostapd.conf
drv->ifindex=3
l2_sock_recv==l2_sock_xmit=0x0x18c7638
... snip ...


ソースからの make が面倒な人は僕がビルドしたバイナリをどうぞ( RTL8192CU 対応 hostapd のダウンロード)。

後もう少しですね。 次のコマンドで Tor パッケージをインストールします。

pi@raspberrypi ~ $ sudo apt-get install tor
pi@raspberrypi ~ $ sudo update-rc.d tor disable


設定ファイルは /etc/tor/torrc 。 これを編集して、

pi@raspberrypi ~ $ sudo vi /etc/tor/torrc


Tor プロキシの設定を追加しましょう。 TransListenAddress , DNSListenAddress は無線 LAN アダプタ( wlan0 )に設定した IP アドレス。 このアドレスで受信したトラフィックのうち TCP ポート 9090 番、UDP ポート 53 番( DNSクエリー )については Tor ネットワークに転送しています(より詳しいパラメータの説明はこちら)。

VirtualAddrNetwork 10.192.0.0/10
AutomapHostsSuffixes .onion,.exit
AutomapHostsOnResolve 1
TransPort 9090
TransListenAddress 10.0.0.1
DNSPort 53
DNSListenAddress 10.0.0.1


Tor サービスを再起動して設定を反映。

pi@raspberrypi ~ $ sudo /etc/init.d/tor restart
[ ok ] Stopping tor daemon...done.
[ ok ] Starting tor daemon...done.


さて Tor プロキシの設定は終わりましたが AP (無線 LAN アダプタ)で受信したクライアント・トラフィックを Tor プロキシに転送する必要がありますよね。

これには iptables を使います。 次のコマンドで wlan0 (無線 LAN アダプタ)で受信したトラフィックのうち、 DNS  トラフィック( UDP ポート 53 番)を自身の 53 番ポートへ、TCP トラフィックを 9090 番ポートへリダイレクトしましょう。

pi@raspberrypi ~ $ sudo iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j REDIRECT --to-ports 53
pi@raspberrypi ~ $ sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --syn -j REDIRECT --to-ports 9090
pi@raspberrypi ~ $ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
pi@raspberrypi ~ $ sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT


これで全てのサービスで設定と起動が完了。

my onion pi


Raspberry Pi で構築した Onion Pi によるインターネット・アクセス


クライアントの無線 LAN を有効にすると、先程 hostapd.conf で ssid に設定した AP 名が見えるはず( ここでは TorAP )。

wifi client -  list access point name


同じく hostapd.conf で wpa_passphrase 値として設定したパスワードで認証。

wifi client -  input access point password


お、認証成功。 AP に接続、DHCP サーバーから IP アドレスのリースにも成功したみたいです。

wifi client -  auth success


Tor ネットワーク経由でインターネットに接続出来ているかアクセス元 IP アドレスから、その大まかな所在地を教えてくれる http://www.iplocation.net/ へアクセスして確認してみましょうか。

wifi client -  iplocation


アクセス元 IP アドレスが海外にある Tor 出口ルーターになってますね。 後はこの上に流れるアプリケーションのデータもしっかり暗号化しておけば万全。


Raspberry Pi でのサービス自動起動設定


本格的に使うなら Raspberry Pi に自動起動設定を行なっておきましょう。

まず iptabels の転送設定を次のコマンドで一度ファイルに出力。
 
pi@raspberrypi ~ $ sudo sh -c "iptables-save > /etc/iptables.tor.ap"


hostapd は起動スクリプトを編集して、

pi@raspberrypi ~ $ sudo vi /etc/init.d/hostapd


DAEMON_CONF の値に用意した設定ファイルのパスを登録しておきます。

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON_SBIN=/usr/sbin/hostapd
DAEMON_DEFS=/etc/default/hostapd
DAEMON_CONF=/etc/hostapd/hostapd.conf
NAME=hostapd


さあ最後の仕上げ。  /etc/rc.local ファイルをエディタで開き、

pi@raspberrypi ~ $ sudo vi /etc/rc.local


isc-dhcp-server, hostapd, tor, iptables の起動コマンドを追加します。

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

# for Onion Pi
service isc-dhcp-server start
service hostapd start
service tor start
iptables-restore < /etc/iptables.tor.ap

exit 0

※ update-rc.d を使い rc.d から自動起動する方法では一連のサービス開始に失敗するケースがあった為、今回は rc.local ファイルを使っています。


うまく動かない場合は /var/log/tor/log ( tor )、/var/log/syslog ( isc-dhcp-server )、/var/log/daemon.log ( hostapd )を確認してみましょう。

Tor のようなツールは無闇矢鱈と使うものではありませんが、インターネットの自由と平等が脅かされたその時に貴方や信頼する友人を守る道具として覚えておきたいですね。
(因みに本家 Onion Pi は Raspberry Pi 、 無線 LAN アダプタ、 SD カード、ケース、ケーブルが付属して約 95 ドルだそうです)

それでは、より良い RPi ライフを。

 
Raspberry Pi ヒートシンク キット RasPi Heat Sink Kit
ModMyPi
売り上げランキング: 85,656


Posted by netbuffalo at 22:00│Comments(12)TrackBack(0)Linux | Raspberry Pi


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/4585792
この記事へのコメント
5
Googleで検索して辿り着きました、大変参考になる記事ありがとうございます。
Onion Piを作ってみたいと思うのですが既設で
[光回線ルーター]--[ワイヤレスアクセスポイント]
で利用しているので有線でOnion Piをワイヤレスアクセスポイントの前に接続して利用したいのですが
[光回線ルーター]--[Onion Pi]--[ワイヤレスアクセスポイント]
その際にOnion Piもしくは既設のワイヤレスアクセスポイントの設定を変える必要はあるのでしょうか?
Posted by Sato at 2014年10月16日 20:16
satoさん、ご相談ありがとうございます。

今直ぐに回答出来ないので少々お時間下さい。
Posted by netbuffalo at 2014年10月17日 00:04
Satoさん、ご希望の構成はOnion PiではWiFi-AP機能を使わず有線(--の部分)で接続して光ルーターと既設WiFi-APの間に入ることになるかと思います。
多分、既設のWiFi-APの有線側IPアドレスは光ルータから自動取得(DHCP)しているだけかと思いますので特に設定変更は必要無く動くかと思います。
Onion Piについては記事通りでは無く、有線LANアダプタ(参考Amazon出品アダプタ: http://goo.gl/FOfokl)を追加して2系統の有線LAN接続を使うことになると思います。
※この場合、記事中でeth0(有線0)、wlan0(無線0)となっている箇所がeth0(有線0)、eth1(有線1)に変わります。
Posted by netbuffalo at 2014年10月17日 15:31
5
大変お世話になっております。

さて、現在先生の御記載のとおりセットアップを行い、安定稼動にいたるまでになりましたのですが、クライアントPC側(この記事ですとwlan0側)からOnionPi本体へSSHでログインすることが出来ない状態となってしまいます。
iptablesの記載に足りない部分があるのかと思い、UDPとTCPの22番を53番を転送するのと同様に転送するよう記述を行いましたが、改善が見られません。

恐れ入りますが、いかような改善策がありますでしょうか、御教授を頂戴出来れば幸いに存じます。

なにとぞよろしくお願い申し上げます。
Posted by kei-m at 2015年05月02日 19:09
kei-mさん、ご質問ありがとうございます。
連休中で外出しており今すぐに試せないのですが、確認致しますので少々お時間を下さい!
僕もiptablesの設定で実現できると思います。
Posted by netbuffalo at 2015年05月02日 23:01
kei-mさん、Pi本体へのSSH接続の件、考えてみました(実機で試してはいないので間違っていたらすみません・・・)。
記事中に次のようなiptables設定があります。

$ sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --syn -j REDIRECT --to-ports 9090

これを次のように変えてみると Pi 本体に SSH 接続できないでしょうか?

$ sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --syn ! -d 10.0.0.1 -j REDIRECT --to-ports 9090

違いは ! -d 10.0.0.1 の部分で、Pi 本体の wlan0 に設定した IP アドレス(ここでは10.0.0.1)宛の TCP 接続要求は Tor ネットワークに転送しない、という意味になります(現状は Pi/wlan0 宛の TCP 接続要求が Tor ネットワークに転送されてしまっているのが問題のように見えます)。
Posted by netbuffalo at 2015年05月07日 19:16
5
お世話になります。

先生よりご教示いただきました内容を反映させましたら、無事、wlan0側からSSHで接続することが出来る様になりました!
ただ、一点注意すべきは、すでに生成したiptables.tor.apの内容について、以前の分をきちんと削除しておくことを忘れない様にしなければならない点でしょうか。
これで暫く唸ってました(w

お忙しい中、誠にありがとうございました!
Posted by kei-m at 2015年05月07日 22:56
kei-mさん、良かったです!
おやすみなさい。
#先生なんてとんでもないです(笑)
Posted by netbuffalo at 2015年05月08日 00:50
5
初めまして。

お世話になります。

記載されている通りに設定したのですが、win8でUSBWIFIアダプタ、android端末の2つで接続してみたのですが制限ありとでてWAN側に接続できないようです。

なにが原因かさっぱりわかりません

ご教授願えないでしょうか?

個人的にはNAT関係だと思うのですが・・・
Posted by ITEM at 2015年08月01日 18:33
ITEMさん、ご相談ありがとうございます。また返信が遅くなり申し訳ありませんでした。
ご相談頂いた問題ですが、無線LANへ接続した端末に有効なIPアドレスが割り当てられない場合に表示されることが多いようです(http://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=4910-4659)。
この原因として Raspberry Pi 上の DHCP サーバーがうまく動いていない(設定が適切でない)可能性があります。一度 DHCP サーバー設定をご確認頂くのが良いかもしれません。設定を確認し、問題が無いようでしたら一度 Raspberry Pi を再起動してみると如何でしょうか?
Raspberry Pi の設定に関しては辻 伸弘さんのブログを参考にされるのも良いと思います(http://n.pentest.ninja/?p=31087)
Posted by netbuffalo at 2015年08月03日 12:32
5
私も返信遅れてすみません。

返信ありがとうございます。

設定をくまなく見直した結果、rules.v4の "*nat" が "*mat" になっていました。適切な設定にしたところ問題なく接続できました。

単純なケアレスミスだったようです。

お手数をお掛けして申し訳ありません。

ありがとうございました!
Posted by ITEM at 2015年08月10日 16:47
ITEMさん、typoですね(僕も良くtypoします)!動いて良かったです。
Posted by netbuffalo at 2015年08月11日 15:02

コメントする

名前
URL
 
  絵文字