koulab

購入型リサーチャー

VPNルータおよびProxmox + VyOSを利用した匿名ログなしVPNを利用したルータの作成

この記事はあやしいネットワーク関連 Advent Calendar 2018の25日目の記事です https://adventar.org/calendars/3098

注:当記事はプライバシー保護を目的としており匿名化ネットワークの構成を悪用し第三者のネットワークなどに攻撃を行うことは現在地が日本の場合は日本法により禁止されています。当記事を参考にし損害を被った場合でも責任を負いかねます

ソフトウェアVPNクライアントの問題点

  • VPN切断時に生IP(プロバイダIP)がリークする可能性がある
  • クライアント毎にVPNの設定する必要がある
  • クライアント毎に接続する必要があるため同時接続数上限の問題

できること

最悪の状態を回避できる。分かりやすい例ではTailsのUnsafe Browserを利用しても匿名VPNを経由して通信できる。

f:id:dmca:20181225031849p:plain

VPNルータを利用した家庭用匿名ネットワーク

無線・有線の全通信を匿名VPNを常時経由してインターネットができます。 VPNはPrivate Internet AccessもしくはNord VPNなどの信頼できるノーログVPNプロバイダをご用意ください。

https://thatoneprivacysite.net/vpn-comparison-chart/

一部のVPNプロバイダではDD-WRT化済みのルータが販売されていますがに技適なしの可能性があるため購入しないでください。

また、二重ルータ環境下では利用できないため適当に安いPPPoEのプロバイダを契約してください。 ここではAsus-MerlinのAsus AC-68Uをベースで解説します

プロバイダの設定

残念ながら、無線ルーターモード以外ではVPNは利用できません。

f:id:dmca:20181223214911p:plain

OpenVPNを設定する

デフォルトIPは192.168.1.1です http://192.168.1.1

.ovpnファイルをインポートすると簡単に設定できます。

f:id:dmca:20181223221013p:plain

設定しているcipherはAES-128-GCM:AES-256-GCM:AES-128-CBC:AES-256-CBCです。

あとは、無線もしくは有線で繋いでVPNのIPアドレスが出ればOKです

f:id:dmca:20181223232318p:plain

スピードテストをしてみます。

f:id:dmca:20181223233143p:plain

遅いですね。OpenVPNはマルチコアをサポートしていないためです。 少し難しいですが後述する方法で、爆速にすることができます

VPNキルスイッチの設定とポートフォワーディング

このままの設定ですと、VPN接続が切断されている間はプロバイダのIPアドレスを使用してしまいます。 これが、プライバシー保護活動家が最も恐れている問題と思います。 公式ファームウェアではこれは防止できません。

注:技適違反となる可能性があるため、以下は自己責任でお願いします。

非公式ファームの導入を行います 以下よりAsus AC-68Uのファームウェアをダウンロードします。

https://asuswrt.lostrealm.ca/

設定からファームウェアをアップロードします

f:id:dmca:20181223214807p:plain

書き込みできるようにJFFS領域を有効にします Enable JFFS custom scripts and configsを「はい」にします

f:id:dmca:20181223215729p:plain

なにやら、TORと言う怪しいタブがありますがこれは今回は触れません。気になる人は見てみると良いでしょう

f:id:dmca:20181223215033p:plain

VPNキルスイッチの設定

f:id:dmca:20181223221656p:plain

重要

  • Redirect Internet trafficはPolicy Rulesに設定します
  • Block routed clients if tunnel goes downを「はい」にします

ルールを以下のようにします

f:id:dmca:20181223221916p:plain

上記の設定でVPNサーバがダウンして繋がらない状態になってもVPNを経由せず生IP(プロバイダのIP)で接続することを防止できます

ポートフォワーディング

VPNプロバイダ毎にポートフォワーディングのリクエストする方法が異なるので、各自で確認してください Private Internet Accessの場合はAPI経由でリクエストできます。

https://www.privateinternetaccess.com/archive/forum/discussion/23431/new-pia-port-forwarding-api

sshを有効にしておきます

f:id:dmca:20181223215846p:plain

ssh ユーザ名@192.168.0.1
#ルータのパスワードを入力

例としてVPNサーバからの通信ポート49125-> ローカルネットワーク192.168.1.3に転送する場合 インタフェース名を確認します

