VPN's archives

携帯からL2TP/IPsecでvpn接続

in VPN, vyatta
by ginriki | 6 月 4th, 2012 

携帯にxperia acroを使ってるんですが、自宅PC(NASとか)へのアクセスのために、pptpを使って
vpn接続した場合、十数分ぐらいで切断されてしまいます。

どうも、androidにpptpバグがあるっぽい1ので、pptpの代わりにL2TP/IPsecを使うことにしました。

1万以下で買えるルータでL2TP/IPsec使えるものがなさそうなので、
余っていた昔のノートPC(Let’s note T2)にソフトウェアルータ(vyatta)をインストールして、
ネットワーク組みました。記録のため、ここに書いときます。

vyattaのネットワーク構成


  • eth2からpppoeでプロバイダに接続
  • eth0から自宅内LANに接続
  • zoneをinside, local-zone(=vyatta), outsideに分けてfirewall設定
  • outside -> local-zoneの通信は、ssh, L2TP/IPsecのみ許可
  • DDNS更新サービスを起動することで、グローバルIPが変わっても同一ドメイン名でoutsideからアクセスできるようにする(事前にDynDNSにドメイン作った)
  • DNSは、Google Public DNS(8.8.8.8, 8.8.4.4)

ネットワークを図にすると以下の通りです。
netfigure


xperia acroから、グローバルIP(私はapnにmopera使ってます)でL2TP/IPsec vpn接続&通信はできました。とりあえず動いたから満足した。

vyattaの設定として、nat-traversal有効(かつ、udp 4500開放)にしてあるので、たぶんspモード(ローカルIP付与されたxperia acro)でもつながるでしょう。

設定内容は以下の通り。MACとか見せたくないので、[dummy]に編集してあります。

