VDSL(+4G)で100Mbps越えの夢を見る （MPTCP）

# 要旨
- 実測値上限約70MbpsのVDSLと約70Mbpsの4Gを組み合わせることで最高下り145Mbpsを達成することができた
- MPTCP（Multi-Path TCP）というTCPの拡張を利用したshadowsocksをVPS上に導入して用いることでどのサイトでも帯域を向上
- 携帯回線とVDSLの速度（帯域）が同程度でギガが余ってる人は試してみるとおもしろいかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/0161f987-372a-fd07-3eef-5bf4f2ddd8e6.png)

# はじめに
皆さんのご家庭のインターネット環境はどのようなものでしょうか。近年では光回線を導入している家が主になってきました。
しかしながらどうしても物理的に光回線を家に引き込めないパターンがあります。その最たる例がマンションです。
インターネットが普及する以前に建築されたマンションは、光回線を各家庭に引き込むことを想定していない場合が多いです。
特に世帯数の多いマンションほど光回線を各家庭に引き込むことが難しく、建築時に敷設した電話回線を使って無理やりインターネット接続に利用する「VDSL」という形態をとっているマンションが多いです。VDSLでは理論上の帯域上限が100Mbpsと低速です。また、このような光回線を引き込むことが難しいマンションは鉄筋コンクリート造であることも多く、4Gで100Mbps出るようなことはなかなかない（はず）です。つまり、SoftBank Airのような置くだけWi-Fiですら無力です。解決策としてはローカル5G等が挙げられますが、ちょっと待ってください。

**VDSL+4Gを同時利用すればめっちゃ早くなるんじゃね？？**
VDSLと4Gがそれぞれ100Mbps出るなら合わせて200Mbpsの通信が可能になるのでは？？

# 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/0dd26852-68a8-6a1a-2f22-1b63b3fc62fa.png)
今回はProxyサーバとVPSを用意し、その間でMPTCP通信を行います。Proxyサーバには4GのテザリングとVDSLの2経路を持たせます。
VPSは帯域が1Gbps利用できるLinodeを利用しました。VPS自体は1つのインターフェースのみ持ちます。
PCがWEBサイトにアクセスする場合の通信の流れは以下の通りです。まずPCはProxyサーバにWEBサイトの取得を要求します。その後ProxyサーバとVPS間はVPNのようなトンネリングが行われ、MPTCPで通信します。その後VPSから目的のWEBサーバに要求パケットが到着します。WEBサイトからは今と逆の流れでWEBサイトの情報が返されます。つまりProxyサーバとVPS間をマルチパスで通信させることで無理やり帯域を増やします。
このような構成をとることで、MPTCPに対応していないどんなPCとサーバでも帯域を増やして通信を行うことを可能にします。MPTCPに対応させるのはProxyサーバとVPSのみで済むからです。

Ubuntu22.04ではMPTCPに標準対応しているため、ProxyサーバやVPSはUbuntu22.04を用います。

# 構築
基本的に参考文献[1]に従っていく流れになりますが、一部[2]を組み合わせるので、ここで説明します。
構築してから少々時間が経ってから記事を書いているため、記載忘れによって一部足りない設定があるかも知れません。参考文献も合わせてご確認ください。

## サーバー側 (VPS)
トンネリングしてくれるshadowsocksと、あらゆるサービスをMPTCPに対応してくれるmptcpizeをインストールします。
```shell
$ sudo apt update
$ sudo apt install shadowsocks-libev mptcpize rng-tools5
```
shadowsocksの設定ファイルを変更します。 `server`を変更することで、外部からのアクセスを受け付けます。
passwordは後ほどProxyサーバを構築する際に用いるためメモをしておきましょう。
```json:/etc/shadowsocks-libev/config.json
{
    "server":["::0","0.0.0.0"],
    "mode":"tcp_and_udp",
    "server_port":8388,
    "local_port":1080,
    "password":"********************",
    "timeout":86400,
    "method":"chacha20-ietf-poly1305"
}
```
設定を反映し、自動起動を有効化後MPTCP化します。
```shell
$ sudo systemctl restart shadowsocks-libev.service
$ sudo systemctl enable shadowsocks-libev.service
$ sudo mptcpize enable shadowsocks-libev.service
```

