2つのネットワークカードに2つのIPアドレスを持つOracle Linux 8.4を実行しているサーバーがあります。
link/ether 34:48:ed:f6:d3:5c brd ff:ff:ff:ff:ff:ff
inet 10.154.224.252/24 brd 10.154.224.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet6 fe80::3648:edff:fef6:d35c/64 scope link
valid_lft forever preferred_lft forever
3: ens2f0np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether bc:97:e1:7a:41:e0 brd ff:ff:ff:ff:ff:ff
inet 10.154.226.252/24 brd 10.154.226.255 scope global noprefixroute ens2f0np0
valid_lft forever preferred_lft forever
inet6 fe80::be97:e1ff:fe7a:41e0/64 scope link
valid_lft forever preferred_lft forever
/etc/iproute2/rt_tables
db and app
そのため、スクリプトに2つのテーブルパスを作成しました。
#!/bin/sh
ip route add 10.154.226.0/24 dev ens2f0np0 src 10.154.226.252 table db
ip route add default via 10.154.226.1 dev ens2f0np0 table db
ip rule add from 10.154.226.252/24 table db
ip rule add to 10.154.226.252/24 table db
ip route add 10.154.224.0/24 dev eno1 src 10.154.224.252 table app
ip route add default via 10.154.224.1 dev eno1 table app
ip rule add from 10.154.224.252/24 table app
ip rule add to 10.154.224.252/24 table app
ip r command show:
10.154.224.0/24 dev eno1 proto kernel scope link src 10.154.224.252 metric 100
10.154.226.0/24 dev ens2f0np0 proto kernel scope link src 10.154.226.252 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
すべてのインターフェイスでシステムにSSHで接続できますが、サーバーからインターネットまたは他のサブネットに接続することはできません。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.154.224.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1
10.154.226.0 0.0.0.0 255.255.255.0 U 100 0 0 ens2f0np0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
何か抜けましたか?この問題をどのように解決できますか?
ベストアンサー1
インターネットにアクセスできない理由は次のとおりです。基本ルーティングテーブルにはデフォルトパスはありません。
したがって、たとえば、バインドされていないTCPソケットが作成されて接続されている場合(たとえば、INADDR_ANYにバインド)、パスルックアップを使用してソケットconnect(2)
に割り当てるローカルIPアドレスを決定します。結果が何であるかを判断するためにソケットがバインドされていないため、このパスはINADDR_ANYローカルアドレスを使用します。したがって、比較された値は0.0.0.0なので一致しないため、ポリシールールを特定のソースアドレスと一致させません。基本ルーティングテーブル。
以下を使用して確認できますip route get
。
# ip route get 8.8.8.8
RTNETLINK answers: Network is unreachable
ただし、クライアントアプリケーションがアドレスをバインドする場合(たとえば、curl --interface=10.154.226.252 ifconfig.co
DNSも影響を受けるため、この例に追加する必要があります。DNS--dns-interface=10.154.226.252
サーバーが接続可能なLANにない場合)、ポリシールールが一致し、代替パスは次のとおりです。 。 Apply を使用すると接続が可能になります。
# ip route get from 10.154.226.252 104.21.25.86
104.21.25.86 from 10.154.226.252 via 10.154.226.1 dev ens2f0np0 table db uid 0
cache
# ip route get from 10.154.224.252 104.21.25.86
104.21.25.86 from 10.154.224.252 via 10.154.224.1 dev eno1 table app uid 0
cache
したがって、「デフォルト」のデフォルトパスがまだ必要です。基本クライアントアプリケーションがホストに属するIPアドレスに明示的にバインドされていない場合は、選択する必要があります。私たちを入れましょうアプリエッジを選択:
ip route add default via 10.154.224.1
だから今:
# ip route
default via 10.154.224.1 dev eno1
10.154.224.0/24 dev eno1 proto kernel scope link src 10.154.224.252
10.154.226.0/24 dev ens2f0np0 proto kernel scope link src 10.154.226.252
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
# ip route get 8.8.8.8
8.8.8.8 via 10.154.224.1 dev eno1 src 10.154.224.252 uid 0
cache
もし本物デフォルトのパスを追加する代わりに、ip rule
INADDR_ANYで成功したパスの検索を許可するように作成されたコマンドで置き換えることができます。
ip route del default
ip rule add from 0.0.0.0/32 lookup app
使用する以外は同じ結果アプリ代わりにテーブル基本テーブル:
# ip route get 8.8.8.8
8.8.8.8 via 10.154.224.1 dev eno1 table app src 10.154.224.252 uid 0
cache
どのインターフェイスが重要ではなくロードバランシングが必要な場合は、上記のデフォルトパスを代わりに使用できます。マルチパス路線:
ip route del default # was already done
ip rule del from 0.0.0.0/32 lookup app
ip route add default nexthop via 10.154.224.1 dev eno1 nexthop via 10.154.226.1 dev ens2f0np0
発信アドレスを「ランダムに」選択し(実際に信頼性の高いパスを取得するためにソースと宛先に基づいていくつかのハッシュアルゴリズムに従います)、選択したインターフェイスでバインドする暗黙的なソースアドレスを選択し、追加の送信パケットはポリシールーティングを使用します。 (ただし、ポリシールーティングがなくても、ハッシュはそれを同じインターフェイスに保持し、ループではありません。)
はい(他のシステムによって異なる場合があります。少なくとも4つの連続したIPアドレスを試してください):
# ip route get 8.8.8.9
8.8.8.9 via 10.154.224.1 dev eno1 src 10.154.224.252 uid 0
cache
# ip route get 8.8.8.10
8.8.8.10 via 10.154.226.1 dev ens2f0np0 src 10.154.226.252 uid 0
cache
マルチパスをそのまま使用するには、さまざまな注意事項があります。一部の場所では、適切なSNAT / MASQUERADEがまだ必要ですが(しかし正しく機能する必要があります)、インターフェイスへのルーティングが失敗すると、クライアント側のアンバインド接続の試行の半分が失敗します。回復メカニズムは必要ありませんが、以前は100%または0%でした。