Saturday, March 7, 2015

VirtualBoxとHyper-VでL2TPv3/IPSEC

よ、ようやくそれなりの動作ができたぞ…。

tcpdumpしてARP Replyがどこで止まってるか調べてようやく分かった….。プロミスキャスモード、許すまじ。

  • VirtualBox プロミスキャスモード…全て許可
  • Hyper-V MACアドレスのスプーリングを有効にする

ハイパーバイザx2に上の設定をしておかないとホストを跨いだpingが完全に通らなくなる。それ以外は、既存ブログの情報を頼りになんとかなったんだよ….。後日まとめる疲れた。

VyOSの設定

VyOS1 on virtualbox, OSX

interfaces {
    bridge br0 {
        address 172.16.1.1/24
        aging 300
        hello-time 2
        max-age 20
        priority 0
        stp false
    }
    ethernet eth0 {
        address dhcp
        duplex auto
        hw-id 08:00:27:bf:73:20
        smp_affinity auto
        speed auto
    }
    ethernet eth1 {
        bridge-group {
            bridge br0
        }
        duplex auto
        hw-id 08:00:27:53:ca:af
        smp_affinity auto
        speed auto
    }
    l2tpv3 l2tpeth0 {
        bridge-group {
            bridge br0
        }
        destination-port 5000
        encapsulation udp
        local-ip 192.168.100.102
        peer-session-id 2000
        peer-tunnel-id 4000
        remote-ip 192.168.100.103
        session-id 1000
        source-port 5000
        tunnel-id 3000
    }
    loopback lo {
    }
}
service {
    ssh {
        port 22
    }
}
…(省略)…
vpn {
    ipsec {
        esp-group ESP-1W {
            compression disable
            lifetime 3600
            mode transport
            pfs enable
            proposal 1 {
                encryption aes256
                hash sha1
            }
            proposal 2 {
                encryption aes256
                hash sha1
            }
        }
        ike-group IKE-1W {
            ikev2-reauth no
            key-exchange ikev1
            lifetime 28800
            proposal 1 {
                encryption aes256
                hash sha1
            }
            proposal 2 {
                encryption aes256
                hash sha1
            }
        }
        ipsec-interfaces {
            interface eth0
        }
        nat-networks {
            allowed-network 0.0.0.0/0 {
            }
        }
        site-to-site {
            peer 192.168.100.103 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                connection-type initiate
                ike-group IKE-1W
                ikev2-reauth inherit
                local-address 192.168.100.102
                tunnel 1 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group ESP-1W
                    local {
                        port 5000
                    }
                    remote {
                        port 5000
                    }
                }
            }
        }
    }
}

VyOS2 on Hyper-V, Windows 8.1 Pro

interfaces {
    bridge br0 {
        address 172.16.1.10/24
    }
    ethernet eth2 {
        bridge-group {
            bridge br0
        }
        hw-id 00:15:5d:64:65:20
    }
    ethernet eth3 {
        address dhcp
        hw-id 00:15:5d:64:65:1f
    }
    l2tpv3 l2tpeth0 {
        bridge-group {
            bridge br0
        }
        destination-port 5000
        encapsulation udp
        local-ip 192.168.100.103
        peer-session-id 1000
        peer-tunnel-id 3000
        remote-ip 192.168.100.102
        session-id 2000
        source-port 5000
        tunnel-id 4000
    }
    loopback lo {
    }
}
service {
    ssh {
        port 22
    }
}
...(省略)...
vpn {
    ipsec {
        esp-group ESP-1W {
            compression disable
            lifetime 3600
            mode transport
            pfs enable
            proposal 1 {
                encryption aes256
                hash sha1
            }
        }
        ike-group IKE-1W {
            key-exchange ikev1
            lifetime 28800
            proposal 1 {
                dh-group 5
                encryption aes256
                hash sha1
            }
        }
        ipsec-interfaces {
            interface eth3
        }
        nat-networks {
            allowed-network 0.0.0.0/0 {
            }
        }
        site-to-site {
            peer 192.168.100.102 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                ike-group IKE-1W
                local-address 192.168.100.103
                tunnel 1 {
                    esp-group ESP-1W
                    local {
                        port 5000
                    }
                    remote {
                        port 5000
                    }
                }
            }
        }
    }
}

Friday, March 6, 2015

逆ポートフォワードを使ったprivate net上マシンへの接続

前回はL2TP/IPsecでVPN接続したけど、今回はあらかじめprivate network内のマシンからpublic network内のマシンにssh逆ポートフォワードしておけば、public network側のマシンのポートからprivate network内のマシンに入れるよねってのを実際にやってみたのだ。

ネットワーク構成

 [Surface3]    [ubuntu 14.04]
     | .102          | .104
----------------------- public:192.168.100.0/24
  | .101    | .103
[iMac]    [VyOS]
  | .200    | .1
