たれながし.info

とあるITエンジニアの備忘録

Torで透過プロキシを立ててみた。

Torで透過プロキシを立てました。

はじめに

「Torを透過プロキシとして使えないかなー。」と思ってググったら、Torプロジェクトのページがヒットして設定方法も記載されていたので構築してみます。

gitlab.torproject.org

透過プロキシとは

クライアント側で明示的に設定しなくても使用できるプロキシです。
基本的にはネットワークの送信元と宛先の間に置いて使います。
メリット、デメリットは以下の通りです。

  • メリット
    • クライアント側でプロキシ設定をしなくてもプロキシ経由で通信できる
    • OSのプロキシ設定に従わないアプリケーションもプロキシ経由で通信できる
  • デメリット
    • 物理構成、ネットワーク構成、プロキシサーバーの設定など面倒な点が多い

Torを使用した透過プロキシ

以下の特徴や制限があります。

  • Torを使用するので、送信元IPアドレスを隠匿できる
  • Torの透過プロキシを動かすサーバーOSはLinuxBSDである必要がある
    • Linuxの場合、Torとiptablesを使用して構成する
    • BSDの場合、TorとPF(Packet Filter)を使用して構成する

ソフトウェア要件

LinuxでTorの透過プロキシを立てる場合、以下ソフトウェア要件があります。

  • iptables:1.3.5以上
  • Tor:0.2.0.1-alpha以上

構成

f:id:tarenagashi_info:20201213191103p:plain

クライアントからプロキシサーバーのネットワークIF「eth1」に到着したTCPDNSの通信をiptablesでTorに転送することで動作します。
クライアントが送信元となる通信のみTor経由とし、透過プロキシサーバーが送信元となる通信はTorの対象外とします(iptablesの設定で対象とすることも可能です)。

  • 透過プロキシサーバー
    • OSはCentOS7.9(要件を満たせば何でも良い)
    • ネットワークIFを2つ持つ
  • クライアント
    • 制限なし

Torプロキシの構築

OS設定

ネットワーク設定

IPアドレス設定を確認する

# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.0.0.4/24 brd 10.0.0.255 scope global noprefixroute eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.0.1.4/24 brd 10.0.1.255 scope global noprefixroute eth1
...
SELINUX無効化

SELINUXは無効にします。有効な場合、Torが起動しない場合がある

# getenforce
Permissive

Torのインストールと設定

インストール

EPELからインストールする

# yum -y install epel-release
# yum -y install tor
バージョン確認

ソフトウェア要件を満たしているか確認する
※Tor >= 0.2.0.1-alpha

# rpm -qa tor
tor-0.3.5.12-1.el7.x86_64
設定

設定を4行追記する
上2行は.onionドメイン宛ての通信に関する設定、下2行はネットワーク通信とDNSでTorが使用するポートの設定

# vi /etc/tor/torc
...
VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 10.0.1.4:9040
DNSPort 10.0.1.4:5353
起動
# systemctl enable tor
# systemctl start tor

# ss -anp | grep -e 5353 -e 9040
udp    UNCONN     0      0      10.0.1.4:5353                  *:*                   users:(("tor",pid=1168,fd=7))
tcp    LISTEN     0      128    10.0.1.4:9040                  *:*                   users:(("tor",pid=1168,fd=8))

iptablesのインストールと設定

インストール
# yum -y install iptables-services
バージョン確認

ソフトウェア要件を満たしているか確認する
iptables >= 1.3.5

# rpm -qa iptables*
iptables-services-1.4.21-35.el7.x86_64
iptables-1.4.21-35.el7.x86_64
起動

firewalldを停止して、iptablesを起動する

# systemctl disable firewalld
# systemctl stop firewalld
# systemctl enable iptables
# systemctl start iptables
設定

設定を全部消して、TCPDNSの通信をeth1からTorに転送する設定を入れる

# _trans_port="9040"
# _inc_if="eth1"

# iptables -F
# iptables -F -t nat

# iptables -t nat -A PREROUTING -i $_inc_if -p udp --dport 53 -j REDIRECT --to-ports 5353
# iptables -t nat -A PREROUTING -i $_inc_if -p udp --dport 5353 -j REDIRECT --to-ports 5353
# iptables -t nat -A PREROUTING -i $_inc_if -p tcp --syn -j REDIRECT --to-ports $_trans_port

設定を確認し保存する

# iptables-save
...
*nat
...
-A PREROUTING -i eth1 -p udp -m udp --dport 53 -j REDIRECT --to-ports 5353
-A PREROUTING -i eth1 -p udp -m udp --dport 5353 -j REDIRECT --to-ports 5353
-A PREROUTING -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040
COMMIT
...

# iptables-save > /etc/sysconfig/iptables

クライアントの設定

ネットワーク設定

デフォルトGWがTorプロキシを通るように、DNSサーバはTorプロキシのIPアドレスに設定する
f:id:tarenagashi_info:20201213193012p:plain

動作確認

TCPDNSがTorプロキシを経由していることを確認します。

TCP通信

IP確認くんなどで送信元IPアドレスを確認する
f:id:tarenagashi_info:20201213193213p:plain

DNS通信

nslookupで.onionドメインが解決できることを確認する

>nslookup facebookcorewwwi.onion
Server:  UnKnown
Address:  10.0.1.4

Non-authoritative answer:
Name:    facebookcorewwwi.onion
Addresses:  feb2:2a86:fb1:9b9a:912b:3ba8:162e:bd5f
          10.228.75.238