Raspberry PiでモバイルVPNルータを作りたい

やりたいこと

  • WiFi APとクライアント(station)に同時になる
  • station側のIF経由でVPNトンネルを掘る
  • AP側のIFに接続した機器がVPN先のネットワークに接続できる

資材

  • Raspberry Pi Model A+
  • GW-USNANO2A : rtl8192cu
    • iwコマンドが使えない(nl80211 not found.)デバイスだとvirtual interfaceが作れないような気がする
  • WLI-UC-GNM : rt2800usb
    • 結構熱くなる
    • 1個でstationとAPを同時にやらせたかったんだがうまくいかず断念(参考:このへん)
  • GW-USValue-EZ

OSセットアップ

ソフトウェア

  • hostapd
    • rtl8192cuに対応したものを別途ダウンロードして使用
  • OpenVPN
    • 自宅のVPNサーバ(VyOS)にL2 VPN接続する
  • dnsmasq
    • station側のWLANアダプタに接続してきたクライアントにDHCPリースする
  • iptables
    • IP masqueradeとか

構成

  • WAN側はUSB有線LANアダプタ(eth0),USB接続モバイルルータ(eth1),USB無線LANアダプタ(wlan1)のいずれか
    • iptablesでIP masqueradeする
  • LAN側はUSB無線LANアダプタ(wlan0)
  • OpenVPNのtap0とwlan0をブリッジする
  • wlan0側でもDHCPサーバを動かしてtap0の先と同じネットワークアドレスのIPアドレスをリースする

GW-USNANO2AでWiFiが繋がらなくなる問題

参考


有線編

やりたいこと

  • 自宅LANを外出先にL2で延長したい
    • 家LAN — [OpenVPN client] — [OpenVPN server] — [OpenVPN client] — 外LAN

資材

  • Raspberry Pi Model B (256MB)
  • L-02C + IIJmioのSIM
    • あらかじめ AT%USBMODEM=0 しておく
  • セルフパワーなUSBハブ
    • USBポートへの電源供給に不安がなさそうなModel B+なら不要かも
  • OpenVPNサーバ(VyOS on さくらのVPS)
    • client-to-client を許可しておく
  • OpenVPNクライアント(自宅側 VyOS on KVM)

設定

  • OpenVPNサーバはあらかじめtapで接続できるようにしておく
    • easy-rsa2で証明書を用意しておく

OpenVPNクライアント

  • up スクリプトでtap0とeth0をブリッジする
  • /etc/openvpn/client.conf

    client
    proto udp
    nobind
    verb 3
    dev-type tap
    dev tap0
    cert hogehoge.crt
    key hogehoge.key
    ca ca.crt
    remote 0.0.0.0 0
    
    script-security 2
    up "/etc/openvpn/up br0 eth0"
    down "/etc/openvpn/down br0 eth0"
  • /etc/openvpn/up

    #!/bin/sh
    
    BRDEV=$1
    ETHDEV=$2
    TAPDEV=$3
    
    /sbin/brctl addif $BRDEV $TAPDEV
    /sbin/ifconfig $TAPDEV hw ether xx:xx:xx:xx:xx:xx up
    #/sbin/ifconfig $ETHDEV promisc
    /sbin/ifconfig $TAPDEV 
    exit 0
  • /etc/openvpn/down

    #!/bin/sh
    
    BRDEV=$1
    ETHDEV=$2
    TAPDEV=$3
    
    /sbin/brctl delif $BRDEV $TAPDEV
    #/sbin/ifconfig $ETHDEV -promisc
    
    exit 0
  • クライアント間のarpがうまくいってない雰囲気
    • 再接続されたときにtap0のMACが変わっちゃうからかも
    • up スクリプトで適当なMACアドレスを設定するようにした

参考