Introduction

前回 は Mac で透過プロキシを実施した。
今回は Ubuntu。

実行環境は Ubuntu 24.04
Wi-Fi 共有、つまり Ubuntu で言うところのホットスポットは有効済みが前提。

How to do?

1. mitmproxy のインストール

1
$ sudo apt install -y mitmproxy 

2. IP フォワーディングを有効にする

下記の手順は再起動も有効な永続化だが、無効方法もあるので、適宜判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-custom.conf
$ echo "net.ipv6.conf.all.forwarding=1" | sudo tee -a /etc/sysctl.d/99-custom.conf
$ sudo sysctl --system
* Applying /usr/lib/sysctl.d/10-apparmor.conf ...
* Applying /etc/sysctl.d/10-bufferbloat.conf ...
* Applying /etc/sysctl.d/10-console-messages.conf ...
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
* Applying /etc/sysctl.d/10-map-count.conf ...
* Applying /etc/sysctl.d/10-network-security.conf ...
* Applying /etc/sysctl.d/10-ptrace.conf ...
* Applying /etc/sysctl.d/10-zeropage.conf ...
* Applying /usr/lib/sysctl.d/30-tracker.conf ...
* Applying /usr/lib/sysctl.d/50-bubblewrap.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /etc/sysctl.d/99-custom.conf ...
* Applying /usr/lib/sysctl.d/99-protect-links.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.apparmor_restrict_unprivileged_userns = 1
net.core.default_qdisc = fq_codel
kernel.printk = 4 4 1 7
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
kernel.kptr_restrict = 1
kernel.sysrq = 176
vm.max_map_count = 1048576
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
kernel.yama.ptrace_scope = 1
vm.mmap_min_addr = 65536
fs.inotify.max_user_watches = 65536
kernel.unprivileged_userns_clone = 1
kernel.pid_max = 4194304
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1

無効にする場合は

1
2
$ sudo rm /etc/sysctl.d/99-custom.conf
$ sudo sysctl --system

3. ICMP リダイレクトの無効化

ICMP パケットをリダイレクトしないようにルールを追加。
同じ物理ネットワーク上にクライアントが存在する場合 (普通はそうだと思うが)、マシンがデバイスにプロキシをスキップすることでより短いルートが利用可能であることを通知することを防止する。

1
2
$ echo "net.ipv4.conf.all.send_redirects=0" | sudo tee /etc/sysctl.d/99-custom.conf
$ sudo sysctl --system

無効にする場合は先の IP フォワーディングと同様

1
2
$ sudo rm /etc/sysctl.d/99-custom.conf
$ sudo sysctl --system

4. mitmproxy にトラフィックを流す

8080 で待機する mitmproxy にトラフィックを流すように iptables を変更
iptables-persistent で永続化する。

1
$ sudo apt install -y iptables-persistent

firewall

現在の設定を保存するかを IPv4 と IPv6 それぞれに対して聞かれるので Yes。
次に iptables のルールに追加。
<IF> を先のインターフェース名に変更して下記を実行。
つまり、ここで Wi-Fi のインターフェース名を指定しないと、何時まで経ってもホットスポットに繋げてくるクライアントの通信が mitmproxy に流れないので注意。
インターフェース名は ifconfig で調べる。

1
2
3
4
5
$ sudo iptables -t nat -A PREROUTING -i <IF> -p tcp --dport 80 -j REDIRECT --to-port 8080
$ sudo iptables -t nat -A PREROUTING -i <IF> -p tcp --dport 443 -j REDIRECT --to-port 8080
$ sudo ip6tables -t nat -A PREROUTING -i <IF> -p tcp --dport 80 -j REDIRECT --to-port 8080
$ sudo ip6tables -t nat -A PREROUTING -i <IF> -p tcp --dport 443 -j REDIRECT --to-port 8080
$ sudo netfilter-persistent save

再起動後は

1
$ sudo netfilter-persistent reload

すればよい。

削除する場合は、<IF> を先のインターフェース名に変更して下記を実行。

1
2
3
4
5
6
$ sudo netfilter-persistent reload
$ sudo iptables -t nat -D PREROUTING -i <IF> -p tcp --dport 80 -j REDIRECT --to-port 8080
$ sudo iptables -t nat -D PREROUTING -i <IF> -p tcp --dport 443 -j REDIRECT --to-port 8080
$ sudo ip6tables -t nat -D PREROUTING -i <IF> -p tcp --dport 80 -j REDIRECT --to-port 8080
$ sudo ip6tables -t nat -D PREROUTING -i <IF> -p tcp --dport 443 -j REDIRECT --to-port 8080
$ sudo netfilter-persistent save

5. mitmproxy の起動

管理者権限のコマンドプロンプトで実行。

1
$ mitmproxy --mode transparent --showhost

6. CA 証明書のインストール

ここからは Mac と同じ。

mitmproxy の役割は透過プロキシであり、名前が示す通り MITM = Man-In-The-Middle : 中間者である。
そのため、クライアントに対して https 通信に必要なオレオレ CA 証明書をホットスポットに接続する端末にインストールする。

Ubuntu のホットスポットにアクセスした端末、 http://mitm.it にアクセスする。
今回も iOS なので iOS の ca-cert.pem を選択してダウンロード。

instance

許可を求められるので許可する。

instance

ダウンロードされる。

instance

iOS の 設定 -> 一般 -> VPN とデバイス管理 に移動。
先にダウンロードしたプロファイルが表示されている。

instance

プロファイルを選択。

instance

インストールを実行。

instance

インストール完了。

instance

iOS の 設定 -> 一般 -> 情報 -> 証明書信頼設定 に移動。

instance

mitmproxy を選択。

instance

続ける を選択し、証明書を有効にする。

instance

10. クライアントの通信を傍受

試しにクライアントで https://gitlab.com にアクセス。

instance

通信内容が mitmproxy に表示される。