背景情報
sysctrl.conf
でIP転送を有効にすることにより)。eth1
経由でISPに接続しています。10.0.0.10
です。10.0.0.9
です。ルーターのデフォルトルートは、10.0.0.9
経由の10.0.0.10
です。
ルーターはeth0
を介してイーサネットスイッチに接続されています。 eth0
は、パブリックアドレスの1つを使用するように構成されています。
10.0.0.9
ISP ----------+
| 10.0.0.10 X.X.X.X
+------------- (eth1) ROUTER (eth0) --------------- SWTICH
|
+-- X.X.X.Y
+-- X.X.X.Z
...
私の問題
ルーターで実行されているプログラムを除いて、すべてが期待どおりに機能します。ルーターで実行するアプリケーションはすべて、インターネットへの接続を開始するときに、送信元IPアドレスとして10.0.0.10
を使用します。 eth1
はインターネットが利用できる場所であるため、これは理解できます。ただし、アドレスはパブリックにルーティングできないため、apt
、ping
、およびその他のプログラムは機能しません。それをサポートするアプリケーション(つまり、ping
)にソースアドレスを明示的に設定すると、アプリケーションは機能します。
私の質問
新しい接続を開始するときにデフォルトのソースとしてeth1
のパブリックIPアドレスを使用しながら、10.0.0.9
/eth0
を介して不明なパケットをルーティングするようにルーターを構成するにはどうすればよいですか?
注:ルーターのLANは192.0.2.0/24であり、eth0上のLANIPは192.0.2.1/24であると見なします。具体的な説明と解決策を提供します。
ISPは、一部のパブリックIPアドレスを節約するために、内部ルーティングの目的でプライベートIPを割り当てました。このIPは外部に表示されることを意図したものではないため、問題ありません(ISPルーターを超えてネットワークに接続された場合、またはそうでない場合は、パスに沿って 厳密なリバースパス転送 によってすぐにドロップされます。 -ルーティング可能、返信はありません)。ただし、これにより構成がより複雑になり、ルーターからISPへの接続以外のすべての場合にこのIPが使用されるのを回避できます。
あなたはおそらくこれに似たものを持っています(それは少し異なるかもしれませんが、問題ではありません):
# ip route
default via 10.0.0.9 dev ppp0
10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.1
たとえば、代わりにdefault via 10.0.0.9 dev ppp0 src 10.0.0.10
がある場合や、via 10.0.0.9
がレイヤー2リンクではなくレイヤー3リンクであるために表示されない場合があり、via
は不要です(しかし、まだ受け入れられています)。それに応じて、以下の設定を調整してください。
現在、カーネルは明らかに最も適したIPを選択します。これは、インターネットに到達するために同じ側に設定されたIPです。それ以外のことは何も指示されないためです(または、不要なIPを使用するように明示的に指示されます)。
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 10.0.0.10 uid 0
cache
カーネルがインターネットに到達する方法をチェックし、特定の優先送信元IPアドレスを指定するときに、ルーティング動作を置き換える必要があります。エラーや予期しない問題が発生した場合、接続が失われる可能性があることに注意してください。可能であれば、代替(コンソール)アクセスを使用します。
# ip route replace default via 10.0.0.9 dev ppp0 src 192.0.2.1
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 192.0.2.1 uid 0
cache
それだけです。ルーターは通常どおりルーティングしますが、ローカルで発信された発信IPを選択する必要がある場合は、特に明記されていない限り、192.0.2.1を選択します(例:ソケットでソースIPを明示的にバインドするプロセス)。
このルートは、リンクがダウンしてからアップするたびに再設定する必要があります。リンクが完全に確立された後、これをいくつかのpppoeスクリプトに統合するのはあなた次第です。
インターフェイス名ppp0がppp1またはその他に変更される可能性があることにも注意してください名前。セットアップスクリプトでこれに対処するのはあなた次第です。
これと同じルート設定を設定する別の方法:
メトリックが最初に設定されるときに、より低いメトリックを追加します
元のメトリックが設定されている場合(つまり、0ではなかった場合、たとえば100だった場合)、代わりに、前のメトリックを置き換えるのではなく、より低いメトリックで代替のデフォルトルートを追加できます。
# ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
専用ルーティングルール
上記のルートを削除する可能性のあるpppoeに関連するさまざまなツールからの相互作用が懸念される場合は、この設定を代替ルーティングテーブルにインストールし、混乱を防ぐためにメインテーブルの部分的なコピーを使用してルーティングルールで優先することができます。ルートは引き続き表示されないため、切断/再接続のたびにこれをやり直す必要があります。ここで、iif lo
は特別であり、実際には着信ではなく「ローカルで発信された発信パケット」を意味し、109は任意に選択されたテーブル値です。
# ip rule add iif lo lookup 109 # needed only once
# ip route add table 109 10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10 # to keep using 10.0.0.10 for local link, just in case
# ip route add table 109 192.0.2.0/24 dev eth0 src 192.0.2.1 # will disappear if eth0 is brought down
# ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
メインテーブルに他のルーティングエントリを追加した場合は、それらも上にコピーする必要がある可能性があります。
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0
cache
あなたが言ったように。ルーターをゲートウェイとして使用するスイッチ上の他のクライアントには、パブリックIPアドレスがあります。あなたのルーターはそうではありません。ルーティングされないLANアドレスがあります。あなたのインターネットサービスプロバイダーはあなたにパブリックアドレスを与えなかったので、ルーターは外に出ることができません。
別のパブリックIPがある場合は、eth1に仮想eth構成を作成し、適切にルーティングします。その後、ルーターも外出できます。