# ifconfig | grep "tun"
tun14     Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
vi /jffs/scripts/nat-start
#!/bin/sh
sleep 15
iptables -I FORWARD -i tun14 -p tcp -d 192.168.1.3 --dport 49125 -j ACCEPT
iptables -t nat -I PREROUTING -i tun14 -p tcp --dport 49125 -j DNAT --to-destination 192.168.1.3
chmod 777 nat-start

リスタートして動作を確認してください。 テストとしてローカル192.168.1.3のコンピュータでウェブサーバ49125でListenします

http:// VPNのパブリックIPv4:49125

でウェブページが表示されたら成功です

sleep15というのがなんとも残念ですが、tunがupする前にiptablesを設定するとうまくいかないようです(良い方法があればご教示ください)

Proxmox + VyOSを利用したハイパフォーマンス匿名VMネットワーク

前述のVPNルータではOpenVPNはシングルコアしか使用しないためスループットは最大10~20Mbps程度でCPU性能依存するため、サーバ用途には向きません。 さらに、二重ルータ環境下ではそもそもVPN機能が利用できません。これらの問題をすべて解決します。

Proxmox上にVyOSを構築します。

Proxmoxのインストール

インストール方法は割愛します https://www.proxmox.com/

VyOSのインストール

configファイル例は以下の通りです

nano /home/vyos/config-test.boot

interfaces {
    ethernet eth0 {
        address 192.168.201.1/17
    }
    ethernet eth1 {
        description "VPN"
        address 192.168.202.1/24
    }

    openvpn vtun0{
        description "PIA JapanVPN"
        encryption aes128
        mode client
        openvpn-option --comp-lzo
        openvpn-option "--verb 3"
        openvpn-option "--auth-user-pass /config/auth/pia/pia.txt"
        openvpn-option "--script-security 2"
        openvpn-option "--resolv-retry infinite"
        openvpn-option --nobind
        openvpn-option --persist-key
        openvpn-option "--cipher aes-256-cbc"
        openvpn-option "--auth sha256"
        openvpn-option "--reneg-sec 0"
        openvpn-option "--tls-client"
        openvpn-option "--remote-cert-tls server"
        persistent-tunnel
        protocol udp
        remote-host 103.208.220.143
        remote-port 1197
        tls {
            ca-cert-file /config/auth/pia/ca.rsa.4096.crt
            cert-file /config/auth/pia/cert.crt
            key-file /config/auth/pia/host.key
        }
    }
}
nat {
    source {
        rule 1 {
            outbound-interface vtun0
            source {
                address 192.168.202.1/17
            }
            translation {
                address masquerade
            }
        }
    }
}
protocols {
    static {
        route 0.0.0.0/0 {
            next-hop 192.168.200.1 {

            }
        }
    }
}
system {
    config-management {
        commit-revisions 20
    }
    host-name vyos
    login {
        user vyos {
            authentication {
                plaintext-password "vyos"
            }
            level admin
        }
    }

}
service {
    dns {
        forwarding {
            listen-on eth1
            name-server 8.8.8.8
        }
    }
    ntp {
        server 0.pool.ntp.org {

        }
        server 1.pool.ntp.org {

        }
        server 2.pool.ntp.org {

        }
    }
}

/config/auth/pia/pia.txtには Private Internet Accessの

ユーザID
パスワード

を記載します

PIAのVPNサーバのIPはpingで確認してください。実稼働する場合は固定IPが取得できる匿名VPNプロバイダの利用を推奨します

ping japan.privateinternetaccess.com
japan.privateinternetaccess.com [103.208.220.143]に ping を送信しています 32 バイトのデータ:
103.208.220.143 からの応答: バイト数 =32 時間 =14ms TTL=49

/config/auth/pia/にはzipファイルにある

  • ca.rsa.4096.crt

をアップロードしておきます

また、自己証明書も/config/auth/piaに保存します

cd /config/auth/pia
openssl genrsa -out host.key 2048
openssl req -new -key host.key -out csr.crt
openssl req -x509 -days 365 -key host.key -in csr.crt -out cert.crt

configとファイルの準備ができたらcommitして確認します

configure
load /home/vyos/config-test.boot
commit
ping 1.1.1.1
curl http://httpbin.org/ip
save

うまくいかない場合ログを見ます。また再起動すると改善することがあります

show log openvpn

速度テスト

適当なコンピュータとルータを有線で接続し192.168.202.1/24割当します 速度が大幅に向上していることが確認できます。