---------------------- private:172.16.1.0/24
       | .201
     [RPi]

[XXX]...マシンの名前
  • ubuntu 14.04はSurface3上の仮想マシン(HyperV ブリッジ接続)
  • VyOSはiMac上の仮想マシン(Virtualbox ブリッジ接続 x 2)
  • private -> public はNATで出ていく
  • public側のルータはWiMaxルータだよ

と、構成上はともかく、実際のネットワーク接続は物理/仮想マシンが入り乱れたカオスな状態。

逆ポートフォワード

で、どういうssh接続をしたいかというと、あらかじめRPi(172.17.6.201:22)からubuntu 14.04(192.168.100.104:10022)に逆ポートフォワードしておき、Surface3(192.168.100.102)からubutntu 14.04の10022番にssh接続すると、RPiに接続するという感じ。

[RPi]--------[ubuntu 14.04]-----[surface3]
  |_______________↑ ↑______________|
    22 -> 10022          ssh -p 10022 pi@192.168.100.104

デフォルトのsshdの設定だと、逆ポートフォワードした時にIPを127.0.0.1(localhost)にバインドしちゃうから、これを0.0.0.0(任意のIP)にバインドするよう設定変更する。

ubuntuの/etc/ssh/sshd_config:

...
# 追加
Match User yukaary
    GatewayPorts yes

そんで設定を反映。

$ sudo service reload ssh

RPiにiMacからsshログインして以下のコマンドを実行。

ssh -f -N -R 10022:127.0.0.1:22 yukaary@192.168.100.104
yukaary@192.168.100.104's password: <ubuntu 14.04のパスワード>

これで完了。ubuntu 14.04側でTCPポートの状態を見てみる。

yukaary@yukaary-ubuntu-ein:~$ sudo netstat -tapn
[sudo] password for yukaary: 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:10022           0.0.0.0:*               LISTEN
...(省略)...   

よしよし。ちゃんと待ち受けているね。ssh接続するとどうなるのか!!

$ ssh -p 10022 pi@192.168.100.104
Linux raspberrypi 3.18.7-v7+ #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Mar  6 13:43:33 2015 from localhost
pi@raspberrypi ~ $ 

192.168.100.104:10022 --> 172.17.6.201:22という感じに繋がったのです。L2TP/IPsecに比べると、10022番しか空いてないから自由度は落ちるわけですがー。単に別ホスト(組織)の内部ネットワークに入りたかったら、こういう方法もあるということだったので試してみた。

Sunday, March 1, 2015

VyOSを使ってvpn(l2tp/ipsec)を設定

前記事の続き。VyOSを使って2台のホストマシン(iMac, Surface3)のprivate networkを連結させ、あわよくばその上にvxlanを複数定義するのが最終目的。

まずは前座?としてL2TP over IPSECをやってみる。参考記事

vyos@vyos# configure
vyos@vyos# edit vpn ipsec
vyos@vyos# set ipsec-interface interface eth0
vyos@vyos# set nat-traversal enable
vyos@vyos# set nat-networks allowed-network 0.0.0.0/0
vyos@vyos# commit
VPN Warning: IPSec configured but no site-to-site peers or l2tp remote-users configured

IPSecは設定したけどsite-to-siteのピアを設定していないか、l2tpのリモートユーザを設定していないよって警告が。これだけだと特に意味ないよってことかな。

続きましてl2tpの設定。

一度馬鹿な設定をしてl2tpの設定をクリアするはめにorz delete vpn l2tpという形でshow configurationで表示される階層に従って消したい要素を指定すれば消してくれるみたい。

vyos@vyos:~$ configure
vyos@vyos# edit vpn l2tp remote-access
vyos@vyos# set ipsec-settings authentication mode pre-shared-secret
vyos@vyos# set ipsec-settings authentication pre-shared-secret makimaki
vyos@vyos# set authentication mode local
vyos@vyos# set authentication local-users username yukaary password craft
vyos@vyos# set outside-address 192.168.100.103   
vyos@vyos# set client-ip-pool start 172.16.1.100
vyos@vyos# set client-ip-pool stop 172.16.1.110
vyos@vyos# commit
vyos@vyos# save

これで設定できたはず。L2スイッチで繋がっていないSurface3から、前回iMacを中心に構成したprivate-net上のraspberry pi(172.17.6.201)に繋がれば、VPNに接続できたと思っていいかな。

この時点でホストマシンのOSXからはVPN接続設定を作れば、接続することができた。ネットワークデバイスを表示するとこんな感じになる。

yukaarybox:~ yukaary$ ifconfig
...
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether 0a:30:62:53:0e:c5 
    media: autoselect
    status: active
...
ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
    inet 172.16.1.101 --> 10.255.255.0 netmask 0xffffff00 

Surfacre 3 (windows 8.1)のほうは、なんでか繋がらない。VyOSのログを見ると、繋ごうと努力はしているみたいだが…。

