web-dev-qa-db-ja.com

Linux:ドメイン名に基づくルーティング

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をこのファイルにハードコーディングしようとしましたが、起動時間の遅延とともに非常に失敗しました。

5
Twifty

ドメイン名に基づくルーティングの管理を回避することをお勧めします(ちなみに、ワイルドカードサブドメインがボーナスポイントであるかどうかに関係なく、ワイルドカードサブドメインを解決することも不可能です: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として実行する必要があります。

方法1-OpenVPN

ルーティングしているIPアドレスに変化しない静的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。

方法2-ポリシーベースのルーティング

ポリシーベースのルーティング は、特定の基準に基づいてルーティングする機能です。通常は送信元アドレスまたはプロトコルですが、この場合はルーティング前に宛先ドメイン名を検査し、マーク付きパケット(「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プロキシを設定することです。

方法2a-ipsetとdnsmasqを使用したポリシーベースのルーティング

これをすでにdnsmasqベースのルーターで実行している場合、またはクライアントがプロキシ構成をサポートしていない場合は、この方法をお勧めします。これは、ドメイン名が検索されるたびにルーティングテーブルを更新するキャッシュDNSと実質的に同じです。

長所:

  • サブドメインを処理します
  • プロキシにアクセスできないデバイスで動作します(プロキシは存在しますか?)

短所:

  • リファラーフィールドを処理しません(方法2bを参照)
  • 複雑なipsetおよびiptables構成が必要
  • VPN接続システムをルーターとして設定する必要があります(専用インターフェースが必要)
  • 私はスケーラブルなipsetがどれほどかわかりません(私のユースケースはccTLD全体です)

これは、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サーバーとして設定されている場合は、暗黙的に表示されます)。

方法2b-ポリシーベースのルーティング squidを使用

これは私のお気に入りの方法で、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経由でルーティングすることです。方法は上記と同様ですが、逆になっています。

10
Possum

Squidはソックス(sshトンネルのような)をサポートしていません...ソックスのサポートでSquidを構築するオプションがありますが、動作させるのは難しいです。

Privoxyは仕事をすることができます

  • 親靴下をサポート
  • Http/httpsプロキシをサポート
  • サポート紹介者
  • 等.

Privoxy Setup:

  1. Privoxyをインストールする

  2. 設定ファイルを編集します(/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 . 
    
  3. サービスを再起動します

    systemctl start privoxy

  4. クライアントアプリケーションでprivoxyプロキシをセットアップする

  5. リファラーをルーティングするだけでなく、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>  
    
  6. 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
    
  7. Privoxyサービスを再起動します

1
intika

Iptablesとブラウザ拡張機能を設定する代わりに、1つのツールソリューション v2ray があります。すべての主要なOSで利用できます。

v2rayは、GFWをバイパスするプロキシツールとして使用することを目的としています。 ShadowSocks、SOCKS5、HTTPSなどのさまざまなVPNプロトコルをサポートしています...さらに、ドメイン名に基づいてトラフィックをルーティングするように構成できます。

この質問をして以来。私は自分のVPNをホストし、すべてのエンドポイントでv2rayを使用しています。私のローカルシステムは、すべてのネットワークトラフィックをローカルのv2rayサービスにリダイレクト(iptablesを使用)するように構成されています。また、SOCKS5リスナーを設定し、SmartProxyと呼ばれるブラウザー拡張機能を使用して特定のドメインをフィルタリングしました。 v2rayはドメインをフィルタリングできますが、ブラウザの方が設定が簡単だと思います。

0
Twifty

ソリューション:

Sniproxyとdnsサーバーの組み合わせで作業を実行できます(これは靴下もサポートし、簡単にセットアップできます)

SNI-SSL-Proxy および nboundgithub上

0
intika