
しばらく調べているのですが、これに対する良い答えが見つからないので、また数日間机に頭を打ち付ける前に質問してみようと思いました。
2 つの物理インターフェースと 1 つの仮想インターフェースを備えた Ubuntu ボックスがあります。
eno1 - 172.16.0.100
eno2 - 172.16.0.101
eno1:0 - x.x.x.x
私が欲しいもの
- 着信パケットへの応答については、要求が着信したインターフェースからパケットが送信されるようにしたいと思います。
送信パケットについては、デフォルトで送信するようにしたいのですが...
a. eno1 - プライベートネットワーク宛てのパケット(複数の非連続な 172.16.x.0 範囲) b. eno1:0 - その他すべてのネットワーク宛てのパケット
現在の設定
IPルールリスト
0: from all lookup local
32760: from all to x.x.x.x lookup eno1:0
32761: from x.x.x.x lookup eno1:0
32762: from all to 172.16.0.101 lookup eno2
32763: from 172.16.0.101 lookup eno2
32764: from all to 172.16.0.100 lookup eno1
32765: from 172.16.0.100 lookup eno1
32766: from all lookup main
32767: from all lookup default
IP ルート リスト テーブル eno1:0
default via x.x.x.1 dev eno1
IP ルート リスト テーブル eno1
default via 172.16.0.1 dev eno1
172.16.0.0/24 dev eno1 scope link src 172.16.0.100
IP ルート リスト テーブル eno2
default via 172.16.0.1 dev eno2
172.16.0.0/24 dev eno2 scope link src 172.16.0.101
IP ルート リスト
default via 172.16.0.1 dev eno1 onlink
x.x.x.0/23 dev eno1 proto kernel scope link src x.x.x.x
172.16.0.0/24 dev eno2 proto kernel scope link src 172.16.0.101
172.16.0.0/24 dev eno1 proto kernel scope link src 172.16.0.100
eno1 と eno2 の両方の sysctl 値
arp_filter=1
arp_ignore=1
arp_announce=2
問題点
- eno1 と eno2 には、サブネット外の範囲から散発的にアクセスできますが、eno1:0 にはまったくアクセスできません。
- ボックスからはインターネット (パブリック IP) にまったくアクセスできません。
答え1
答えを発見しました - いや、むしろ再発見しました...
問題は、Unix がポートではなくホストをネットワーク エンティティであると認識していることです。このため、マルチホーム サーバーであらゆる種類の ARP 問題が発生します。したがって、基本的に、インターフェイス上の ARP 応答をそのインターフェイスに関連付けられた IP アドレスに制限する必要がありました。そうしないと、Unix は IP に関係なく、どのインターフェイスでも応答してしまいます。これは、サブネット上の他のすべてのデバイスを非常に混乱させます。
ということで... arptablesをインストールしました
sudo apt-get -y install arptables
各インターフェースの応答をインターフェース上のIPに制限する
sudo arptables -n -v --line-numbers -L
Chain INPUT (policy DROP 6011K packets, 168M bytes)
1 -j ACCEPT -i eno1 -o * -d x.x.x.x , pcnt=2496 -- bcnt=69888
2 -j ACCEPT -i eno1 -o * -d 172.16.0.100 , pcnt=294 -- bcnt=8232
3 -j ACCEPT -i eno2 -o * -d 172.16.0.101 , pcnt=294 -- bcnt=8232
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
1 -j ACCEPT -i * -o eno1 -s x.x.x.x , pcnt=2503 -- bcnt=70084
2 -j ACCEPT -i * -o eno1 -s 172.16.0.100 , pcnt=295 -- bcnt=8260
3 -j ACCEPT -i * -o eno2 -s 172.16.0.101 , pcnt=294 -- bcnt=8232
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
すると、すべての IP が正しいポートで応答するようになりました。
ああ!またこれを忘れないようにしたい!