AWSのEC2/Linuxインスタンスで同一サブネットに2つのNICを差し、それぞれにElasticIPを設定
異なる経路で応答しないようにひと工夫必要。大昔にロードバランサーを組んだときのおぼろげな記憶とgeminiさんによる支援で設定。
構成
下記のような構成。
EIP-1 -> ENI-1 (172.16.0.1/24)
\
EC2インスタンス
/
EIP-2 -> ENI-2 (172.16.0.2/24)
先々EIP-1,EIP-2は同一サブネットの異なるEC2インスタンスに割り当てる予定。
送信先によるアクセスフィルタリングをしているような接続元からの疎通確認用にEC2インスタンスを仮設。
LinuxではIPアドレスは特定のインターフェースに割り当てるというよりシステム全体に割り当てられる。
よって柔軟なままのデフォルト設定ではEIPがばらけてしまう模様。
カーネルパラメーター
結果として設定したのは以下のパラメーター。
cat /etc/sysctl.d/50-rp_filter
net.ipv4.conf.all.arp_ignore=1
net.ipv4.all.arp_announce=2
net.ipv4.conf.all.rp_filter=2
net.ipv4.conf.default.rp_filter=2
前提として、ip route
でポリシーベースのルーティングができてしまうような柔軟な設計になっています。
一方で、IP割当をインターフェースに縛りたいロードバランスや仮想IP割当の場合には逆に厄介で今回のような設定が必要。
まず、arp_ignore
でARPリクエスト受信の際にリクエストされたIPアドレスが設定されているインターフェースのみに応答を限定。
さらにarp_anounce
でARPリクエストを送信する際に自身のIPアドレスのみに限定。
そうした上でrp_filter
でインターフェースとIPの不一致をフィルターして捨てることで整合を保つ。
やってみて
素直にEC2を2つ立てたほうが速かった説