ログ:

Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: responding to Main Mode from unknown peer 192.168.100.101
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [AES_CBC (256), HMAC_SHA1, ECP_384] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [AES_CBC (128), HMAC_SHA1, ECP_256] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [AES_CBC (256), HMAC_SHA1, MODP_2048] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Oakley Transform [3DES_CBC (192), HMAC_SHA1, MODP_2048] refused due to strict flag
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: NAT-Traversal: Result using RFC 3947: no NAT detected
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: Peer ID is ID_IPV4_ADDR: '192.168.100.101'
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: sent MR3, ISAKMP SA established
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #24: responding to Quick Mode
Mar  1 11:07:20 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #24: IPsec SA established {ESP=>0x232363ae <0xc03d70aa}
Mar  1 11:07:22 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: received Delete SA(0x232363ae) payload: deleting IPSEC State #24
Mar  1 11:07:22 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101 #23: received Delete SA payload: deleting ISAKMP State #23
Mar  1 11:07:22 vyos pluto[4240]: "remote-access-mac-zzz"[11] 192.168.100.101: deleting connection "remote-access-mac-zzz" instance with peer 192.168.100.101 {isakmp=#0/ipsec=#0}

192.168.100.101がSurface 3のIP。refused due to ...ってメッセージと、その時に記載されている暗号化方式っぽいのが気になる木…。

色々原因を探っていたら、それIPSECの設定が足りてないよって記事を見つけた。これ

You should provide the standard that you would like to the encryption proposals (aes128, aes256 or 3des), and the hashing function preferred (md5, sha1, sha256, sha384 and the newest sha512).
You should use what you would like as the encryption standard, now VyOS

「利用可能な暗号化方式を提供しないといけないよ!あとお好みのハッシュ関数もね!」みたいな感じ? IPSECを使った通信をするときに、利用可能な暗号化方式をVyOSが接続側に教えてあげないといけないとか、そういう事だろうか。この辺は、まだ知識無いからあとでゆっくり調べるとして、まずは書いてある通りにIPSECの設定を追加してみるよ。

vyos@vyos:~$ configure
vyos@vyos# set vpn ipsec esp-group ESP-1W compression disable         
vyos@vyos# set vpn ipsec esp-group ESP-1W lifetime 3600      
vyos@vyos# set vpn ipsec esp-group ESP-1W mode tunnel  
vyos@vyos# set vpn ipsec esp-group ESP-1W pfs enable 
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 1 encryption aes256
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 1 hash sha1
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 2 encryption aes256
vyos@vyos# set vpn ipsec esp-group ESP-1W proposal 2 hash sha1
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 1 encryption aes256
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 1 hash sha1
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 2 encryption aes256
vyos@vyos# set vpn ipsec ike-group IKE-1W proposal 2 hash sha1
vyos@vyos# set vpn ipsec ike-group IKE-1W key-exchange ikev1
vyos@vyos# set vpn ipsec ike-group IKE-1W lifetime 28800    
vyos@vyos# commit
vyos@vyos# save
vyos@vyos# exit

続いてWindows 8.1側。(なんでこんな面倒くさいんだ!)

コントロールパネル:ネットワークと共有センター:新しい接続またはネットワークのセットアップを開いて、「職場に接続します」を選択、次の画面で「インターネット接続(VPN)を利用します」を選ぶ。VPNへの接続先gatewayにIP(今回の場合、192.168.100.103)を打ち込むと、なんかデフォルト設定で接続しようと試みる…が上手くいかない。

このあと、「ネットワーク接続」を開くと「VPN接続」というアイテムが追加されているので、そいつのプロパティを開く。

「セキュリティ」タブの以下の項目を変更する。

  • VPNの種類:IPSecを利用したレイヤー2トンネリングプロトコル(L2TP/IPSec)
  • 上の詳細設定を開いて「認証に事前共有キーを使う」に変更
    • パスワードは今回の場合は「makimaki」
  • データの暗号化:暗号化が必要(サーバーが拒否する場合は切断します)
  • 認証:「次のプロトコルを許可する」に変更
    • その下の項目をとりあえず全チェック

ここまでやった後に、ネットワーク(画面右端に出現する現在の接続情報と接続先候補のメニュー)を開いて、「接続:VPN接続」を選択、最初はアカウントとパスワードを聞かれる。VyOS上に登録したやつを入力して接続をリクエストすると…繋がった!

2回目以降はアカウントとパスワードを記憶してくれている模様

ipconfigすると「PPPアダプター VPN接続」って名前でIPをもらえていた。やったぜ。

最終確認

VPN接続状態で、iMACと物理L2スイッチ(ハブ)で繋がっているRaspberryPi(private-net)に接続できるか確認。

$ ssh pi@172.16.1.201
<このあと、普通に接続できましたー!>