私の目標は:システムeth0
とtap0
に2つのネットワークインターフェイスがあり、両方ともインターネット接続が機能していることです。両方のサービス/プログラムを選択的にバインドできるはずです。
Apacheの例:次のvhostを作成したい:
site1.example.com
85.xxx.49.100
で利用可能なeth0
にバインドされていますsite2.example.com
89.xxx.xxx.5
で利用可能なtap0
にバインドされていますsite3.example.com
89.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.com
とping -I tap0 google.com
の両方でGoogleにpingを実行できますが、たとえば、ソースを89.xxx.xxx.5
に設定してwget
を使用することはできません。タイムアウトするだけです。
どうすればよいですか?ありがとうございました。
読んだ後 http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.htmliptables
とiproute2
とこれでクリエイティブになりました私のユースケースではうまくいくようです:
tap0
が作成され、L2が機能していることを確認します。89.xxx.xxx.5
をデバイスに割り当て、リンクを設定します。ip addr add 89.xxx.xxx.5/24 broadcast 89.xxx.xxx.255 dev tap0
ip link set tap0 up
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
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
いくつかのテスト:
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)...
この質問では、ネットワークがどのように機能するかについて、現実と一致しないさまざまな仮定があります。
リモートサーバーのネットワークにブリッジされているタップデバイスをこのマシンに追加しました。
「タップデバイスをリモートサーバーのネットワークにブリッジする」ことはできません。タップデバイスは、ある種のアプリケーションにネットワークインターフェイスを制御させる手段です。そのタップデバイスに接続されているアプリケーションがないと、タップデバイスはまったく何もしません。
私の理解では、Debianマシンの
tap
デバイスに入るイーサネットフレームは、サーバーのブリッジbr0
に出てくるはずです。
番号。
できることは、ある種のトンネル(OpenVPN、tinc、wirdeguard、多くのオプションがあります)を使用することです。このトンネルは、Debianマシン(タップまたはその他)に1つのネットワークインターフェイスを作成し、サーバーに1つのネットワークインターフェイスを作成します。 サーバー上、このデバイスを外向きのネットワークインターフェイスにブリッジできます。 Debianマシン上、外向きのネットワークを想定して、このデバイスに2つのIPアドレス(89.xxx.xxx.5
と89.xxx.xxx.6
)を与えることができますサーバー上それらも割り当てられます。
2つのデフォルトルートを使用しないでください。単一のデフォルトルートを使用し、ApacheをDebianマシンの3つのインターネットアドレスのそれぞれにバインドします。
編集
他の回答で詳しく説明されているように、すでに実用的なソリューションがありますが、参考のために: