質問: ※こちらは前回の質問と関連しています。 次のようにBGPを利用してroute情報を交換したいのですが、 通信先のネットワークが異なりうまく通信できません。 質問は、以下の「お聞きしたいこと」に記載させていただきました。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/89f23695a383d312107b9dd3ae176cbc.png) ### 発生した問題 host2のRR(Route Reflector、172.16.1.111、赤のひし形)にhost1のルーター(10.10.10.11、黄色の丸)から通信することができませんでした。 原因と自分なりの解決策がございますが、うまい方法とは思えません。以下の通りです。 ### 原因 host1からhost2のRRへ通信を行う際、次のようなpacketを送らなければなりません。 ``` 10.10.10.11:41715 > 172.16.1.111:179* *左がsrc、右がdst ``` これは図中の赤線を通って到達することが確認できるのですが、復路(以下) ``` 172.16.1.111.bgp > 10.10.10.11.41715 ``` では非対称通信が認められないのか、青線を通ることはなく、host1にパケットが届かないのが原因でした。 ### ひとまずの解決策 次のようにすることでとりあえずは通信が可能で、経路情報を交換できました。 host2にて青線を通る復路のパケットの送信先を無理やり赤線にします。 ``` iptables -t nat -A OUTPUT -j DNAT -d 10.10.10.11 -p tcp --sport 179 --to 172.16.1.11 iptables -t nat -A OUTPUT -j DNAT -d 10.10.10.11 -p tcp --dport 179 --to 172.16.1.11:179 ``` host1にて赤線を通ってきた復路のパケットの送信先を無理やり元に戻します。 ``` iptables -t nat -A PREROUTING -i eth1 -j DNAT -p tcp --sport 179 --to 10.10.10.11 iptables -t nat -A PREROUTING -i eth1 -j DNAT -p tcp --dport 179 --to 10.10.10.11:179 ``` これでhost1からhost2のRRへ通信を行い、経路を交換できるのですが、お聞きしたいことが2点あります。 ### お聞きしたいこと 1. host1→host2は解決しますが、host2→host1は往路がそもそも届きません。 172.16.1.111:41715 > 10.10.10.11:179 送信元がプライベートアドレスだからでしょうか。 解決策がありましたらご教授いただければ幸いです。 2. 異なるネットワークに送る場合、もう少しうまい方法はないでしょうか。NATを使わないようにするためにCalicoを使っているのですが、台無しにしているように思います。 少々無理のある設定とは思いますが、何卒よろしくお願いいたします。 ### 環境 1. 図中のSwithやgatewayのルーターはクラウドプロバイダー管理下のため、設定することはできません。 2. host1、host2はlinuxサーバーです。 3. RRはcalicoのルーターと兼務させております。
回答: お聞きしたいこと 1 プライベートアドレスはグローバルネットワークでは破棄されます。 お聞きしたいこと 2 異なるネットワーク間ではrp_filterをlooseにしたり、iptablesのstateがinvalidなものはdropされる可能性があるので確認が必要です。 また、natを使うとあまりにも複雑になるので、ipsetでアドレスを管理し、iptablesでmark、pbrでrouteを管理といった具合にやると多少わかりやすくなりました。