私はあなたの質問に決定的な正しい答えがあるとは思いません。代わりに、あなたが望むものに近づく方法の大きな束があります。したがって、それを実行する方法のヒントをいくつか提供します。
マシンに3つ以上のインターフェースがある場合(lo
1つとしてカウント)、適切なインターフェースを簡単に自動検出するのに問題があります。ここでは、その方法に関するいくつかのレシピを示します。
たとえば問題は、ホストがNATファイアウォールの背後にあるDMZ内にあり、パブリックIPをプライベートIPに変更してリクエストを転送する場合です。お使いのマシンには10個のインターフェイスがありますが、パブリックインターフェイスに対応するのは1つだけです。
ファイアウォールがソースIPをまったく異なるものに変換するダブルNATを使用している場合、自動検出も機能しません。したがって、デフォルトのルートがパブリックインターフェースを備えたインターフェースに通じているかどうかさえ確信できません。
デフォルトルートを介して検出する
これは私が物事を自動検出するための推奨される方法です
ip r get 1.1.1.1
通常のようなものは、デフォルトルートを持つインターフェースを教えてくれます。
これをお気に入りのスクリプト/プログラミング言語で再現したい場合strace ip r get 1.1.1.1
は、黄色いレンガの道を使用してください。
とセット /etc/hosts
これは、あなたが管理を続けたい場合の私の推奨事項です
の/etc/hosts
ようなエントリを作成できます
80.190.1.3 publicinterfaceip
次に、このエイリアスpublicinterfaceip
を使用してパブリックインターフェイスを参照できます。
悲しいことにhaproxy
IPv6でこのトリックを巧みにこなすことはありません
環境を利用する
これは、/etc/hosts
あなたがそうでない場合のための良い回避策ですroot
と同じ/etc/hosts
。これには環境を使用します。あなたは試すことができます/etc/profile
か~/.profile
、このため。
したがって、プログラムに変数が必要MYPUBLICIP
な場合は、次のようなコードを含めることができます(これはCです。自由にC ++を作成してください)。
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
あなたのスクリプト/プログラムを呼び出すことができますので/path/to/your/script
、このように
MYPUBLICIP=80.190.1.3 /path/to/your/script
これでも動作します crontab
ます。
すべてのインターフェースを列挙し、不要なインターフェースを排除する
使えないなら必死の方法 ip
不要なものがわかっている場合は、すべてのインターフェースを列挙し、すべての誤ったインターフェースを無視できます。
これはすでに回答のようですhttps://stackoverflow.com/a/265978/490291、このアプローチようです。
DLNAのようにする
酒に溺れる酒酔い男の道
ネットワーク上のすべてのUPnPゲートウェイを列挙しようとすることができます。これにより、いくつかの "外部"の適切なルートを見つけることができます。これは、デフォルトルートが指し示していないルート上にある場合もあります。
詳細については、https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocolを参照してください
これにより、デフォルトルートが他の場所を指している場合でも、どれが実際のパブリックインターフェイスであるかがわかります。
さらにあります
山と預言者が出会う場所
IPv6ルーターは、適切なIPv6プレフィックスを提供するようにアドバタイズします。プレフィックスを見ると、内部IPかグローバルIPかがわかります。
IGMPまたはIBGPフレームをリッスンして、適切なゲートウェイを見つけることができます。
IPアドレスが2 ^ 32未満です。したがって、LANでそれらすべてにpingを実行するだけでは時間がかかりません。これは、あなたの視点から、インターネットの大部分がどこにあるかに関する統計的なヒントを与えます。ただし、有名なhttps://de.wikipedia.org/wiki/SQL_Slammerよりも少し賢明である必要があります
ICMPやARPも、ネットワークサイドバンド情報の優れたソースです。それもあなたを助けるかもしれません。
イーサネットブロードキャストアドレスを使用して、DHCP(DHCPv6も含む)など、多くの場合に役立つすべてのネットワークインフラストラクチャデバイスに接続できます。
ネットワークデバイスのすべての製造元が、自社のデバイスを自動検出する方法に関する新しいセキュリティホールを忙しく発明しているため、この追加リストはおそらく無限で常に不完全です。これは多くの場合、存在しないはずのパブリックインターフェイスを検出する方法に大きく役立ちます。
'言っ途切れる。でる。