# システムプロキシの設定（IP切り替え）

このセクションでは、現在の携帯電話にIPプロキシを設定する方法について説明します。FIRERPAは、現在の携帯電話にHTTP、SOCKS5プロキシを設定することをサポートしており、これにより携帯電話のすべての通信トラフィックが設定されたプロキシから送信されるようになります。現在、この機能はIPV6をサポートしていません。

## プロキシへの接続

このインターフェースには多くのパラメータがあります。プロバイダーから取得したプロキシが `http://1.x.x.x:8080` であると仮定すると、以下の数行のコードだけでデバイスのトラフィックをこのプロキシ経由にすることができます。使用可能なパラメータについては、以下の `完全なパラメータ` を参照してください。

```python
profile = GproxyProfile()
profile.type = GproxyType.HTTP_CONNECT

profile.drop_udp = True
profile.host = "1.x.x.x"
profile.port = 8080

d.start_gproxy(profile)
```

注意点として、プロキシを設定した後、実行中のアプリケーションはすぐに設定されたプロキシを使用しません。これらのアプリケーションはプロキシ設定前にすでにTCP接続を確立しているためです。したがって、対象のアプリケーションを手動で閉じてから再度開くことで、アプリケーションはプロキシ経由で接続を確立します。

## プロキシタイプ

| プロキシタイプ   | 説明                         |
|--------|------------------------------|
| GproxyType.HTTP_CONNECT      | HTTP                      |
| GproxyType.HTTPS_CONNECT     | HTTPS (HTTP+TLS)          |
| GproxyType.SOCKS5            | Socks5                    |
| GproxyType.SHADOWSOCKS       | Shadowsocks               |
| GproxyType.HTTP_RELAY        | 廃止                     |


### Shadowsocks 暗号化パラメータ

以下はサポートされているShadowsocksの暗号化タイプのリストです。リストに存在する暗号化方式のみがサポートされており、難読化パラメータはサポートされていません。

| 暗号化タイプ   | 名称                         |
|--------|------------------------------|
| AES             | aes-128-cfb                      |
| AES             | aes-192-cfb                      |
| AES             | aes-256-cfb                      |
| AES             | aes-128-ctr                      |
| AES             | aes-192-ctr                      |
| AES             | aes-256-ctr                      |
| CAMELLIA        | camellia-128-cfb                 |
| CAMELLIA        | camellia-192-cfb                 |
| CAMELLIA        | camellia-256-cfb                 |
| DES             | des-cfb                          |
| AES-AEAD        | aes-128-gcm                      |
| AES-AEAD        | aes-192-gcm                      |
| AES-AEAD        | aes-256-gcm                      |
| AEAD            | chacha20-ietf-poly1305           |

Shaowsocksの場合、以下の方法で暗号化方式とパスワードを設定してください。

```python
profile.login = "chacha20-ietf-poly1305"
profile.password = "パスワード"
```

## プロキシの無効化

以下のようにして、FIRERPAがシステムに設定したプロキシを無効にすることができます。このインターフェースは非常にシンプルで、追加のパラメータは必要ありません。

```python
d.stop_gproxy()
```


## 完全なパラメータ

以下は、プロキシインターフェースの完全なパラメータ設定情報です。各パラメータの説明に基づいて、そのパラメータを使用するかどうかを選択できます。

以下のパラメータを使用してプロキシサービスの種類を設定できます。socks5プロキシの場合は `GproxyType.SOCKS5` となります。

```python
profile.type = GproxyType.HTTP_CONNECT
```

DNSクエリを114にリダイレクトする必要がある場合、このパラメータはシステムから発行されるすべてのDNSをここに転送します。OpenVPNと共存している場合は、OpenVPNの内部DNSに設定しないでください。さもないと、ネットワークが完全に切断される可能性があります。この設定を使用しない場合、デフォルトでシステムのDNSが使用されます。

```{attention}
`dns_proxy` パラメータを設定してDNSクエリをプロキシする場合、使用するDNSサーバーはTCPクエリをサポートしている必要があります。通常、一般的なDNSサーバーはTCPクエリをサポートしています。
```

