web-dev-qa-db-ja.com

Debian:2つのインターフェース、2つのゲートウェイ

私の目標は:システムeth0tap0に2つのネットワークインターフェイスがあり、両方ともインターネット接続が機能していることです。両方のサービス/プログラムを選択的にバインドできるはずです。

Apacheの例:次のvhostを作成したい:

  • site1.example.com85.xxx.49.100で利用可能なeth0にバインドされています
  • site2.example.com89.xxx.xxx.5で利用可能なtap0にバインドされています
  • site3.example.com89.xxx.xxx.4で利用可能なtap0にバインドされています

システム内のプログラムは、デフォルトでeth0を使用して外部と通信する必要があります[〜#〜] but [〜#〜]tap0でIPにバインドし、それらを着信に使用することもできますおよび発信トラフィック。 speedtest-cli --source="85.xxx.49.100"eth0のIP)とspeedtest-cli --source="89.xxx.xxx.4"tap0のIP)を実行できるはずです。


物理イーサネットインターフェイスeth0を備えたDebianマシンがあります。このインターフェイスは、DHCPdサーバーからIP、ゲートウェイ、DNSサーバーを取得します。 /etc/network/interfacesには次のものがあります。

allow-hotplug eth0
no-auto-down eth0
iface eth0 inet dhcp

ネットワークがオンラインになると、ルーティングテーブルは次のようになります。

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         85.xxx.xxx.1    0.0.0.0         UG    0      0        0 eth0
85.xxx.49.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 eth0

ここで、このマシンにtapデバイス(OpenVPNを使用)を追加しました。 OpenVPNクライアントおよびサーバーはIPアドレスを割り当てません。アイデアは、マシン間にレイヤー2だけを配置することです。 OpenVPNサーバーの構成は次のとおりです。

local 89.xxx.xxx.8
port xxxx
proto udp
dev tap0
mode server
tls-server
user nobody
group nogroup
tls-version-min 1.2
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
script-security 1
client-to-client
keepalive 10 60
compress
max-clients 10
cipher AES-256-CBC
persist-key
persist-tun

サーバー上のネットワークは次のように構成されています。

10-static-eth0.network

[Match]
Name=eth0

[Network]
Bridge=br0

25-br0.netdev

[NetDev]
Name=br0
Kind=bridge

25-br0.network

[Match]
Name=br0

[Network]
DHCP=no
Address=89.xxx.xxx.8/24
Address=89.xxx.xxx.7/24
Address=89.xxx.xxx.6/24
Gateway=89.xxx.xxx.1

DNS=1.1.1.1
DNS=8.8.8.8

-tap.network

[Match]
Name=tap0

[Network]
Bridge=br0

OpenVPNを開始した後、クライアントのtap0デバイスに入るイーサネットフレームは、サーバーのbr0に出てきます。理論的には、これは平均できますサーバー用に予約されている任意のIPアドレスをクライアントのtap0デバイスに割り当てます。クライアントのtapデバイスにIPを追加しようとしました。

ip addr add 89.xxx.xxx.5/24 broadcast 89.xxx.xxx.255 dev tap0
ip link set tap0 up
route add default gw 89.xxx.xxx.1 metric 200
ip route add 89.xxx.xxx.8 via 85.xxx.xxx.1 dev eth0

IPがあり、ping -I eth0 google.comping -I tap0 google.comの両方でGoogleにpingを実行できますが、たとえば、ソースを89.xxx.xxx.5に設定してwgetを使用することはできません。タイムアウトするだけです。

どうすればよいですか?ありがとうございました。

1
TCB13

読んだ後 http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.htmliptablesiproute2とこれでクリエイティブになりました私のユースケースではうまくいくようです:

  1. OpenVPNクライアントを起動して、tap0が作成され、L2が機能していることを確認します。
  2. 89.xxx.xxx.5をデバイスに割り当て、リンクを設定します。
ip addr add 89.xxx.xxx.5/24 broadcast 89.xxx.xxx.255 dev tap0
ip link set tap0 up
  1. tap0のIPで使用するセカンダリルーティングテーブルとマーカーを作成し、ルートを追加します。
echo "1 BRIDGESERVER" >> /etc/iproute2/rt_tables

ip route add default via 89.xxx.xxx.1 dev tap0 table BRIDGESERVER

ip route add 89.xxx.xxx.8 via 85.xxx.xxx.1 dev eth0 # xxx.8 is the VPN server  and xxx.1 is the local gateway
ip route add 0.0.0.0/1 via 89.xxx.xxx.1 dev tap0 table BRIDGESERVER
ip route add 128.0.0.0/1 via 89.xxx.xxx.1 dev tap0 table BRIDGESERVER

ip route show table BRIDGESERVER
ip rule add from all fwmark 0x1 lookup BRIDGESERVER
  1. iptablesを使用して、割り当てられたIP(89.xxx.xxx.5)との間で送受信されるすべてのtcp/udpトラフィックをマークし、セカンダリルーティングテーブル/デフォルトゲートウェイを使用するようにします。
iptables -t mangle -I PREROUTING -p tcp --destination 89.xxx.xxx.5 -j MARK --set-mark 1
iptables -t mangle -I OUTPUT -p tcp --source 89.xxx.xxx.5 -j MARK --set-mark 1

iptables -t mangle -I PREROUTING -p udp --destination 89.xxx.xxx.5 -j MARK --set-mark 1
iptables -t mangle -I OUTPUT -p udp --source 89.xxx.xxx.5 -j MARK --set-mark 1

いくつかのテスト

  • バインドするソースIPを設定しないと、デフォルトでeth0のIPになります。
speedtest
Retrieving speedtest.net configuration...
Testing from xyz (85.xxx.49.100)...
  • 以前にtap0に割り当てられたIPへのバインド:
speedtest --source=89.xxx.xxx.5
Retrieving speedtest.net configuration...
Testing from cpv (89.xxx.xxx.5)...
0
TCB13

この質問では、ネットワークがどのように機能するかについて、現実と一致しないさまざまな仮定があります。

リモートサーバーのネットワークにブリッジされているタップデバイスをこのマシンに追加しました。

「タップデバイスをリモートサーバーのネットワークにブリッジする」ことはできません。タップデバイスは、ある種のアプリケーションにネットワークインターフェイスを制御させる手段です。そのタップデバイスに接続されているアプリケーションがないと、タップデバイスはまったく何もしません。

私の理解では、Debianマシンのtapデバイスに入るイーサネットフレームは、サーバーのブリッジbr0に出てくるはずです。

番号。

できることは、ある種のトンネル(OpenVPN、tinc、wirdeguard、多くのオプションがあります)を使用することです。このトンネルは、Debianマシン(タップまたはその他)に1つのネットワークインターフェイスを作成し、サーバーに1つのネットワークインターフェイスを作成します。 サーバー上、このデバイスを外向きのネットワークインターフェイスにブリッジできます。 Debianマシン上、外向きのネットワークを想定して、このデバイスに2つのIPアドレス(89.xxx.xxx.589.xxx.xxx.6)を与えることができますサーバー上それらも割り当てられます。

2つのデフォルトルートを使用しないでください。単一のデフォルトルートを使用し、ApacheをDebianマシンの3つのインターネットアドレスのそれぞれにバインドします。

編集

他の回答で詳しく説明されているように、すでに実用的なソリューションがありますが、参考のために:

1
dirkt