$ show configuration
firewall {
    all-ping enable
    name inside_to_vyatta {
        default-action drop
        rule 1 {
            action accept
            protocol all
        }
    }
    name outside_to_vyatta {
        default-action drop
        rule 1 {
            action accept
            protocol all
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action accept
            destination {
                port ssh
            }
            protocol tcp
            state {
                new enable
            }
        }
        rule 30 {
            action accept
            destination {
                port 500
            }
            protocol udp
            state {
                new enable
            }
        }
        rule 40 {
            action accept
            destination {
                port 4500
            }
            protocol udp
            state {
                new enable
            }
        }
        rule 50 {
            action accept
            destination {
                port 1701
            }
            ipsec {
                match-ipsec
            }
            protocol udp
            state {
                new enable
            }
        }
        rule 60 {
            action accept
            protocol esp
            state {
                new enable
            }
        }
    }
    name to_inside {
        default-action drop
        rule 1 {
            action accept
            protocol all
            state {
                established enable
                related enable
            }
        }
    }
    name to_outside {
        default-action drop
        rule 1 {
            action accept
            protocol all
        }
    }
    name vyatta_to_inside {
        default-action drop
        rule 1 {
            action accept
            protocol all
        }
    }
}
interfaces {
    ethernet eth0 {
        address 192.168.1.1/24
        description INSIDE
        duplex auto
        hw-id [dummy]
        smp_affinity auto
        speed auto
    }
    ethernet eth1 {
        duplex auto
        hw-id [dummy]
        smp_affinity auto
        speed auto
    }
    ethernet eth2 {
        description OUTSIDE
        duplex auto
        hw-id [dummy]
        pppoe 0 {
            default-route auto
            mtu 1492
            name-server auto
            password ****************
            user-id [dummy]
        }
        smp_affinity auto
        speed auto
    }
    loopback lo {
    }
}
service {
    dns {
        dynamic {
            interface pppoe0 {
                service dyndns {
                    host-name [dummy]
                    login [dummy]
                    password ****************
                }
            }
        }
        forwarding {
            cache-size 150
            listen-on eth0
            system
        }
    }
    nat {
        rule 1 {
            outbound-interface pppoe0
            type masquerade
        }
    }
    ssh {
        disable-password-authentication
        port 22
        protocol-version v2
    }
}
system {
    config-management {
        commit-revisions 20
    }
    console {
    }
    host-name vyatta
    login {
        user ssh-forward {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
                public-keys [dummy] {
                    key ****************
                    type ssh-dss
                }
            }
            level operator
        }
        user vyatta {
            authentication {
                encrypted-password ****************
                public-keys [dummy] {
                    key ****************
                    type ssh-dss
                }
            }
            level admin
        }
    }
    name-server 8.8.8.8
    name-server 8.8.4.4
    ntp {
        server 0.vyatta.pool.ntp.org {
        }
        server 1.vyatta.pool.ntp.org {
        }
        server 2.vyatta.pool.ntp.org {
        }
    }
    package {
        auto-sync 1
        repository community {
            components main
            distribution stable
            password ****************
            url http://packages.vyatta.com/vyatta
            username ""
        }
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone GMT
}
vpn {
    ipsec {
        esp-group ESP-GW {
            compression disable
            lifetime 3600
            mode tunnel
            pfs enable
            proposal 1 {
                encryption 3des
                hash sha1
            }
            proposal 2 {
                encryption aes128
                hash sha1
            }
        }
        ike-group IKE-GW {
            lifetime 28800
            proposal 1 {
                dh-group 2
                encryption 3des
                hash sha1
            }
            proposal 2 {
                dh-group 2
                encryption aes128
                hash sha1
            }
        }
        ipsec-interfaces {
            interface pppoe0
        }
        logging {
            log-modes all
        }
        nat-networks {
            allowed-network 0.0.0.0/0 {
                exclude 192.168.1.0/24
            }
        }
        nat-traversal enable
        site-to-site {
        }
    }
    l2tp {
        remote-access {
            authentication {
                local-users {
                    username [dummy] {
                        password ****************
                    }
                }
                mode local
            }
            client-ip-pool {
                start 192.168.1.90
                stop 192.168.1.99
            }
            dns-servers {
                server-1 8.8.8.8
            }
            ipsec-settings {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                ike-lifetime 3600
            }
            mtu 1280
            outside-address [dummy]
            outside-nexthop [dummy]
        }
    }
}
zone-policy {
    zone inside {
        from outside {
            firewall {
                name to_inside
            }
        }
        from vyatta {
            firewall {
                name vyatta_to_inside
            }
        }
        interface eth0
        interface l2tp+
    }
    zone outside {
        from inside {
            firewall {
                name to_outside
            }
        }
        from vyatta {
            firewall {
                name to_outside
            }
        }
        interface eth2
        interface pppoe0
    }
    zone vyatta {
        from inside {
            firewall {
                name inside_to_vyatta
            }
        }
        from outside {
            firewall {
                name outside_to_vyatta
            }
        }
        local-zone
    }
}
  1. android 2.3.7だと直ったようですが手元のxperia acroは、2.3.3・・・。次に携帯買うときはspモードかもしれないし、その場合pptpサポートされませんし・・・。 []

VPNサーバ(PPTPサーバ)付きのルータ設定・調査メモ

in PPTP, VPN
by ginriki | 1 月 17th, 2011 

少し前に、ルータ(WZR-HP-AG300H)を買って自宅外からVPN接続してます。設定がWebブラウザから簡単にできますし、VPNサーバ用のマシンをルータと別に用意する必要もないので、結構便利です。

私の主な使い方は、

  • Android端末からVPN接続し、DAAP Media Playerで自宅のメディアサーバー1の曲を聴く。
  • PCからVPN接続+Wake on Lan(WoL)2で、自宅サーバを立ち上げてログイン。

の2つです。

せっかくなので、設定メモを残しておきます。

VPNサーバ/クライアントの設定


このルータのVPNサーバの方式はPPTPです。設定手順はルータのマニュアルが詳しいです。

ちなみに、私はDDNSにDynDNSを使ってます。

マニュアルに見当たらなかった注意点として、クライアント側のPCに付与されるIPがプライベートIPで、クライアント側ルータでNATが行われる場合は、クライアント側ルータのPPTP(VPN)パススルー/マルチパススルーを有効にしないと、PPTPサーバ・クライアント間で接続できない点があります。

