Ubuntu 16.04では、ブラウザに入力されたドメイン名に基づいて、直接インターネットeth0
または私のVPN tun0
を介してトラフィックをルーティングしたいと思います。ローカルサイトである理由は、速度が遅いか、場所によって異なります。
カーネルルーティングテーブルはIPベースであり、ドメイン名は通常ソフトウェア層で解決されることを理解していますが、Linuxはスクリプトフレンドリーなプラットフォームであるため、回避策を期待しています。ただし、そのようなスクリプトの書き方はわかりません。
これまでのところ、Dig example.com +short @8.8.8.8
コマンドはドメインに関連付けられたIPを一覧表示し、Sudo route add -net 8.8.8.8 netmask 255.255.255.255 gw 192.168.2.1
コマンドは特定のIPのVPNをバイパスすることがわかりました(192.168.2.1は私のデフォルトeth0
)。誰かがドメイン名を含むファイルを読み取り、システムの起動時にルートルールを入力するスクリプトをテンプレート化するのに十分親切でしょうか。マスクされたサブドメインを許可するためのボーナスポイント*.example.com
。
この狂気にもっと簡単な方法があれば、それを解決策として受け入れます。
注:IPを/etc/network/interfaces
にハードコーディングすることは非常に簡単ですが、管理が難しくなります。私はまた、自分の国のすべての既知のIPをこのファイルにハードコーディングしようとしましたが、起動時間の遅延とともに非常に失敗しました。
ドメイン名に基づくルーティングの管理を回避することをお勧めします(ちなみに、ワイルドカードサブドメインがボーナスポイントであるかどうかに関係なく、ワイルドカードサブドメインを解決することも不可能です:D)。
少しわかりやすくするために、次の理由でそうすべきではありません。
1)一部のドメインはIPを時々変更します、
2)サブドメインでワイルドカードを照合することは不可能です
3)任意のドメインのすべてのサブドメインを知る/取得することは不可能です
4)任意のランダムサブドメインは、任意のランダムIPアドレスを持つことができます。
そのため、ブラウザーアドオン(および/またはSquidのようなカスタムローカルプロキシ)としての解決策は、問題に最適なオプションです。
しかし、「FoxyProxy」アドオン(元々はFirefoxアドオンですが、AFAIRCはalfo Chromeバージョンが存在する)です)がまさにあなたが望むものです。
そして、また、「FoxyProxyは有料サービスであり、あなたはすでにあなたのVPNを持っている」というあなたの通知に答えます:
FoxyProxyPlusは有料サービスですが、FoxyProxyではありません。
FoxyProxyはアドオンであり、主要なブラウザーで使用できます。
Standard Edition(Firefox) | Basic Edition(Firefox)
Standard Edition(Chrom {e、ium}) | Basic Edition(Chrom {e、ium})
したがって、VPNを介して一部のドメインに移動する場合は、次のことを行う必要があります。
1)foxyproxyがドメインのリストのsquidインスタンスを通過するためのルールを記述します
2)および/またはイカのルールリストを書く
3)iptablesを使用してsquidでhttp/httpsトラフィックを所有していないをキャプチャし、次のようなルールでsquidを指すようにします。
iptables -m owner -m multiport -t nat -A OUTPUT ! -o lo ! --uid-owner $squid_user_id -p tcp --dports 80,443,8080,... -j REDIRECT --to-ports $SQUID_PORT
(--syn
オプションは-p tcpで必要になる場合があります)
4)squidでhttp/httpsトラフィックownedをキャプチャし、次のようなルールでVPNにルーティングするようにマークします。
iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11
5)
echo 11 forcevpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table forcevpn
ip route add default via 10.0.0.1 table forcevpn
ここで、10.0.0.1
はVPN内のゲートウェイです。または、ゲートウェイがなく、vpnインターフェースのすべてのトラフィックをプッシュしたい場合は、dev $VPN_IF
の代わりにvia 10.0.0.1
を使用できます。
6)オプションで、Sudo sysctl ipv4.conf.all.rp_filter =0
の実行が必要になる場合があります
===
後もう一つ:
非http(s)TCPトラフィックで同じmagickを実行したい場合は、proxychainsのようなものが必要であり、同様のキャプチャーマジックを実行します。
そして、もしあなたがUDPでその魔法をやりたいなら、私は悪いニュースを持っています:(このプロトコルの性質のために)UDPをプロキシすることができるどんなプロキシも知りません:)
⇓⇓⇓編集⇓⇓⇓
逆のことが必要な場合(デフォルトのgw = vpn、およびISPを介して直接いくつかのドメインを支配する)、それは次のようになります:
1)foxyproxyがドメインのリストのsquidインスタンスを通過するためのルールを記述します
2)squidが所有するトラフィックownedをキャプチャし、次のようなルールで別の方法でルーティングするようにマークします。
iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11
3)
echo 11 novpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table novpn
ip route add default via ${ISP_GW} table novpn
ここで、ISP_GW
は、VPNサーバーにトラフィックをルーティングするために使用するゲートウェイです。一部のユーザーは、インターネットに接続するためにpptpを使用する場合、dev ppp0
の代わりにppp1
(またはvia ${ISP_GW}
、...、pppN
)を使用したい場合があります。
宛先ドメインに基づくルーティングは不可能ではありません。適切なツールを使用すれば、それほど難しくはありません。
特別なクライアント側の構成をほとんどまたはまったく必要としないいくつかの方法を紹介します。これらはすべて、OpenVPNを使用して接続していることを前提としています。これは他のVPNでも実現できるはずですが、VPNを立ち上げた後、さらに手動で構成する必要がある場合があります。
例として、非VPN経由でルーティングするドメインには、「example.com」、「us1.example.com」、「us2.example.com」、「geoblocked.com」のドメインを使用しますインターフェース。
すべてのコマンドはrootとして実行する必要があります。
ルーティングしているIPアドレスに変化しない静的IPがあることが確かな場合にのみ、これをお勧めします。
長所:
短所:
方法:
OpenVPN構成に次の行を追加します。
route example.com 255.255.255.255 net_gateway
route us1.example.com 255.255.255.255 net_gateway
route us2.example.com 255.255.255.255 net_gateway
route geoblocked.com 255.255.255.255 net_gateway
OpenVPNを再起動します。
それだけですが、これらのIPアドレスが変更された場合は、VPNを再起動する必要があります。
[〜#〜]注[〜#〜]:一部のソースでは、allow-pull-fqdn
も指定する必要があると述べていますが、そうではないようです私の経験ではそうです。 YMMV。
ポリシーベースのルーティング は、特定の基準に基づいてルーティングする機能です。通常は送信元アドレスまたはプロトコルですが、この場合はルーティング前に宛先ドメイン名を検査し、マーク付きパケット(「fwmark」)を使用します。
したがって、最初に行う必要があるのは、VPNルーティングパケット用に別のテーブルを作成して、VPNを通過するパケットにマークを付け、マークされたパケットを非VPNインターフェースに渡すことです。 (これは1つのアプローチであり、これにアプローチする方法は他にもたくさんあります。たとえば、VPNにメインテーブルを介して通常どおりルーティングを行わせたり、VPN以外のトラフィック用に別のテーブルを作成したりします。)
最近のシステムはおそらくデフォルトのカーネルにそれらを持っていますが、カーネルは十分に新しいものであり、適切なモジュールを備えている必要があります。
名前「vpn_table」(ルーティングテーブル名)、数字「201」(ルーティングテーブルID)と「3」(fwmark)は任意に選択されます。
(ルートとして)新しいルーティングテーブルを作成します。
echo 201 vpn_table >> /etc/iproute2/rt_tables
OpenVPNを構成します。
次のスクリプトをどこかに作成し(私は "/ etc/openvpn/client/setup-routing"と呼びます)、実行可能にします。
#!/bin/bash
ip route add 0.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
ip route add 128.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
sysctl -w net.ipv4.conf.$dev.rp_filter=2
# You can optionally leave the next two lines out but run the `ip rule add`
# command at each boot instead
ip rule del fwmark 3 table vpn_table &>/dev/null # This might fail but that's ok
ip rule add fwmark 3 table vpn_table
上記のスクリプトの変数は、OpenVPNによって環境変数として入力されます。また、これにより、「vpn_table」ルーティングテーブルのVPNゲートウェイを経由するallアドレスへのルーティングが設定されます。 VPN設定でより複雑なルーティングが必要な場合は、OpenVPNのドキュメントを参照して、適宜調整してください。
OpenVPN構成に以下を追加します。
## Policy routing
route-noexec
script-security 2
route-up /etc/openvpn/client/setup-routing
「route-noexec」行は、OpenVPNがサーバーからルートをフェッチすることを許可しますが、実際にルートを生成することを防ぎます。代わりに、ルートアップスクリプトが呼び出されます。ユーザー定義のスクリプトを呼び出すには、「script-security 2」が必要です。
これが、マークされたパケットをルーティングするために必要なすべての設定ですが、実際にパケットをマークする方法を設定する必要があります。 2つのオプションは、ipsetでdnsmasqを使用するか、Squidプロキシを設定することです。
これをすでにdnsmasqベースのルーターで実行している場合、またはクライアントがプロキシ構成をサポートしていない場合は、この方法をお勧めします。これは、ドメイン名が検索されるたびにルーティングテーブルを更新するキャッシュDNSと実質的に同じです。
長所:
短所:
これは、dnsmasqがすでに構成および設定されており、専用インターフェース「eth1」に接続されたクライアントのゲートウェイおよびDNSサーバーとして機能していることを前提としています。
Ipsetを作成します。
ipset create SKIP_VPN_IPSET iphash
Iptablesにipsetパケットをマークするように指示します(n.b.、これは実行する必要がありますipsetリストを作成した後後):
# Mark ALL packets coming in on eth1 - change this to the interface dnsmasq listens on
iptables -A PREROUTING -i eth1 -t mangle -j MARK --set-mark 3
# REMOVE mark on any addresses that match our ipset
iptables -A PREROUTING -t mangle -m set --match-set SKIP_VPN_IPSET dst -j MARK --set-mark 0/3
[〜#〜]注[〜#〜]:上記のコマンド(ipset
およびiptables
)は、起動ごとに実行します。あるいは、ご使用のOSがiptableルールとipsetsを保存/復元するためのいくつかのオプションを提供する場合があります。
NOTE2:逆! --match-set
が文書化されていますが、これを実行すると、すべてのパケットが表示されなくなりました。
以下をdnsmasq.confに追加します。
ipset=/example.com/geoblocked.com/SKIP_VPN_IPSET
当然、ルーティングしたいドメイン名を問わず、その行も調整します。これにより、[〜#〜] all [〜#〜]サブドメインもipsetに追加されるため、明示的に指定する必要はありません。 TLDを使用しても機能します。
Dnsmasqを再起動し、VPN接続されたシステムをゲートウェイとDNSの両方として使用するようにクライアントを設定します(DHCPサーバーとして設定されている場合は、暗黙的に表示されます)。
これは私のお気に入りの方法で、PS4や接続に使用する他のデバイスでうまく機能します。
長所:
短所:
これは、Squid設定が機能していて、Squid構成の基本的な知識があることを前提としています。
次の行をsquid.confに追加します。
# redirect example domains
acl domain_to_remote_proxy dstdomain .example.com
acl ref_to_remote_proxy referer_regex [^.]*\.example.com.*
# redirect geoblocked domain
acl domain_to_remote_proxy dstdomain .geoblocked.com
acl ref_to_remote_proxy referer_regex [^.]*\.geoblocked.com.*
# mark packets that we want routed through the VPN
tcp_outgoing_mark 0x03 !ref_to_remote_proxy !domain_to_remote_proxy
ドメインごとに2行あり、サブドメインが一致することに注意してください。 1行目は宛先ドメインをチェックし、2行目は「Referer」ヘッダーと一致します。ブラウザは、画像、CSS、JavaScriptなどのWebページ上のコンテンツをフェッチするときにリファラーを送信するので便利です。つまり、サイトによって要求されたコンテンツは、別のドメイン(example-cdn.comなど)でホストされている場合でも、非VPNアドレスを経由してルーティングされます。
クライアントで、通常のように接続を設定しますが、このシステムのプロキシサーバーとポートを使用するようにプロキシ設定を設定します。ほとんどのデバイス(ゲームコンソールを含む)では、システム全体の構成が可能です。 PCでは、ほとんどのブラウザは、システム設定とは関係なくプロキシを使用するように構成できます。
最後の注意-実際の使用例は、特定のドメインをVPN経由でルーティングし、それ以外のすべてを非VPN経由でルーティングすることです。方法は上記と同様ですが、逆になっています。
Squidはソックス(sshトンネルのような)をサポートしていません...ソックスのサポートでSquidを構築するオプションがありますが、動作させるのは難しいです。
Privoxyは仕事をすることができます
Privoxy Setup:
Privoxyをインストールする
設定ファイルを編集します(/etc/privoxy
のすべてを削除して/etc/privoxy/config
を追加します)
user-manual /usr/share/doc/privoxy/webserver/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile default.action
filterfile default.filter
logfile logfile
toggle 1
enable-remote-toggle 0
enable-remote-http-toggle 0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
enable-proxy-authentication-forwarding 0
forwarded-connect-retries 0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
tolerate-pipelining 1
socket-timeout 300
listen-address 127.0.0.1:8888
forward-socks5 .whatismyipaddress.com 127.0.0.1:8080 .
forward-socks5 .whatismyip.com 127.0.0.1:8080 .
サービスを再起動します
systemctl start privoxy
クライアントアプリケーションでprivoxyプロキシをセットアップする
リファラーをルーティングするだけでなく、default.actionとdefault.filterを追加したい場合は、 http://www.play-hookey.com/htmltest/ とhtmlコードを使用してテストできます
<a href="http://amibehindaproxy.com/">test-ip</a></br>
<a href="http://www.stardrifter.org/cgi-bin/ref.cgi">test-referrer</a>
default.actionおよびdefault.filter
default.action
{+client-header-tagger{referer}}
/
{+forward-override{forward-socks5 127.0.0.1:8080 .}}
TAG:.*?hookey.com
default.filter
CLIENT-HEADER-TAGGER: referer
s@^Referer:.*?$@$0@i
Privoxyサービスを再起動します
Iptablesとブラウザ拡張機能を設定する代わりに、1つのツールソリューション v2ray があります。すべての主要なOSで利用できます。
v2ray
は、GFWをバイパスするプロキシツールとして使用することを目的としています。 ShadowSocks、SOCKS5、HTTPSなどのさまざまなVPNプロトコルをサポートしています...さらに、ドメイン名に基づいてトラフィックをルーティングするように構成できます。
この質問をして以来。私は自分のVPNをホストし、すべてのエンドポイントでv2rayを使用しています。私のローカルシステムは、すべてのネットワークトラフィックをローカルのv2rayサービスにリダイレクト(iptablesを使用)するように構成されています。また、SOCKS5リスナーを設定し、SmartProxy
と呼ばれるブラウザー拡張機能を使用して特定のドメインをフィルタリングしました。 v2rayはドメインをフィルタリングできますが、ブラウザの方が設定が簡単だと思います。
ソリューション:
Sniproxyとdnsサーバーの組み合わせで作業を実行できます(これは靴下もサポートし、簡単にセットアップできます)
SNI-SSL-Proxy および nbound ( github上 )