web-dev-qa-db-ja.com

セカンダリIP(eth0:0)はメインサーバーIPのように機能します

CentOSサーバーがあり、4つの連続したIPで構成されています。
eth0 5.x.x.251
eth0:0 5.x.x.252
eth0:1 5.x.x.253
eth0:2 5.x.x.254

問題は、すべてのトラフィックが、eth0ではなくeth0:0(5.x.x.252)をソースIPとしてインターネットに送信されることです。
# curl ifconfig.me
5.x.x.252

これを修正して、すべてのトラフィックがeth0、つまり私のメインIPを経由するようにするにはどうすればよいですか?

PS:私のサーバーはXen dom0で実行されているVPSで、後者はルーテッドモードネットワーキングで構成されています。

前もって感謝します!

サーバー構成

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.251  Bcast:5.x.x.255  Mask:255.255.255.255
          inet6 addr: fe80::x:x:x:x/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14675569 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9463227 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4122016502 (3.8 GiB)  TX bytes:25959110751 (24.1 GiB)
          Interrupt:23 

eth0:0    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE   
          inet addr:5.x.x.252  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23 

eth0:1    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.253  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23 

eth0:2    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.254  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23  

# cat /etc/hosts
127.0.0.1       localhost.localdomain localhost
5.x.x.251       [fqdn] [hostname]

# cat ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=5.x.x.251
NETMASK=255.255.255.224
SCOPE="peer 5.x.y.82"

# cat ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static
ONBOOT=yes
IPADDR=5.x.x.252
NETMASK=255.255.255.224

# cat route-eth0 
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=5.x.y.82

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
5.x.y.82        0.0.0.0         255.255.255.255 UH        0 0          0 eth0
5.x.x.224       0.0.0.0         255.255.255.224 U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         5.x.y.82        0.0.0.0         UG        0 0          0 eth0

2012年8月29日更新
/etc/init.d/network restartを実行するとRTNETLINK answers: File existsエラーが表示され、デフォルトゲートウェイを使用して別のネットワークへの別のルートがあると思われます here

# /etc/init.d/network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  RTNETLINK answers: File exists
                                                           [  OK  ]

確かに、最初にip route del default via 5.x.y.82 dev eth0を削除してから、.251 IPを使用して再度追加すると、すべてが期待どおりに機能することになります。
route delコマンドをifcfg-eth0またはroute-eth0ファイルに追加する方法はありますか?これはDebianのpre-up ip addr del ...で実行できることがわかります( 詳細 )が、CentOSはどうですか?

5

このドキュメント から、少なくともCentOS 5と上記では、正しいiproute2コマンド引数を指定するだけでルートを指定できると思われます。 (IP Command Arguments Format

したがって、次のようなものを書く代わりに:

# route-eth0 
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=5.x.y.82

次のようなファイルを作成できます。

default via 5.x.y.82 dev eth0  src 5.x.x.251

テストに便利なRedhat/Redhat派生ボックスはありません。

6
Zoredache

最初に0.0.0.0デフォルトゲートウェイをクリアします

_route del -net default
_

次に、デフォルトeth0をデフォルトゲートウェイデバイスとして宣言します。

_route add -net default gw 5.x.y.82 dev eth0
_

うまくいくはずです。で確認

_ip ro li
_

これを原則として保存するには、次の厄介なことを試してください。

_/etc/sysconfig/network-scripts/network-functions_を開き、関数add_default_route ()を見つけ、その関数で_find_gateway_dev_の呼び出し後に_GATEWAYDEV="eth0"_を含む行を追加します。

何が起きるかは、_network-functions_スクリプトがどのデバイスをデフォルトゲートウェイにするかを決定することです。 _ip get route to GATEWAY_を使用してゲートウェイIPへのルートを調べ、sedを使用してデバイスを照合します。 eth0:0は毎回1になるようですので、_GATEWAYDEV="eth0"_をハードコーディングすることにより、eth0が常にゲートウェイデバイスとして選択されていることを確認します。

古いバージョンのRHでは、_/etc/sysconfig/static-routes_を編集して_default via 5.x.y.82 dev eth0_を追加するだけでした。

最後の手段として_/etc/rc.local_は常にあなたの友達です!

エイリアスIPアドレスをローカル以外の宛先への送信元アドレスとして使用しない場合は、デフォルトルートのターゲットと同じサブネットに配置しないでください。したがって、ネットマスクを255.255.255.255に変更し、ブロードキャストアドレスを削除します。

2
David Schwartz

新しいカーネルの設定の犠牲になっているように思えます。 alias promotionを有効にすると、それを超えます。

これを/etc/sysctl.confに設定します

net.ipv4.conf.all.promote_secondaries = 1

ちなみに、発信ソースIPを変更するファンキーなSNAT/MASQUERADEiptablesルールはありますか?

それらはすべて同じサブネット上にあるため、カーネルは使用するものを1つ選択します。これを確認するには、次のコマンドを実行します。

 ip addr list dev eth0

正しく動作させるには、いくつかのiptablesマジックを実行する必要があります。次を参照してください

IPエイリアスの場合、OSはどのようにしてどのIPアドレスを発信TCP/IP接続のソースとして使用するかを決定しますか?

1
Mike

routeifconfigは、ポリシーベースのルーティングについて知らない、カーネルの古い、非推奨のネットワークインターフェイスを使用します。特にルーティング関連の情報については、ipコマンドを使用する必要があります。

つまり、ip ro liまたは完全なコマンドip route list table mainは、カーネルが使用する実際のルーティングテーブルを出力します。 ip rule listは、使用中のすべてのルーティングテーブルを表示します(少なくともlocalmainおよびdefaultが必要です)。

あなたが投稿したように(から http://Pastebin.com/A1KRiWTz ):

# ip ro li
5.x.y.82 dev eth0  proto kernel  scope link  src 5.x.x.251 
5.x.x.224/27 dev eth0  proto kernel  scope link  src 5.x.x.252 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 5.x.y.82 dev eth0  src 5.x.x.252

デフォルトルートを削除し、正しい送信元アドレスで再作成する必要があります。

ip route del default 
ip route add default via 2.x.y.82 dev eth0 src 5.x.x.251 scope global

RedHatの方法(RedHat固有の構成ファイルに配置する場所)での方法はわかりませんが、/etc/rc.localを使用するとうまくいくはずです。 system-config-networkを使用してみてください

0
Hubert Kario