不自由なネットワークから脱出する(shadowsocks)

# はじめに
学校等で不自由なネットワークから，firewallを貫通して自由になりたい人向けです。
弊学のfirewallはTCPの80,443しか基本的には通さないようになっています。22番ポートですが，3wayハンドシェイクは出来るが，SSHプロトコルと認識されて遮断されてしいます。
*SSHできないのはおかしい！！*
各プラットフォームごとに書いていきます。
メインは`shadowsocks`というプロキシです。

# Windows
筑波大学の`softetherVPN`プロジェクトを使いましょう！！TCPの443ポートのサーバーを選択すれば、だいたい貫通できると思います。弊学の場合,`OpenVPN`はTCPの443でもブロックされました。使うならSoftEtherVPN一択です。
サービスによっては，VPNプロジェクトは公開プロジェクトなのでIPアドレスが公開されている関係で，ブロックされることもあるようです。
`https://www.vpngate.net/ja/download.aspx`

:::note warn
Windowsしか対応していません
:::
# Windows以外

## VPNを使う
OpenVPN,IPSec-VPNなど，firewallを貫通できるプロトコルを探してください。
OpenVPNの場合，TCPの443ポートを使い，`tls-crypt`を有効化すると貫通できる可能性が上がります。
弊学の場合，Windows以外のクライアントではVPNが通らなかったので，VPNを諦めました。

## プロキシを使う。
### httpプロキシ，socks5プロキシ
httpプロキシやsocks5プロキシで貫通可能なのであれば、使いましょう。
ソフトウェアは`v2ray`がおすすめです。後述のプロキシでも使える，大変便利なソフトウェアです。
ルーティングの設定が強力です。

#### インストール
```
curl -Ls https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh | sudo bash
```

::: note
クライアント側でも使えます！
:::
弊学の場合，SSHは出来るようになりました。

### shadowsocks(メイン)
弊学の場合，shadowsocksでほぼ自由になることができました。
ベースはsocks5で，難読化します。

::: note
中国の大規模検閲を回避するために開発されたソフトウェアなようです。
:::
::: note warn
前提条件
・管理者権限のあるサーバを持っていること
・ポート開放，転送できること(443ポートが使えると良い)
・自由に使えるドメインを持っていること
:::
筆者はVPSを借りました。

#### インストール
先ほどのv2rayが使えます。

素のsyadowsocksをインストールすることもできます。

```bash
sudo apt install shadowsocks-libev
```

#### 設定(サーバ側)
##### 設定ファイル

geminiに書かせちゃいましょう！(学生なら2025/6/30まで申し込めば2.5proが使えます！)

`/usr/local/etc/v2ray/config.json`
``` config.json
{
    "log": {
        "loglevel": "none",
        "access": "YOUR_ACCESS_LOG_FILE",
        "error": "YOUR_ERROR_LOG_FILE"
    },
    "inbounds": [
        {
            "listen": "YOUR_GLOBAL_IP",
            "port": 443,
            "protocol": "shadowsocks",
            "settings": {
                "method": "chacha20-ietf-poly1305",
                "password": "YOUR_PASSWARD",
                "udp": true
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    "certificates": [
                        {
                            "certificateFile": "YOUR_SERVER_CERTIFICATE",
                            "keyFile": "YOUR_SERVER_KEY"
                        }
                    ]
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "tag": "direct",
            "settings" :{
                "udp": true
            }
        }
    ]
}
```

::: note
サーバー証明書は`Let’s Encrypt`で取っちゃいましょう。DNSチャレンジで，ワイルドカード証明書にすることをおすすめします。いろいろなことに使えます。
:::

##### firewallの設定
`ufw`

```
sudo ufw allow 443/tcp
sudo ufe reload
```
`firewalld`
```
firewall-cmd ----permanent --add-port=443/tcp --zone=public
firewall-cmd --reload
```
##### 起動
```
sudo systemctl enable v2ray
sudo systemctl start v2ray
```

#### 設定(クライアント側)
##### インストール
###### linux
サーバー側と同じソフトウェア
###### Android
```
https://v2rayng.2dust.link/v2rayNG_1.10.4_arm64-v8a.apk
```

###### Apple系
```
https://apps.apple.com/us/app/v2box-v2ray-client/id6446814690
```
###### Windows
```
https://v2rayn.2dust.link/v2rayN-windows-64-desktop.zip
```
##### 設定ファイル
`/usr/local/etc/v2ray/config.json`


``` config.json
{
    "log": {
        "loglevel": "warning"
    },
    "inbounds": [
        {
            "port": 10808,
            "listen": "127.0.0.1",
            "protocol": "socks",
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            },
            "settings": {
                "udp": true
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "shadowsocks",
            "settings": {
                "servers": [
                    {
            "address": "YOUR_SERVER_IP",
            "port": 443,
            "method": "chacha20-ietf-poly1305",
            "password": "YOUR_PASSWORD"
          }
        ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    "serverName": "YOUR_SERVER_FQDN"
                }
            },
            "tag": "proxy"
        },
        {
            "protocol": "freedom",
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "tag": "block"
        }
    ],
    "routing": {
        "domainStrategy": "AsIs",
        "rules": [
            {
                "type": "field",
                "domain": [
                    "geosite:category-ads-all"
                ],
                "outboundTag": "block"
            },
            {
                "type": "field",
                "ip": [
                    "geoip:private"
                ],
                "outboundTag": "direct"
            },
            {
                "type": "field",
                "network": "tcp,udp",
                "outboundTag": "proxy"
            }
        ]
    }
}

```
これで任意のTCP通信が出来るようになります。
UDP通信も出来るはずですが，TCPの443ポート以外のポートでリレーされて，弊学のUDP通信が遮断されている環境下はできませんでした。

::: note
AndroidやiOSクライアントはほとんどの場合，VPNモードで動作しますが，すべての通信をプロキシに通過させるために，ローカルにVPNサーバーを建てて接続しているのでVPNっぽいですが，プロキシです。
:::
::: note warn
ルーティング設定の広告ブロックですが，効かないときもあります。
:::
# 代替手段

すべてをTLSでカプセル化するstunnelというソフトウェアが使えそうです。
# おわりに
いい通信ライフを！