2016年06月08日

Raspbeey Piを有線NATルーターとする

3G/USBドングルをRaspberry Piに直接挿して、ルーター機能を持たせれば、VPN-clientあるいはbridgeとNATルーターさらに、簡易なロガーも兼ねることができる。ルーターを別置しなくてもいい点がシンプルでよい。VPNクライアントとして利用するので、DHCPはVPNサーバー側に設置し、クライアント側には設置しない。クライアント側のIPアドレスは全て固定する。なお、3G/USBドングルは、L-05Aを使用するものとする。当然、isc-dhcp-serverやhostapdは不要。SIMは、トーンモバイル(旧DTI)のserverman SIM LTEを利用。

(1)IPアドレスを固定する。
最新のRaspbian/Jessieのデフォルト状態では、LAN内にDHCPサーバーがあると、IPアドレスを固定していても、SecondaryのIPアドレスが自動的に割り付けられる。SecondaryのIPアドレスが重複して付与されてもさほど問題ではないが、この対策は下記の通り
sudo nano /etc/dhcp/dhclient-exit-hooks.d/rfc3442-classless-routes
を編集する。
8行目の
RUN="yes"

RUN="no"
とする。
これで、強制割付されなくなる。設定後再起動。

(2)必要なパッケージ導入
sudo apt-get install eject wvdial iptables-persistent

(3)wvdial.conf編集
sudo nano /etc/wvdial.conf
を下記の内容に修正する。

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2
Init3 = AT+CGDCONT=1,"IP","dream.jp"
Dial Attempts = 3
Modem Type = Analog Modem
Dial Command = ATD
Stupid Mode = yes
Baud = 460800
New PPPD = yes
Modem = /dev/ttyACM0
ISDN = 0
Phone = *99***1#
APN = dream.jp
Username = user@dream.jp
Password = dti
Carrier Check = no
Auto DNS = 1
Check Def Route = 1

(4)sysctl.conf編集
sudo nano /etc/sysctl.conf
を修正する。
28行目付近
net.ipv4.ip_forward=1
(#を取る)
sudo reboot
または
sudo sysctl -p
で反映させる。

(5)iptablesを設定
次のコマンド画面に打ち込む
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo iptables -A FORWARD -i ppp0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i br0 -o ppp0 -j ACCEPT

iptables-persistentへ保管する。
実際には、
/etc/iptables/rules.v4に保管される
su
でrootになって
iptables-save > /etc/iptables/rules.v4
exit
でrootを脱する。
再起動後には、このiptablesの設定が自動的に反映するようになる。

(6)/etc/network/interfacesの編集
Jessieでは、eth0など実態のあるNICのIPアドレス固定は、/etc/dhcpcd.confに記述するが、br0のような仮想NICなどは、従来通りinterfacesに記載する。
-------
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.190.150
netmask 255.255.255.0
network 192.168.190.0
broadcast 192.168.190.255
gateway 192.168.190.150
dns-nameservers 192.168.190.150 192.168.190.1 202.231.208.73 202.231.208.74 8.8.8.8 8.8.4.4
bridge_ports eth0
bridge_maxwait 10
--------
これで、起動時に、br0とeth0がブリッジした状態で立ち上がるようになる。

(7)vpnclientのアカウント作成ほか
softether vpnの接続アカウントの作成などが整備された状態で、
sudo /usr/local/vpnclient/vpnclient start
sudo /usr/local/vpnclient/vpncmd /client localhost /cmd accountconnect (接続名)
これで仮想NICがvpnサーバーに接続される。仮想nicには、ipアドレスは付与しない。
sudo /sbin/brctl addif br0 vpn_(仮想nic名)
でbr0と仮想NICをブリッジさせる。
これで、eth0と仮想nicがbr0を介して接続された。
bridge接続もほぼ同じ方法となる。
ただし、client接続の場合は、raspbery pi以外2台までeth0に接続したLAN機器がvpnサーバーに接続できるのが、bridge接続都の違いである。
実際には、スクリプト化して、起動時に自動でvpn接続するように設定する。

(8)ppp接続のスクリプト

スクリプト名は任意だが、下記のようなスクリプトを用意する。
書き込み後実行権限を付与する。
----
#!/bin/sh

br0_address="192.168.190.150"
echo "ppp_connect_log\n" > /home/tri/testppp

ifconfig | grep 'br0' > /dev/null 2>&1
if [ $? -eq 0 ] ; then
ip_br0=`LANG=C ifconfig | grep 'inet addr' | grep -v 169 | grep -v 127 | grep -v 100 | awk '{print $2;}' | cut -d: -f2`
test $ip_br0 = $br0_address
if [ $? -ne 0 ] ; then
ifconfig br0 $br0_address
fi
while :
do

lsusb | grep '1004:6124' > /dev/null 2>&1
if [ $? -eq 0 ] ; then
wvdial & 2>&1
sleep 10
fi

lsusb | grep '1004:613a' > /dev/null 2>&1
sleep 1
eject /dev/sr0 > /dev/null 2>&1
sleep 5
wvdial & 2>&1
sleep 10
fi
count=0

while :
do
loop=0
ifconfig | grep 'ppp0' > /dev/null 2>&1
if [ $? -eq 0 ] ; then
ip_ppp0=`ip addr list ppp0 | grep 'inet' | grep -v 169 | grep -v 127 | awk '{print $2;}' | cut -d: -f2`
route add default gw $ip_ppp0 dev ppp0
sleep 2
while :
do
loop=0
ping -c 5 -n -w 10 8.8.8.8 > /dev/null 2>&1
if [ $? -ne 0 ]; then
lsusb | grep '1004:6124' > /dev/null 2>&1
if [ $? -eq 0 ]; then
loop=1
break
else
lsusb | grep '1004:613a' > /dev/null 2>&1
if [ $? -eq 0 ]; then
loop=2
break
else
loop=3
break
fi
fi
fi
sleep 15
done
else
sleep 15
count=$(($count + 1))
if [ $count -gt 2 ] ; then
loop=1
fi
fi

if [ $loop -eq 1 ] ; then
wvdial & 2>&1
sleep 10
fi
if [ $loop -eq 2 ] ; then
eject /dev/sr0 > /dev/null 2>&1
sleep 5
wvdial & 2>&1
sleep 10
fi
if [ $loop -eq 3 ] ; then
sleep 15
break
fi
done
sleep 5
done
else
reboot
fi
exit 0
-----------

かなり書き込んだ。実際にppp接続させようとすると、いろいろなエラーが発生したので、これらのエラーが発生しても、pppを成功させるために工夫した。

(9) (8)のスクリプトをsupervisorに登録する。

(8)のスクリプトは無限ループになるので、これをデーモン化しておく。

以上で、DHCP機能のない有線ルータがraspberry piの中につくることができる。
iptablesの設定は非常に貧弱だが、トーンモバイルから付与されるIPアドレスは
100.で始まるシェアードIP(プライベートIP)なので、WAN側から直接アクセスされることはまずもってない。
だから、VPNを構築して、LANに取り込むことで、アクセスを可能とするというわけである。






posted by bmasterna at 14:58| Comment(2) | 遠隔監視装置