最近のルータなら、たいていルータの設定項目で有効にできます。ルータによっては、GREパケットを通すようにNAT設定する必要があったりします。3

ただ、パススルー設定ができない環境(公衆無線LANとか)から自宅マシンにつなぎたいときもあります。
私の場合、Android端末から3G回線でVPN接続→WoL実施→マシン起動を行った上で、手元のPCから起動したマシンにsshログイン(とポートフォワーディング)で対応してます。

ポート(サービス)チェック処理をtcpdumpして見る



無事VPN接続したあと、http://<ルータのプライベートIP>/hosts.html にアクセスすると、WoLやhttpサーバなどのサービス一覧が表示されます。

httpサーバが動いているかどうかのポートチェックが、どのタイミングで行われるのか気になったので、tcpdumpでLAN内を監視したところ、以下に対してチェックしているようです。。

  • ブロードキャストやルータ宛てのARP Requestを送った送り元IP
  • ブロードキャストやルータ宛てのARP Replyを送った送り元IP

用は、ルータに届いたARPの送り元IPに対して、ARPが届いた直後にポートチェックしているようです

以下は、あるマシン(desktop-ubuntu.local)がプロードキャストARP(Target IP:192.168.1.7)を送った時のtcpdump出力(をちょっと省略したもの)です。ルータ(192.168.1.1)がftpやwwwなどのポートをチェックしているのがわかります。

ethertype ARP (0x0806), length 42: Request who-has 192.168.1.7 (Broadcast) tell desktop-ubuntu.local
ethertype IPv4 (0x0800), length 74: 192.168.1.1.1584 > desktop-ubuntu.local.ftp
ethertype IPv4 (0x0800), length 74: 192.168.1.1.1183 > desktop-ubuntu.local.www
ethertype ARP (0x0806), length 60: Reply 192.168.1.7 is-at aa:bb:cc:cf:80:99
ethertype IPv4 (0x0800), length 74: 192.168.1.1.1943 > desktop-ubuntu.local.8000
ethertype IPv4 (0x0800), length 74: 192.168.1.1.3765 > desktop-ubuntu.local.http-alt
ethertype IPv4 (0x0800), length 74: 192.168.1.1.3896 > desktop-ubuntu.local.3389
ethertype IPv4 (0x0800), length 92: 192.168.1.1.1141 > desktop-ubuntu.local.netbios-ns: NBT UDP PACKET(137)

メモは、これで終わりです。
VPN越しで自宅に溜めこんだ電子書籍を見るとかにも使えそうなので、色々試す価値がありそうです。

VPN越しで動画を見ようとしている方もいらっしゃいました。4

BUFFALO 節電+USBポート搭載 11n/a&n/g対応 ハイパワー 無線LANルーター AirStation WZR-HP-AG300H BUFFALO 節電+USBポート搭載 11n/a&n/g対応 ハイパワー 無線LANルーター AirStation WZR-HP-AG300H
レビューを見る
欲しいものリストに追加
価格:11300円 在庫あり。powered by Amazon.co.jp
  1. WZR-HP-AG300H自体にメディアサーバ機能があります(別途USB HDD必須)。私は別のNASをメディアサーバにしてるのでよくわかりません。 []
  2. WoLもWebブラウザからボタン一つで実施できます。なお、WoLを使う場合、起動対象マシンのBIOS設定などでWoL(Lan Bootとも言う)を有効にする必要があります。 []
  3. GREパケットを通す=PPTPパススルー有効という理解で良いはず。マルチパススルーする場合は、もっと細かい処理が行われます。詳しく知りたい人は、以下ページの第4回 「PPTPを使用したリモートアクセスVPNの仕組み」を見てください。http://www.tatsuyababa.com/NW-VPN/ []
  4. 私の場合、slingboxでネット越しにテレビを見る環境を構築済みなので、それで満足してます。
    []

ブログで紹介した商品

  • Image of デバッガの理論と実装 (ASCII SOFTWARE SCIENCE Language)