Ubuntu でパブリック ルーティングとプライベート ルーティングを設定する

Ubuntu でパブリック ルーティングとプライベート ルーティングを設定する

しばらく調べているのですが、これに対する良い答えが見つからないので、また数日間机に頭を打ち付ける前に質問してみようと思いました。

2 つの物理インターフェースと 1 つの仮想インターフェースを備えた Ubuntu ボックスがあります。

  eno1 - 172.16.0.100
  eno2 - 172.16.0.101
eno1:0 - x.x.x.x

私が欲しいもの

  1. 着信パケットへの応答については、要求が着信したインターフェースからパケットが送信されるようにしたいと思います。
  2. 送信パケットについては、デフォルトで送信するようにしたいのですが...

    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

問題点

  1. eno1 と eno2 には、サブネット外の範囲から散発的にアクセスできますが、eno1:0 にはまったくアクセスできません。
  2. ボックスからはインターネット (パブリック 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 が正しいポートで応答するようになりました。

ああ!またこれを忘れないようにしたい!

関連情報