f:id:dmca:20181224030008p:plain

FWの設定

ここで、/config/auth/pia/pia.txtに間違えた認可情報を入力して再起動します。

おそらく、プロバイダのIPアドレスが表示されてしまっていると思います。

VyOSのPolicy Based Routingを使用してください

https://wiki.vyos.net/wiki/Policy_based_routing

これはPolicy Based Routingで対応可能ですがここでは上位のProxmoxのFWでDROPすることにします

VMを選択しFirewallタブに以下を設定します

f:id:dmca:20181225000411p:plain

HardwareのNetwork Deviceのnet0とnet1を編集しfirewallにチェックを入れます

f:id:dmca:20181225000539p:plain

ホストOSのFirewall->Optionsを選択しFirewallをYesにします。同様にゲストVMのFirewall->OptionsでFirewallをYesにします

f:id:dmca:20181225001313p:plain

ホストOSにsshでログインしFirewallのサービスを動作しているか確認します

# pve-firewall status
Status: enabled/running

間違えた認可情報でもプロバイダのIPがリークしないことを確認します。

ウェブサーバを立ち上げる

CentOS7のVMを作成します isoが無い方は

https://www.centos.org/download/

より/var/lib/vz/template/isoに保存します

CreateVMから作成後、起動しVPN経由でのネットワークであることを確認します。

yum install update -y
yum install epel-release -y
yum install tor
service httpd start
chkconfig httpd on
service tor start
chkconfig tor on
vi /etc/tor/torrc
HiddenServicePort 80 127.0.0.1:80
service tor restart
cat /var/lib/tor/hidden_service/hostname

これで、匿名VPNを経由したHiddenServiceのウェブサーバが完成しました。仮にウェブサーバの設定ミスがあってもReal-IPを漏洩することは防止できます

HiddenServiceではなくクリアネット上にウェブサーバをホストしたい場合は次のような構成にします

Cloudflare <-> Bulletproof Hosting nginx:80 <-> Anonymous VPN:49125 <-> Proxmox Guest VM CentOS7 httpd:80/49125
  • Bulletproof Hosting nginxでの設定例(最小構成) /etc/nginx/conf.d/testgw.conf
server {
 listen 443;
 listen [::]:443;
 server_name example.com;
 ssl on;
 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
 access_log      /var/log/nginx/example.com.access-ssl.log main;
 proxy_set_header    Host    $host;
 proxy_set_header    X-Real-IP    $remote_addr;
 proxy_set_header    X-Forwarded-Host       $host;
 proxy_set_header    X-Forwarded-Server    $host;
 proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
 location / {
      proxy_pass      https://VPNのIPアドレス:ポート/;
 }
}
  • Anonymous VPNでの設定
VPNプロバイダにポートフォワーディングをリクエストします
  • Proxmox VyOS
https://wiki.vyos.net/wiki/NAT

VyOS側設定(ポートフォワーディング有効時)

set nat destination rule 10 destination port '49125'
set nat destination rule 10 protocol 'tcp'
set nat destination rule 10 inbound-interfce 'vtun0'
set nat destination rule 10 translation address '192.168.206.2'
commit
save

Proxmox FW設定例(ポートフォワーディング有効時)

f:id:dmca:20181226161759p:plain

これで仮にBulletproof HostingもしくはAnonymous VPNに何かしらのアクションがあってもAnonymous VPNはノーログであることをPrivate Internet Accessは実証しているので、Bulletproof HostingもしくはAnonymous VPNがダウンしてもVPNに接続されたプロバイダのIPアドレスをリークすることは無いと考え、実質テイクダウンが不可能なウェブサイトを作れるのではないでしょうか。

おわりに

VyOSまで構築できた方は、公式ファームウェアに戻してアクセスポイントモードに設定して、LANを接続し高速な匿名インターネットライフを満喫してください

参考文献

Debian + Proxmox + VYOS + NAT + IPSec + IPTables + Cheap Servers = Fun (!?)

https://arstechnica.com/civis/viewtopic.php?f=10&t=1310285

Inspired by secure-setup

https://github.com/victor-li/secure-setup

How to forward ports to your devices with iptables - Asus Merlin

https://torguard.net/knowledgebase.php?action=displayarticle&id=165

VyOS configuration for Torguard OpenVPN

https://forums.torguard.net/index.php?/topic/842-vyos-configuration-for-torguard-openvpn/