# 設定系統代理 (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
# 以下三種選擇目標應用程式的方式請擇一使用。
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，您可以在本文件的部署代理服務相關章節瞭解如何部署自己的代理伺服器。