Akira's Tech Notes

Java/JVM | GNU/Linux | Emacs/Lisp | 知的好奇心駆動

header-icon
ネイティブでない日本語で思い付くことや気になることをダラダラ書く、体裁とかは気にしない。読みづらいと感じた時に随時更新する。

[検証]SSHトンネル機能でVPN環境の構築

友人に自宅のLAN内のコンテンツを共有するため、VPNについて検証しました。 自宅のルータはYamahaのRTX810です。このルータのVPN機能を使えば簡単に出来てしまうので面 白くないと思って、敢えてSSHのトンネル機能を使って0円VPN環境を構築してみた。

更に難易度を上げて、自宅WAN側のグローバルIPを公開せずにAmazonEC2インスタンスをVPN経路 に挟むことにしました。

通信経路イメージは以下のようになります。

  • 区間1、友人PCとAmazonEC2間SSHトンネリングして通信する
  • 区間2、AmazonEC2間とRaspberry Pi間SSHトンネリングして通信する
  • AmazonEC2インスタンスにて2つのSSHトンネルをethernet bridgeかiptablesによる結び付ける
  • 区間2のRaspberry PiにてProxy ARPかiptablesによるLANとの通信経路を制御する
+-------------区間1---------+      +-------------区間2-----------------------+

                                                        ________________________
                                                       /      自宅LAN
                                                      |
                                                     /
                                __                  /
                            ___/  \_               |
+--------------+          _/        \__           / (DNAT)         +---------------+
|              |         /  (sshd)     \          +---------+      |   (sshd)      |
|  Tomodati    +--ssh--- |  Amazon EC2  ---ssh----+ RTX810  +------+ Raspberry Pi  |
|              |         \_           __/         +---------+      |               |
+--------------+           \__     __/            \                +---------------+
                              \___/                |
                                                    \
                                                     \
                                                      |
                                                       \________________________

1 SSHトンネリング

方式 通信イメージ broadcast
ppp over ssh トンネルの両端に仮想ダイヤルアップPPPで結び付ける
TUNデバイス トンネルの両端に仮想TUNデバイスで結び付ける
TAPデバイス トンネルの両端に仮想tapデバイスで結び付ける
  • Point-to-Point TUN DeviceTUN
    • TUNデバイスはLayer3をエミュレートし、IPフレームを転送します。
    • IP-in-IP トンネリング (Point-to-Point: PPP通信と似ている)
    • GRE トンネリング (※未確認)
  • Ethernet TAP Device
    • TAPデバイスはLayer2(Ethernet)をエミュレートし、Ethernetフレームを転送します。

TUNデバイスとTAPデバイス利用するに当たって、 tun というカーネルモジュールが必要とし ます。 SSHトンネリング時に自動的にロードしてくれます。