## Proxyサーバ側
### shadowsocksの設定
VPSの時と同じようにshadowsocksをインストールします。
```shell
$ sudo apt update
$ sudo apt install shadowsocks-libev mptcpize rng-tools5
```
shadowsocksのクライアントのバイナリは`ss-local`という名前であり、`shadowsocks-libev`はあくまでもサーバの機能のため停止させます。
```shell
$ sudo systemctl stop shadowsocks-libev
$ sudo systemctl disable shadowsocks-libev
```
shadowsocksのクライアントの設定を行います。
```shell
$ sudo cp /etc/shadowsocks-libev/config.json /etc/shadowsocks-libev/client01.json
```

```json:/etc/shadowsocks-libev/client01.json
{
    "server":["VPSのIPアドレス"],
    "mode":"tcp_and_udp",
    "server_port":8388,
    "local_port":1080,
    "local_address":"自分に割り振られているProxyとして使うIPアドレス",
    "password":"先ほどメモしたVPSに設定したパスワード",
    "timeout":60,
    "method":"chacha20-ietf-poly1305"
}
```
クライアントを起動して自動起動設定をした後MPTCPに対応させます。

```shell
$ sudo systemctl start shadowsocks-libev-local@client01.service
$ sudo systemctl enable shadowsocks-libev-local@client01.service
$ sudo mptcpize enable shadowsocks-libev-local@client01.service
```
### MPTCPの設定
MPTCPとして利用するサブフローを設定します。今回はVDSLと4Gの2つを使うため、limitsを2とします。
`ip mptcp endpoint add `でサブフローを追加します。usb0などとなっているところはデバイス（インターフェース）名で`ip -a`などで調べることができます。また、それぞれに割り振られているIPアドレスも設定します。
以下の設定は環境によって変更してください。
```shell
$ sudo ip mptcp limits set subflow 2
$ sudo ip mptcp endpoint add 192.168.10.2 dev usb0 subflow
$ sudo ip mptcp endpoint add 192.168.17.2 dev enp0s25 subflow
```

## エンドユーザーの設定
各PCでProxyの設定を行います。Socksを用いたProxyを設定します。
IPアドレスとポート番号はProxyサーバで設定したものを用いましょう。

# 実験結果
記事の頭に掲載したスクショは色々と試して偶然うまくいったものです。
色々試した中でまぁこんなもんかなという結果になったものを次に掲載しておきます。
## VDSL回線の帯域
![スクリーンショット 2022-08-30 23.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/39b2e98a-07c8-1872-3ff0-586c62c9595e.png)
理論上限100Mbpsとはいえ、実際67Mbps出ていればかなりいい方なのではないでしょうか。
## 4G回線の帯域
我が家で計測したにしてはかなり早い部類です。VDSLより速度出ちゃってるからこれでいいじゃん・・・
![IMG_3043.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/9395c2a5-eb06-7752-30d2-f91943ac7ced.png)

## VDSL + 4GのMPTCP
記事の頭で掲載したものよりも遅い結果となってしまいましたが、VDSLと4Gを二つ活用することによって100Mbpsを超すことはできました。単純に足し算して帯域が増えるかと言われればそうではなく、パケットスケジューリングアルゴリズムや、処理のオーバーヘッド等の原因によって思うように速度が出ないことがあるのかと思います。
![スクリーンショット 2022-08-30 23.38.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/4b8b9c7c-7105-799b-1da0-af121d2ca26c.png)

# まとめ
時間や条件によって出る速度に変化はあるものの、4G回線を併せて活用することによってVDSLでは達成できない速度を出すことができました。工夫次第ではさまざまな使い方もできるとおもいます。
興味のある方はぜひお試しください。

# 参考文献
[1] MPTCP proxy setup at home: easier now! - Tessares 2022年8月30日閲覧
https://www.tessares.net/mptcp-proxy-setup-at-home-easier-now/

[2] How to Set up Shadowsocks-libev Proxy Server on Ubuntu 2022年8月30日閲覧
https://www.linuxbabe.com/ubuntu/shadowsocks-libev-proxy-server-ubuntu