```python
profile.nameserver = "114.114.114.114"
```

プロキシサーバーのIPとそのポート番号の設定です。

```python
profile.host = プロキシサーバーのアドレス
profile.port = プロキシサーバーのポート
```

プロキシサーバーがログイン認証を必要とする場合、以下のパラメータで提供できます。これはプロキシプロバイダーに依存します。Shadowsocksタイプの場合、`login`は暗号化方式になります。

```python
profile.login = "プロキシサーバーのログインユーザー名"
profile.password = "プロキシサーバーのログインパスワード"
```

システム内のUDPトラフィックをブロックするために使用します。なぜUDPトラフィックをブロックする必要があるのでしょうか？現在、ほとんどの公共プロキシサービスはシステム内のUDPトラフィックのプロキシをサポートしていないためです。もちろん、一部のSOCKS5サーバーはUDPのプロキシをサポートしています（例えば、私たちが提供する自己構築ソリューションなど）。Shadowsocksも通常UDPをサポートしています。したがって、システムのUDPトラフィックを無効にすることは良い選択です。このオプションはデフォルトでオフになっています。

```python
profile.drop_udp = False
```

ローカルネットワークをバイパスするかどうかを設定するために使用します。`True`に設定すると、192.168.xや10.xなどのルーターのネットワークセグメントへのトラフィックはプロキシを経由しなくなります。デフォルトはFalseです。`udp_proxy`を有効にした場合、このオプションはUDPトラフィックには無効であることに注意してください。

```python
profile.bypass_local_subnet = True
```

UDPトラフィックをプロキシするかどうかを設定するために使用します。プロキシがいくつかの前提条件を満たす必要があります。プロキシは `GproxyType.SOCKS5` または `GproxyType.SHADOWSOCKS` プロキシである必要があり、かつプロキシサーバーでUDPプロキシサポートが有効になっている必要があります。私たちが提供するドキュメントを通じて、SOCKS5 UDPをサポートするプロキシサーバーをインストールするか、独自のssサーバーを構築することができます。デフォルトはFalseです。httpプロキシを使用する場合や `drop_udp` オプションがTrueの場合、このオプションは無視されます。

```python
profile.udp_proxy = False
```

すべてのDNSトラフィックをプロキシ経由で転送する必要があるかどうかを設定するために使用します。このオプションを有効にすると、デバイス上のすべてのDNSトラフィックがプロキシ経由で送信され、汚染を防ぐことができます。このオプションを使用する場合、同時に `nameserver` パラメータを指定する必要があります。パケットキャプチャのシナリオでは使用できません。さもないと、キャプチャソフトウェアがDNSデータパケットを正しく処理できず、擬似的なネットワーク切断を引き起こす可能性があります。

```python
profile.dns_proxy = False
```

以下の設定を使用して、システム内の特定のアプリケーションにのみプロキシを設定することができます。それ以外のアプリケーションのトラフィックはプロキシを経由しません。

```python
# 以下の3つの方法から1つを選んで対象アプリケーションを選択してください。
app = d.application("com.android.browser")
app = d.get_application_by_name("ブラウザ")
app = d.application("com.android.browser", user=999) # 複数インスタンスのアプリ

profile.application.set(app)
```

## プロキシの自動適用

FIRERPAが起動時にプリセットされたプロキシサーバーに自動的に接続するように設定できます。これにより、携帯電話のトラフィックが常にプロキシを経由することを保証できます。以下の設定をコピーし、関連する設定をあなたのプロキシ情報に変更して `properties.local` ファイルに書き込み、その後FIRERPAを再起動してください。説明されていない一部のフィールドは、`完全なパラメータ` で説明されているフィールド名と同じです。

```ini
gproxy.enable=true
gproxy.type=http-connect
gproxy.host=1.x.x.x
gproxy.port=8080
gproxy.password=
gproxy.login=
```

## プロキシサービスの構築

FIRERPAは、toolsディレクトリに、UDPをサポートするすぐに使えるsocks5プロキシサービスのdockerを提供しています。このドキュメントのプロキシサービスデプロイ関連のセクションで、独自のプロキシサーバーをデプロイする方法を学ぶことができます。