[akira@tomodati ~]$ modinfo tun
filename:       /lib/modules/3.15.2-1-ARCH/kernel/drivers/net/tun.ko.gz
alias:          devname:net/tun
alias:          char-major-10-200
license:        GPL
author:         (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
description:    Universal TUN/TAP device driver
depends:
intree:         Y
vermagic:       3.15.2-1-ARCH SMP preempt mod_unload modversions
[akira@tomodati ~]$

tun カーネルモジュールのデバイス初期化処理のコード(カーネルバージョン:3.12)

/* Initialize net device. */
static void tun_net_init(struct net_device *dev)
{
    struct tun_struct *tun = netdev_priv(dev);

    switch (tun->flags & TUN_TYPE_MASK) {
    case TUN_TUN_DEV:
        dev->netdev_ops = &tun_netdev_ops;

        /* Point-to-Point TUN Device */
        dev->hard_header_len = 0;
        dev->addr_len = 0;
        dev->mtu = 1500;

        /* Zero header length */
        dev->type = ARPHRD_NONE;
        dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
        dev->tx_queue_len = TUN_READQ_SIZE;  /* We prefer our own queue length */
        break;

    case TUN_TAP_DEV:
        dev->netdev_ops = &tap_netdev_ops;
        /* Ethernet TAP Device */
        ether_setup(dev);
        dev->priv_flags &= ~IFF_TX_SKB_SHARING;
        dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;

        eth_hw_addr_random(dev);

        dev->tx_queue_len = TUN_READQ_SIZE;  /* We prefer our own queue length */
        break;
    }
}

TUNデバイスのIP-in-IP方式とppp方式どちらもPPPプロトコルを使ってSSHトンネル両端間で通信 するため、本検証ではppp方式を検証対象外としました。

2 TUNデバイス利用方式

TUNデバイスでトンネリングする、iptablesとルーティングテーブルで交通を整理する。

  • 区間1:SSHトンネルでTomodatiとAmazonEC2間Point-To-Pointで通信できるようにする
  • 区間2:SSHトンネルでAmazonEC2とRaspberryPi間Point-To-Pointで通信できるようにする
  • AmazonEC2にて区間1と区間2のパケットをルーティングさせる(★ルータ的な役割)

以下は通信イメージ図です。区間1と区間2リンク層の物理NICを表していない。

       +-----------区間1---------+                  +----------区間2------+
       |                          |                  |                      |
       |                          |                  |                      |
 <<Tomodati>>              <<AmazonEC2>>                             <<RaspberryPi>>
┏━━━━━━━┓        ┏━━━━━━━━━━━━━━━━┓      ┏━━━━━━━━━━━┓
┃              ┃        ┃[sshd]                          ┃      ┃[sshd]                ┃
┃    ┏━━┓  ┃ <ssh>  ┃  ┏━━┓            ┏━━┓  ┃<ssh> ┃  ┏━━┓   ┏━━┓ ┃
┃    ┃tun0┣━╋━━━━╋━┫tun0┃>>> SNAT >>>┃tun1┣━╋━━━╋━┫tun1┃   ┃eth0┣━━192.168.100.0/24
┃    ┗━━┛  ┃        ┃  ┗━━┛            ┗━━┛  ┃      ┃  ┗━━┛   ┗━━┛ ┃         ^
┃  192.168.3.1 ┃        ┃192.168.3.2          192.168.4.1┃      ┃ 192.168.4.2          ┃         |
┗━━━━━━━┛        ┗━━━━━━━━━━━━━━━━┛      ┗━━━━━━━━━━━┛         |
        |                                                                                              |
        |                      多重VPN経路を通して、192.168.100.0/24へアクセスする                     |
        +----------------------------------------------------------------------------------------------+

構築手順

  • 1. sshdに対してトンネリングを有効化する
  • 2. rootユーザログインできるように公開鍵を登録する ※1
  • 3. SSHトンネルを開設する
  • 4. 各TUNデバイスにIPアドレスを付与する
  • 5. 区間1トンネルと区間2トンネルを結び付ける

※1: sshログイン時にtapデバイスファイルを自動生成するためにクライアント側とサーバ側に root特権を持つアカウントを利用せざるを得ない。

2.1 1.sshdに対してトンネリングを有効化する

AmazonEC2インスタンスとRaspberryPiが設定対象となります。 /etc/ssh/sshd_config ファイ ルに以下の内容を追加して、 sshd サービスをリロードする。

########################################################################
# トンネリング機能を有効化する
#    point-to-point … Layer 3 のトンネリングのみを許可 (TUNデバイスを使用)
#    ethernet … Layer 2 のトンネリングのみを許可 (tapデバイスを使用)
#    yes … 両方のタイプのトンネリングを許可 (クライアントがトンネリングのタイプを選べる)
#    no … トンネリングを許可しない
########################################################################
PermitTunnel yes

2.2 2.rootユーザログインできるように公開鍵を登録する

区間1はAmazonEC2へのログインですので、EC2インスタンス作成時に生成された秘密鍵でログ インできる。

区間2のログインは公開鍵方式を使うため、以下の手順で鍵生成と登録を実施する。

  • Tomodatiにて ssh-keygen で鍵ペアを作成する。
  • 生成された公開鍵 id_rsa.pub の内容をAmazonEC2の /root/.ssh/authorized_keys に追加する。

2.3 3.SSHトンネルを開設する

rootユーザでsshコマンドにオプションを付けてログインすることでSSHトンネルが開設される。 一々オプションを指定するのが面倒なので、 /root/.ssh/config にまとめて書きましょう。

区間1のSSHトンネルを開設するための /root/.ssh/config

Host     amazon-vpn
  HostName        xxxxxxxx.compute.amazonaws.com   ★AmazonEC2インスタンスのPublic DNS
  User            root
  IdentityFile    /tmp/private-ec2.pem             ★秘密鍵
  LogLevel        DEBUG
  Tunnel          point-to-point                   ★tun方式
  TunnelDevice    0:0                              ★デバイスペアの番号(tun0 ... tun0)
  RequestTTY      no
  PermitLocalCommand yes
  LocalCommand    /tmp/setup_tun0_client           ★ログイン成功後ローカルで実行するコマンドの定義

区間2のSSHトンネルを開設するための /root/.ssh/config

Host    jitaku-vpn
  HostName        xxxxx.mydns.jp  ★RTX810のWAN側のグローバルIP
  User            root
  Port            22              ★SSHポート
  LogLevel        DEBUG
  Tunnel          point-to-point
  TunnelDevice    1:1
  RequestTTY      no
  PermitLocalCommand yes
  LocalCommand    /tmp/setup_tun1_client

区間1のSSHトンネル起動時のログ

[root@tomodati ~]# ssh amazon-vpn
debug1: permanently_set_uid: 0/0
debug1: permanently_drop_suid: 0
debug1: identity file /tmp/private-ec2.pem type -1
debug1: identity file /tmp/private-ec2.pem-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 pat OpenSSH_6.6.1* compat 0x04000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA d8:71:41:32:08:0d:8a:4c:24:6a:74:45:21:7d:ef:0c
debug1: Host 'xxxxxxxx.compute.amazonaws.com' is known and matches the ECDSA host key.
debug1: Found key in /root/.ssh/known_hosts:3
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /tmp/private-ec2.pem
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to xxxxxxxx.compute.amazonaws.com.
debug1: Requesting tun unit 0 in mode 1
debug1: sys_tun_open: tun0 mode 1 fd 3
debug1: channel 0: new [tun]
debug1: channel 1: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.

Tomodatiに tun0 デバイスが生成されたことを確認する。

[root@tomodati ~]# ip link show | grep tun0
11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 500

区間2開設後、AmazonEC2に tun1 デバイスが生成されたことを確認する。

root@ip-xxxxxxxx:~# ip link show | grep tun
★tun0 は区間1開設時生成されたデバイス
26: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 500

★tun1 は区間2開設時生成されたデバイス
27: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 500
root@ip-xxxxxxxx:~#

RaspberryPiに生成された tun1 デバイスを確認する

[root@pipi ~]# ifconfig | grep tun
tun1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
[root@pipi ~]#

2.4 4.各TUNデバイスにIPアドレスを付与する

Tomodatiの tun0 デバイスに 192.168.3.1 アドレスを指定する、Point-To-Point通信のた め、対向側のTUNデバイスのIPアドレスも指定する。

★IPアドレス指定
[root@tomodati ~]# ifconfig tun0 192.168.3.1 pointopoint 192.168.3.2

★IPアドレス確認
[root@tomodati ~]# ifconfig tun0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 192.168.3.1  netmask 255.255.255.255  destination 192.168.3.2
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

★ルーティングテーブルに自動で追加された経路
[root@tomodati ~]# ip route show | grep tun
192.168.3.2 dev tun0  proto kernel  scope link  src 192.168.3.1
[root@tomodati ~]#

AmazonEC2インスタンスのTUNデバイスにアドレスを指定する。

★区間1:tun0デバイスのIP指定
root@ip-xxxxxxxx:~# ifconfig tun0 192.168.3.2 pointopoint 192.168.3.1
root@ip-xxxxxxxx:~# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.3.2  P-t-P:192.168.3.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

★区間2:tun1デバイスのIP指定
root@ip-xxxxxxxx:~# ifconfig tun1 192.168.4.1 pointopoint 192.168.4.2
root@ip-xxxxxxxx:~# ifconfig tun1
tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.4.1  P-t-P:192.168.4.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

★ルーティングテーブルに自動で追加された経路
root@ip-xxxxxxxx:~# ip route show | grep tun
192.168.3.1 dev tun0  proto kernel  scope link  src 192.168.3.2 
192.168.4.2 dev tun1  proto kernel  scope link  src 192.168.4.1 
root@ip-xxxxxxxx:~#

RaspberryPiのTUNデバイスにアドレスを指定する。

★IPアドレス指定
[root@pipi ~]# ifconfig tun1 192.168.4.2 pointopoint 192.168.4.1
[root@pipi ~]# ifconfig tun1
tun1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 192.168.4.2  netmask 255.255.255.255  destination 192.168.4.1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

★ルーティングテーブルに自動で追加された経路
[root@pipi ~]# ip route show | grep tun
192.168.4.1 dev tun1  proto kernel  scope link  src 192.168.4.2 
[root@pipi ~]#

2.5 5.区間1トンネルと区間2トンネルを結び付ける

AmazonEC2にてiptablesのSNAT機能を用いて区間1と区間2のパケットをルーティングさせる。

★ パケット転送を許可する
root@ip-xxxxxxxx:~# sysctl -w net.ipv4.ip_forward=1

★ tun0からtun1へ転送時にMASQUERADEを行う
root@ip-xxxxxxxx:~# iptables -t nat -A POSTROUTING -o tun1 -s 192.168.3.0/24 -j MASQUERADE

区間1と区間2の各ノードに 192.168.100.0/24 への転送ルートを定義する。

Tomodatiに 192.168.100.0/24 への転送ルートを定義する。

[root@tomodati ~]# ip route add 192.168.100.0/24 via 192.168.3.2 dev tun0
[root@tomodati ~]# ip route show
192.168.3.2 dev tun0  proto kernel  scope link  src 192.168.3.1

★ 192.168.100.0/24への通信はすべてtun0を経路する
192.168.100.0/24 via 192.168.3.2 dev tun0

AmazonEC2に 192.168.100.0/24 への転送ルートを定義する。

★ 区間1から =192.168.100.0/24= へのパケットを転送を許可する
root@ip-xxxxxxxx:~# iptables -A FORWARD -i tun0 -p tcp -d 192.168.100.0/24 -j ACCEPT

★ =192.168.100.0/24= への転送ルートを追加する
root@ip-xxxxxxxx:~# ip route add 192.168.100.0/24 via 192.168.4.2 dev tun1

★ 192.168.100.0/24への通信はすべてtun1を経路する
root@ip-xxxxxxxx:~# ip route show
192.168.3.1 dev tun0  proto kernel  scope link  src 192.168.3.2
192.168.4.2 dev tun1  proto kernel  scope link  src 192.168.4.1
192.168.100.0/24 via 192.168.4.2 dev tun1

RaspberryPiに 192.168.100.0/24 への転送ルートを定義する。

★ ローカルサブネットへルーティング時のDNAT設定
[root@pipi ~]# sysctl -w net.ipv4.ip_forward=1

★ tun1 から eth0 出て行く時にMASQUERADEする
[root@pipi ~]# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.4.0/24 -j MASQUERADE

ここまで、区間1から 192.168.100.0/24 への接続ができるようになります。逆方向の接続 は同じ考え方でiptables、ルーティングテーブルを駆使すればできると思います。

3 TAPデバイス利用方式

TAPデバイスはLayer2(Ethernet)をエミュレートできるため bridge カーネルモジュールや ARP Proxy 機能と組み合わせて柔軟なVPNを構成することが可能になります。

VPNネットワーク構成概要

  • VPN部分を自宅LANのサブネットセグメントとして定義する
  • 区間1、区間2はTAPデバイスよりSSHトンネリングする
  • 区間1と区間2はBridgeで繋ぐ (★AmazonEC2はハブ的な役割)
  • RaspberryPiノード上のtapとeth0間でARP PROXYし、2つセグメントを繋ぐ

以下は通信イメージ図です。一部リンク層の物理NICを表していない。

   +---------------------------------------------------------------------------------------------------------------------+
   |                                                                            〜自宅のLANセグメント〜                  |
   |   +-----------------------------------------------------------------+                                               |
   |   |         〜多重VPNによるサブネットセグメント〜                   |                                               |
   |   |           network   : 192.168.100.48/29                         |    network   : 192.168.100.0/24               |
   |   |           netmask   : 255.255.255.248                           |    netmask   : 255.255.255.0                  |
   |   |           broadcast : 192.168.100.55                            |    broadcast : 192.168.100.255                |
   |   |           gateway   : 192.168.100.54                            |    gateway   : 192.168.100.1                  |
   |   |           ip range  : 192.168.100.49〜192.168.100.54            |    ip range  : 192.168.100.1〜192.168.100.254 |
   |   |                                                                 |                                               |
   |   |                                                                 |                                               |
   |   +-----------区間1--------+                  +--------区間2------+                                               |
   |   |                         |                  |                    |                                               |
 <<Tomodati>>              <<AmazonEC2>>                             <<RaspberryPi>>                                     |
┏━━━━━━━┓        ┏━━━━━━━━━━━━━━━┓      ┏━━━━━━━━━━━━━━━━┓                   |
┃              ┃        ┃[sshd]                        ┃      ┃[sshd]                          ┃                   |
┃              ┃        ┃        ┏━━━━━┓        ┃      ┃                                ┃                   |
┃              ┃        ┃      ┏┫    br0   ┣┓      ┃      ┃                                ┃                   |
┃              ┃        ┃      ┃┗━━━━━┛┃      ┃      ┃                                ┃                   |
┃192.168.100.49┃        ┃      ┃192.168.100.50┃      ┃      ┃192.168.100.54                  ┃                   |
┃    ┏━━┓  ┃ <ssh>  ┃  ┏━┻┓          ┏┻━┓  ┃<ssh> ┃  ┏━━┓             ┏━━┓ ┃                   |
┃    ┃tap0┣━╋━━━━╋━┫tap0┃          ┃tap1┣━╋━━━╋━┫tap1┃<<ARP PROXY>>┃eth0┣━━192.168.100.0/24--+
┃    ┗━━┛  ┃        ┃  ┗━━┛          ┗━━┛  ┃      ┃  ┗━━┛             ┗━━┛ ┃         ^
┗━━━━━━━┛        ┗━━━━━━━━━━━━━━━┛      ┗━━━━━━━━━━━━━━━━┛         |
        |                                                                                                      |
        |                      多重VPN経路を通して、192.168.100.0/24へアクセスする                             |
        +------------------------------------------------------------------------------------------------------+

区間2のRaspberryPiノード上のtap1とeth0の繋ぐ方法について、=ARP PROXY= 以外にBridge方 式もできる。Bridge方式だと 192.168.100.0/24 セグメントのブロードキャストパケットが 全部AamzonEC2に転送されて、AWSの課金が飛んでしまう可能性があるため、 ARP PROXY 方 式のほうが適していると勝手な判断です。

構築の詳細手順を割愛します。検証で作成したスクリプトを以下に示します。

3.1 区間1の設定

Tomodati /root/.ssh/config :SSHクライアント設定

Host     amazon-vpn-tap
  HostName        xxxxxxxx.compute.amazonaws.com   ★AmazonEC2インスタンスのPublic DNS
  User            root
  IdentityFile    /tmp/private-ec2.pem             ★秘密鍵
  LogLevel        DEBUG
  Tunnel          ethernet                         ★tap方式
  TunnelDevice    0:0                              ★デバイスペアの番号(tap0 ... tap0)
  RequestTTY      no
  PermitLocalCommand yes
  LocalCommand    /tmp/setup_tap0_client           ★ログイン成功後ローカルで実行するコマンドの定義

Tomodati /tmp/setup_tap0_client

#!/bin/sh

## tap0のIPアドレスアサイン
ifconfig tap0 192.168.100.49/29

## 192.168.100.0/24 セグメントへのルート定義
ip route add 192.168.100.0/24 via 192.168.100.54 dev tap0

AmazonEC2 /root/.ssh/authorized_keys

★rootユーザでログイン後 /root/.ssh/setup_tap0 を実行する定義
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/root/.ssh/setup_tap0" ssh-rsa xxxxxxxxx
                                                         ~~~~~~~ ←rootユーザで実行できるコマンドを限定する

AmazonEC2 /root/.ssh/setup_tap0 、brctlコマンドは bridge-utils パッケージに含まれ ている。

#!/bin/bash

## br0 ブリッジデバイスを作成
brctl addbr br0

## br0 ブリッジデバイスにIPをアサインする
ifconfig br0 192.168.100.51/29

## tap0デバイスを活性化する
ip link set tap0 up

## tap0デバイスを br0 ブリッジに刺す
brctl addif br0 tap0

3.2 区間2の設定

AmazonEC2 /root/.ssh/config :SSHクライアント設定

Host     jitaku-vpn-tap
  HostName        xxxxx.mydns.jp  ★RTX810のWAN側のグローバルIP
  User            root
  Port            22              ★SSHポート
  LogLevel        DEBUG
  Tunnel          ethernet                         ★tap方式
  TunnelDevice    1:1
  RequestTTY      no
  PermitLocalCommand yes
  LocalCommand    /tmp/setup_tap1_client           ★ログイン成功後ローカルで実行するコマンドの定義

AmazonEC2 /tmp/setup_tap1_client

#!/bin/sh

## tap1デバイスを活性化する
ip link set tap1 up

## tap1デバイスを br0 ブリッジに刺す
brctl addif br0 tap1

## 192.168.100.0/24 セグメントへのルート定義
ip route add 192.168.100.0/24 via 192.168.100.54 dev br0

RaspberryPi /root/.ssh/authorized_keys

★rootユーザでログイン後 /root/.ssh/setup_tap1 を実行する定義
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/root/.ssh/setup_tap1" ssh-rsa xxxxxxxxx

RaspberryPi /root/.ssh/setup_tap1

#!/bin/sh

## tap1デバイスにIPをアサインする
ifconfig tap1 192.168.100.54/29

## APR PROXY機能を有効にする
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.eth0.proxy_arp=1

4 おまけに

今後機会があれば、TUNデバイス方式とTAPデバイス方式の性能を比較したいと思います。 TAP の方が Ethernetヘッダが付加されるため、TUNより通信量が多いいのでTUNの方がが 性能がいいかもしれない。但しTUN方式はPoint-To-Point通信であるため、BroadCastや MultiCastが出来ない部分とネットワークセグメント間のパケット転送の設定(iptabels) が面倒の部分もあります。

Comments