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

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

私の目標は: システムには 2 つのネットワークインターフェイスがあり、両方ともeth0インターネットtap0に接続されています。サービス/プログラムをオプションでバインドできる必要があります。

Apacheの例:次のような仮想ホストを作成したいと思います。

  • site1.example.com85.xxx.49.100以下で使用できるようにバインドeth0
  • site2.example.com89.xxx.xxx.5以下で使用できるようにバインドtap0
  • site3.example.com89.xxx.xxx.4以下で使用できるようにバインドtap0

eth0デフォルトでは、システムのプログラムは次の方法を使用して外部世界と通信します。しかし、また、必要に応じてIPにバインドして、着信および発信tap0トラフィックに使用できます。はいspeedtest-cli --source="85.xxx.49.100":(IP at eth0)とspeedtest-cli --source="89.xxx.xxx.4"(IP at)を実行できるはずですtap0


eth0DHCPdサーバーからIP、ゲートウェイ、およびDNSサーバーを取得する物理イーサネットインターフェースを備えたDebianシステムがあります。それは/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-静的-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

30タブネットワーク

[Match]
Name=tap0

[Network]
Bridge=br0

OpenVPNが起動すると、クライアントデバイスに入ってくるすべてのイーサネットフレームがtap0サーバーから送信されます。br0理論的には意味は私はできます。サーバー用に予約されたIPアドレスをtap0クライアントのデバイスに割り当てる。クライアントデバイスにIPを追加してみましたtap

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があり、次を使用してGoogleにpingを送信できますが、ping -I eth0 google.comたとえばソースセットをping -I tap0 google.com使用することはできません。タイムアウトします。wget89.xxx.xxx.5

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

答え1

この質問には、現実と一致しないネットワークの仕組みに関するさまざまな仮定があります。

リモートサーバーのネットワークに接続されているタブデバイスをこのコンピュータに追加しました。

「タブデバイスをリモートサーバーのネットワークに接続する」ことはできません。タップデバイスは、アプリケーションがネットワークインタフェースを制御する方法です。 Tapデバイスに接続されたアプリケーションがない場合、Tapデバイスは何もしません。

私が理解しているように、Debianシステムのデバイスに入ってくるすべてのイーサネットフレームはサーバーブリッジを介してtap送信する必要があります。br0

いいえ。

あなたができることは、ある種のトンネル(OpenVPN、Tinc、wiredeguard;さまざまなオプションがあります)を使用することです。このトンネルは、Debianコンピュータ(タブなど)にネットワークインターフェイスを作成し、サーバーにネットワークインターフェイスを作成します。サーバー上、このデバイスを発信するネットワークインターフェイスに接続できます。Debian マシンで、外部ネットワークを想定して、このデバイスに2つのIPアドレス(89.xxx.xxx.5および)を提供できます。89.xxx.xxx.6サーバー上これらも割り当てることができます。

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

編集する

他の回答で詳しく説明されているように、すでに機能しているソリューションがありますが、参考のためにのみ使用してください。

答え2

読んだ後http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.htmliptables私は創造性を発揮し、iproute2これが私のユースケースに適しているようです。

  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. IPアドレスで使用するためのセカンダリルーティングテーブルとタグを作成し、ルートを追加tap0します。
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()からの着信および発信のすべてのtcp / udpトラフィックを表示するために使用されます。89.xxx.xxx.5
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を設定しないと、デフォルトでは次のIPが使用されますeth0
speedtest
Retrieving speedtest.net configuration...
Testing from xyz (85.xxx.49.100)...
  • 以前に割り当てられたIPにバインドするtap0
speedtest --source=89.xxx.xxx.5
Retrieving speedtest.net configuration...
Testing from cpv (89.xxx.xxx.5)...

関連情報