私は問題があります。私のすべてのマシンは、モデムのETHポートに接続されているルーターの背後にあります。そのポートはダウンロード/アップロードが制限されすぎています。そこで、ルーターからモデムまでの2本のケーブルを2つのポートで接続しようとしました。私はこれを解決する方法にたくさん取り組んできました、私はもう何を試すべきかわかりません。
私のルーターには4つのインターフェースがあります:
enp1s0f0 172.16.0.3
enp4s0f1 10.0.0.6
enp1s0f1 192.168.0.3
enp4s0f0 192.168.0.6
ご覧のとおり、eth3とeth4は同じネットワーク上にありますが、これは奇妙なことです。 2つのETHポートを使用してモデム(192.168.0.1)に接続する場合は、この方法である必要がありました。
だから、これが私が試したことです:
echo "1 myorg" >> /etc/iproute2/rt_tables #added a custom routing table myorg
Sudo ip route add 192.168.0.1 scope link dev enp4s0f0 #don't know if it is really necessary
Sudo ip rule add from 192.168.0.6 table myorg
Sudo ip route add default via 192.168.0.1 dev enp4s0f0 table myorg #second default gateway through myorg table
結果としてこれらのルートを取得します:
$ ip -4 route show table main
default via 192.168.0.1 dev enp1s0f1 onlink
10.0.0.0/24 dev enp4s0f1 proto kernel scope link src 10.0.0.6
172.16.0.0/24 dev enp1s0f0 proto kernel scope link src 172.16.0.3
192.168.0.0/24 dev enp1s0f1 proto kernel scope link src 192.168.0.3
192.168.0.0/24 dev enp4s0f0 proto kernel scope link src 192.168.0.6
192.168.0.1 dev enp4s0f0 scope link
$ ip -4 route show table myorg
default via 192.168.0.1 dev enp4s0f0
$ Sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 enp1s0f1
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp4s0f1
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0f0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0f1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp4s0f0
192.168.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 enp4s0f0
私はufwをNATファイアウォールとして使用します。* natセクションに追加しました:
:POSTROUTING ACCEPT - [0:0]
-A POSTROUTING -s 172.16.0.0/24 -o enp1s0f1 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/24 -o enp4s0f0 -j MASQUERADE
あるいは、10.0.0.0ネットワークのいずれかのマシンがモデム(ゲートウェイ192.168.0.1)からping応答を受信するか、172.16.0.0ネットワークのいずれかのマシンが問題になります。瞬間によっては逆になることもありますが、理由はわかりません。
私のモデムは、2つのETHポートで両方のクライアント192.168.0.3と192.168.0.6を認識します。
それで、WANこのトポロジのすべてのマシンとすべてのネットワーク(同じネットワーク上に2つのインターフェイスを持つルーター)にアクセスすることは可能ですか?
明示的に書かれているわけではありませんが、目標は次のようにトラフィックを分割することだと思います。
OPが書いたように、これにはポリシー/ソースベースのルーティングが必要です。iptablesおよびnetfilterはめったに役に立ちません(少なくとも単独で):
ルーティングの問題を解決するためにiptablesを回避できる場合は、常に回避することをお勧めします。回避できない場合もあります(通常、iptablesはパケットにマークを追加するために使用され、このマークはip rule
エントリで使用されます)。
rp_filter=1
はほとんどのディストリビューションのデフォルトであるため、すべてのインターフェイスで設定されていると想定し、 Strict Reverse Path Forwarding を有効にします。
送信元アドレスはルールによって選択され、宛先はルーティングテーブルによって選択されます。追加のルーティングテーブルには、複数の中から1つだけを選択する必要がある場合に、ルートを(あいまいさなく)オーバーライドするのに十分な情報が含まれている必要があります(その後、このルートのみがテーブルに追加されます)。多くの場合、メインテーブルから追加のルートもコピーする必要があります。そうしないと、問題が発生する可能性があります。
私の答えでは、どちらのネットワークよりも優先することはしません。それぞれが独自のルーティングテーブルを取得します。表1を忘れて、LAN 10.0.0.0/24には表10を使用し、LAN 172.16.0.0/24には表172を使用します。 NATルールを保持し、ルールと追加のルーティングテーブル、および192.168.0.1 dev enp4s0f0 scope link
をメインから削除します。
10.0.0.0/24 <-> 10.0.0.6enp4s0f0のルート| enp4s0f1 192.168.0.6 <-> 192.168.0.1/デフォルト:
ip rule add from 10.0.0.0/24 lookup 10
ip route add table 10 10.0.0.0/24 dev enp4s0f1
ip route add table 10 192.168.0.0/24 dev enp4s0f0 src 192.168.0.6
ip route add table 10 default via 192.168.0.1
上記では、10.0.0.0/24の重複ルートエントリがないと、システム自体がこのLANにアクセスできません。ルートは、デフォルトゲートウェイを経由する必要があるとして解決されます。 StrictReverseパス転送 (SRPF)の目的で、これをデバッグするのが困難になります。追加しないと悪いことの例です。疑わしい場合は、ルートを複製してください。
上記のルールを次のように変更するための追加ルートの代わりに、他の同等のオプションがあった可能性があります。
ip rule add from 10.0.0.0/24 iif enp4s0f1 lookup 10
したがって、ローカル(ルーティングされていない)トラフィックには一致せず、メインテーブルのみが使用されます。
172.16.0.0/24のルート<-> 172.16.0.3 enp1s0f0 | enp1s0f1 192.168.0.3 <-> 192.168.0.1/デフォルト:
ip rule add from 172.16.0.0/24 lookup 172
ip route add table 172 172.16.0.0/24 dev enp1s0f0
ip route add table 172 192.168.0.0/24 dev enp1s0f1 src 192.168.0.3
ip route add table 172 default via 192.168.0.1
Linuxシステムで発信元IPアドレスを変更するときに、ローカルで開始された発信トラフィックのルート(リンク)も変更します。これはオプションである必要がありますが、ARPフラックスに関する次の部分では必須になります。
ip rule add from 192.168.0.6 lookup 10
ip rule add from 192.168.0.3 lookup 172
ルールからのオーバーライドされたルートを含む特別でない場合も複製する必要があります
ここで欠落しているルートは、2つの特別なLAN自体の間だけです。
表10で172.16.0.0/24に到達する
表172で10.0.0.0/24に到達
追加の各テーブルにはまだこの反対側へのルートがないため、デフォルトルートが使用され(ただし、SRPFによって再びブロックされます)、2つの特別なネットワークのそれぞれが相互に通信できなくなります。したがって、テーブルごとに欠落しているルートを複製するだけです。
ip route add table 10 172.16.0.0/24 dev enp1s0f0
ip route add table 172 10.0.0.0/24 dev enp4s0f1
このモデルでは、たとえば他の2つの「通常の」内部ネットワークを追加する場合、追加の設定なしで相互に通信できます(メインテーブルのデフォルトルートを使用して外部に移動します)が、ルートを複製する必要があります。 2つの特別なLANと通信するための各追加ルーティングテーブル。
ルートは問題ありませんが、まだあります...
Linuxは 弱いホストモデル に従います。これはIPルーティングの場合であり、LinuxがARP要求に応答する方法の場合も同様です。つまり、任意のIPの任意のインターフェイスからですが、もちろんインターフェイス自体のMACアドレスを使用します。これは、複数のインターフェイスが同じLAN上にある場合にすべてのインターフェイスで同時に発生する可能性があるため、通常は最速で優先されます。その後、ARP情報はリモートシステムにキャッシュされ、しばらくの間そこにとどまります。最終的にキャッシュが期限切れになり、同じことが起こり、異なる結果になる可能性があります。では、これはどのように問題を引き起こすのでしょうか?次に例を示します。
この非対称ルーティングは Strict Reverse Path Forwarding ( rp_filter
)によって捕捉され、トラフィックは失敗します。これは、数秒間ランダムに機能し、その後再び失敗するように見えることさえあります。全体的なトラフィックによっては、問題が後で他のリンクに切り替わる可能性があります(その後、問題は他のLANに切り替わります)。
幸いなことに、これを防ぐために、Linuxには、ポリシールーティングと一緒にのみ使用される設定が用意されており、ARPはルーティングで定義されたのと同じルールに従うようになっています: arp_filter
。
arp_filter-BOOLEAN
1-同じサブネット上に複数のネットワークインターフェイスを配置し、各インターフェイスのARPをカーネルがARPされたIPからそのインターフェイスからパケットをルーティングするかどうか(したがってソースベースのルーティングを使用する必要がありますこれが機能するため)。つまり、arp要求に応答するカード(通常は1)を制御できます。
sysctl -w net.ipv4.conf.enp4s0f0.arp_filter=1
sysctl -w net.ipv4.conf.enp1s0f1.arp_filter=1
これでARPの動作は正しくなりました。設定を行ったばかりの場合は、peers(ここではモデム)のARPキャッシュを強制的にフラッシュする必要があります。 arping
(fromiputils/iputils-arping)ピアにブロードキャストし、キャッシュを更新します。
arping -c 5 -I enp4s0f0 -D -s 192.168.0.6 192.168.0.6 &
arping -c 5 -I enp1s0f1 -D -s 192.168.0.3 192.168.0.3
IPアドレス192.168.0.3と192.168.0.6は、arp_filter=1
を使用して正しいARP解決を行うために、ポリシールーティングルールで一致する必要があるため、前の部分の箇条書き3の2つのルールが必須になっていることに注意してください。
ip route get
は、ルートとリバースパスフィルタリングをチェックするのに非常に便利です。
上記の箇条書き4の新しいテストケース:
# ip route get from 10.0.0.111 iif enp4s0f0 172.16.0.111
172.16.0.111 from 10.0.0.111 dev enp1s0f0 table 10
cache iif enp4s0f0
# ip route get from 172.16.0.111 iif enp1s0f0 to 10.0.0.111
10.0.0.111 from 172.16.0.111 dev enp4s0f1 table 172
cache iif enp1s0f0
ルールまたはルートを削除する場合:
# ip route get from 10.0.0.111 iif enp4s0f1 8.8.8.8
8.8.8.8 from 10.0.0.111 via 192.168.0.1 dev enp4s0f0 table 10
cache iif enp4s0f1
# ip rule del from 10.0.0.0/24 lookup 10
# ip route get from 10.0.0.111 iif enp4s0f1 8.8.8.8
8.8.8.8 from 10.0.0.111 via 192.168.0.1 dev enp1s0f1
cache iif enp4s0f1
# ip route get from 192.168.0.1 iif enp4s0f0 192.168.0.6
local 192.168.0.6 from 192.168.0.1 dev lo table local
cache <local> iif enp4s0f0
# ip rule delete from 192.168.0.6 lookup 10
# ip route get from 192.168.0.1 iif enp4s0f0 192.168.0.6
RTNETLINK answers: Invalid cross-device link
これは、ルール(の欠如)と追加のルートに応じて結果がどのように変化するかを示しています。最後の結果は、Reverse Path Forwardingチェックが失敗した(=>ドロップ)ことを示すエラーメッセージです。
次に、ARPエントリやtcpdump
などをチェックするためのip neigh
(peerシステムで最も役立ちます)があります。