デフォルトの送信元 IP アドレスを、デフォルト ルートに面するアドレス以外のものに変更するにはどうすればよいですか?

デフォルトの送信元 IP アドレスを、デフォルト ルートに面するアドレス以外のものに変更するにはどうすればよいですか?

背景情報

  • 私は Linux システムを使用して、パブリック IPv4 アドレスの小さなブロックのトラフィックをルーティングしています ( で IP 転送を有効にすることによりsysctrl.conf)。

  • ルータは PPPoE を使用して ISP に接続していますeth1

  • ppp に使用されるローカル ピア アドレスは、ISP によって指定された手動で構成された IP アドレスです。ローカル ピア アドレスは です10.0.0.10

  • ppp に使用されるリモート ピア アドレスも、ISP によって指定された手動で構成された IP アドレスです。リモート ピア アドレスは です10.0.0.9

  • ルーターのデフォルトルートは10.0.0.9経由です10.0.0.10

  • ルータは を介し​​てイーサネット スイッチに接続されていますeth0eth0パブリック アドレスの 1 つを使用するように構成されています。

  • スイッチは他のすべてのパブリック ホストを接続します。接続された各ホストはパブリック IP アドレスを使用します。

  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
                                                                     ...

私の問題

ルーターで実行されているプログラムを除いて、すべてが期待どおりに動作します。ルーターで実行するアプリケーションはすべて、10.0.0.10インターネットへの接続を開始するときに を送信元 IP アドレスとして使用します。 はeth1インターネットが利用可能な場所であるため、これは理解できます。ただし、アドレスはパブリックにルーティング可能ではないため、、、aptおよびpingその他のプログラムは動作しません。それをサポートするアプリケーション (つまり ) で送信元アドレスを明示的に設定するとping、アプリケーションは動作します。

私の質問

新しい接続を開始するときに、パブリック IP アドレスをデフォルトのソースとして使用しながら、不明なパケットをeth1/経由でルーティングするようにルーターを構成するにはどうすればよいですか?10.0.0.9eth0

答え1

注: ルーターのLANは192.0.2.0/24で、LAN IPはeth0具体的な説明と解決策を提供できるように、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 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 を選択する必要がある場合は、明示的に指示されない限り (例: プロセスがソケット上の送信元 IP を明示的にバインドする)、192.0.2.1 を選択します。

このルートは、リンクがダウンしてからアップするたびに再設定する必要があります。リンクが完全に確立された後、これを pppoe スクリプトに統合するかどうかは、ユーザーの責任です。

また、インターフェース名0 ...変わるかもしれないpp1 はまたは他の名前。セットアップ スクリプトでこれを処理するのはあなた次第です。


同じルート設定を設定するための別の方法:

  1. メトリックが最初に設定されているときに、より低いメトリックを追加する

    元のメトリックが設定されている場合 (つまり、0 ではなく、100 だったとします)、以前のものを置き換えるのではなく、より低いメトリックを持つ代替のデフォルト ルートを追加できます。

    # ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
    
  2. 専用ルーティングルール

    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 
    
  3. 簡略化されたルートによるルーティングルール

    メインテーブルにルートを保持し、ルール内のプレフィックスベースのサプレッサーでデフォルトルートのみを上書きすることができます。これにより、コピーする必要がなくなります。全てルート: デフォルトのルートをコピーして変更するだけです。

    2. を次のように置き換えます (優先順位を明記し、明記しない場合と同様に降順で並べます):

    # ip rule add pref 32765 iif lo lookup 109 # needed only once
    # ip rule add pref 32764 iif lo lookup main suppress_prefixlength 0 # needed only once
    
    # ip rule
    0:      from all lookup local
    32764:  from all iif lo lookup main suppress_prefixlength 0
    32765:  from all iif lo lookup 109
    32766:  from all lookup main
    32767:  from all lookup default
    
    # 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
    

    メイン ルーティング テーブルは、デフォルト ルートではないものに対して最初に使用され、次にローカルで発信された送信トラフィックに対して、ルーティング テーブル 109 でデフォルト ルートが提供されます。その他の場合は、通常どおりメイン テーブルを再度検索してデフォルト ルートを検索します。

    2. に対する利点は、テーブルから(デフォルト以外の)ルートを複製する必要がないことです。主要表109にもう入りません。下の表主要2 番目の方法とは逆に、デフォルト以外のルートの結果を提供します。

    # 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 route get 192.0.2.2
    192.0.2.2 dev eth0 src 192.0.2.1 uid 0 
        cache 
    

答え2

おっしゃるとおりです。ルーターをゲートウェイとするスイッチ上の他のクライアントはパブリック IP アドレスを持っています。ルーターにはありません。ルーターにはルーティングされない LAN アドレスがあります。インターネット サービス プロバイダーがパブリック アドレスを提供していないため、ルーターは外部に出ることができません。

別のパブリック IP がある場合は、eth1 に仮想 eth 構成を作成し、適切にルーティングします。その後、ルーターも外部に接続できるようになります。

関連情報