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はどうですか?
このドキュメント から、少なくとも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派生ボックスはありません。
最初に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
に変更し、ブロードキャストアドレスを削除します。
新しいカーネルの設定の犠牲になっているように思えます。 alias promotion
を有効にすると、それを超えます。
これを/etc/sysctl.conf
に設定します
net.ipv4.conf.all.promote_secondaries = 1
ちなみに、発信ソースIPを変更するファンキーなSNAT/MASQUERADE
iptables
ルールはありますか?
それらはすべて同じサブネット上にあるため、カーネルは使用するものを1つ選択します。これを確認するには、次のコマンドを実行します。
ip addr list dev eth0
正しく動作させるには、いくつかのiptablesマジックを実行する必要があります。次を参照してください
IPエイリアスの場合、OSはどのようにしてどのIPアドレスを発信TCP/IP接続のソースとして使用するかを決定しますか?
route
とifconfig
は、ポリシーベースのルーティングについて知らない、カーネルの古い、非推奨のネットワークインターフェイスを使用します。特にルーティング関連の情報については、ip
コマンドを使用する必要があります。
つまり、ip ro li
または完全なコマンドip route list table main
は、カーネルが使用する実際のルーティングテーブルを出力します。 ip rule list
は、使用中のすべてのルーティングテーブルを表示します(少なくともlocal
、main
および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
を使用してみてください