私の目標は: システムには 2 つのネットワークインターフェイスがあり、両方ともeth0
インターネットtap0
に接続されています。サービス/プログラムをオプションでバインドできる必要があります。
Apacheの例:次のような仮想ホストを作成したいと思います。
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
デフォルトでは、システムのプログラムは次の方法を使用して外部世界と通信します。しかし、また、必要に応じてIPにバインドして、着信および発信tap0
トラフィックに使用できます。はいspeedtest-cli --source="85.xxx.49.100"
:(IP at eth0
)とspeedtest-cli --source="89.xxx.xxx.4"
(IP at)を実行できるはずですtap0
。
eth0
DHCPdサーバーから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
使用することはできません。タイムアウトします。wget
89.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つのインターネットアドレスのそれぞれにバインドします。
編集する
他の回答で詳しく説明されているように、すでに機能しているソリューションがありますが、参考のためにのみ使用してください。
- OpenVPNのパスルーティングサブネット
- 錫橋初期要件を満たしてすぐに利用可能
答え2
読んだ後http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.htmliptables
私は創造性を発揮し、iproute2
これが私のユースケースに適しているようです。
- OpenVPN クライアントを起動し、
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
- 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
- セカンダリルーティングテーブル/プライマリゲートウェイを使用するよう
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)...