- PR -

ipablesで仮想IPアドレスへのNAT

投稿者投稿内容
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2007-04-29 17:52
iptablesについていお聞きします。

インターネット
   |
ルータ PC:192.168.1.1
   |
Webサーバ:192.168.1.3

外部からのアクセスについて、例えば、
22ポートを受け入れる場合、

iptables -A INPUT -i ppp0 -p tcp --dport 22 -j ACCEPT

で、うまく動いています。

80ポートをWebサーバへフォワードする場合、

iptables -A FORWARD -i ppp0 -p tcp -d 192.168.1.3 --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.1.3

で、うまく動いています。


ルータ PC:192.168.1.1 に仮想IPアドレスを設定しました。
これをメールサーバのアドレスとします。
----
eth0:mail Link encap:Ethernet HWaddr 00:10:18:14:4A:01
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:169
----

このNAT変換はどのように記述すればよいでしょうか?

iptables -A INPUT -i ppp0 -p tcp --dport 25 -j ACCEPT

とか、

iptables -A FORWARD -i ppp0 -p tcp -d 192.168.1.12 --dport 25 -j ACCEPT
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 25 -j DNAT --to 192.168.1.12

とか、いろいろやってみましたが、うまくいきませんでした。

よろしくお願いいたします。


[ メッセージ編集済み 編集者: Jumpin' Jack Flash 編集日時 2007-04-29 17:53 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-29 20:25
引用:

Jumpin' Jack Flashさんの書き込み (2007-04-29 17:52) より:
ルータ PC:192.168.1.1 に仮想IPアドレスを設定しました。
これをメールサーバのアドレスとします。


近い構成で試したことないので合っているか不明ですが、
このルータの仮想IPに向けてDNATすれば良さそうに思います。

ところで、仮想IPってLVS辺りの機能を使っているんですよね?

引用:

----
eth0:mail Link encap:Ethernet HWaddr 00:10:18:14:4A:01
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:169
----


これって物理インタフェースじゃないですか?
普通はエイリアスになりませんか?
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2007-04-29 22:16
引用:

あしゅさんの書き込み (2007-04-29 20:25) より:
近い構成で試したことないので合っているか不明ですが、
このルータの仮想IPに向けてDNATすれば良さそうに思います。



iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 25 -j DNAT --to 192.168.1.12

これだけでよいということでしょうか。
やってみましたが、送信はできませんでした。
どうも iptablesに弱くて、何度も調べているのですが、
完全な理解に至りません。
どうか、具体的な設定方法を教えてもらえないでしょうか。

引用:

ところで、仮想IPってLVS辺りの機能を使っているんですよね?

引用:

----
eth0:mail Link encap:Ethernet HWaddr 00:10:18:14:4A:01
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:169
----


これって物理インタフェースじゃないですか?
普通はエイリアスになりませんか?



どうやら、仮想IPも理解できていないようです。
最近、うすうす間違っていることに感づいてきたのですが、仮想IPって
のは、どのサーバにもそのIPアドレスをインターフェースに設定せず、
通りがかったそのIPアドレス宛のパケットを処理するってことですか?
イマイチ自分でも何が言いたいのかわからないです。

逆に、この件、物理インタフェースを設定してはダメですか?

よろしくお願いいたします。


[ メッセージ編集済み 編集者: Jumpin' Jack Flash 編集日時 2007-04-30 01:46 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-30 01:04
この辺は詳しくないので間違ってるかもしれません・・・。

ルータが192.168.1.1となっていて、同一セグメント内に仮想IPを
構築しようとしているのに、192.168.1.12の物理インタフェースを
「仮想IP」と呼んでいる理由がわからなかったからです。

引用:

Jumpin' Jack Flashさんの書き込み (2007-04-29 22:16) より:
最近、うすうす間違っていることに感づいてきたのですが、仮想IPって
のは、どのサーバにもそのIPアドレスをインターフェースに設定せず、
通りがかったそのIPアドレス宛のパケットを処理するってことですか?


仮想IPは、複数ノードに同じIPアドレスを付与するためのものです。
ロードバランサを複数台置いて、アクティブなものがダウンした時に
他のものにフェイルオーバーさせたい場合などに使います。

Ethernetでは、同一ネットワーク宛のIPパケットは、
宛先IPアドレスに対応するMACアドレス宛に送られます。

その対応付けに利用する各機器のARPテーブルに小細工することで、
同じIPアドレスを共有している複数のノードのうち、
アクティブなものにパケットが送られるようにするわけです。

で、アクティブ側がダウンした場合は、待機していたノードが
自分がそのアドレスを示すようにARPテーブルを更新します。

#物理インタフェースを仮想IPとして共有できるかは知りません。
#非アクティブ側がIPアドレスを持っていると主張しなければ
#不可能ではなさそうにも思えますが、どうなんでしょう?

http://ultramonkey.jp/2.0.1/topologies/lb-eg.html
おそらくこのトポロジで構築しようとされているんですよね?
これならば物理IPでそのまま負荷分散してしまえば楽だと思います。
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2007-04-30 02:54
ご教授いただきありがとうございます。

単純に
----
eth0:mail Link encap:Ethernet HWaddr 00:10:18:14:4A:01
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:169
----
この設定を削除すれば、仮想IPになるのでしょうか?
VRRPの設定が必須になるのでしょうか?
あしゅさんのご説明は、そのあたりの話だと思います。
keepalived や ldirectord あたりがそれをやってくれるのだと認識しております。

ただ、今回、ロードバランサ自体の冗長化は、後回しにしようと思っております。
いろいろと疑問があるからです。それは、また改めて質問させていただきたいと
思います。
よって、
引用:

http://ultramonkey.jp/2.0.1/topologies/lb-eg.html
おそらくこのトポロジで構築しようとされているんですよね?
これならば物理IPでそのまま負荷分散してしまえば楽だと思います。


このトポロジです。

さて、物理IPで問題なければ、単純にiptablesによるNATだけの話になると思います。
聞きたかったことはそれだけです("仮想IP"という言葉の使い方は間違えましたが)。

改めてお聞きします。
ルータPCのWAN側からの25ポートへのアクセスをiptablesで同PCの物理IPアドレス
192.168.1.12:25へ変換する方法を教えてください。

よろしくお願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-30 04:25
今までのやりとりから考えると、iptables上では
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 25 -j DNAT --to 192.168.1.12
この設定で良さそうな気がします。

ただ、先ほどのUltra Monkeyのサイトのトポロジだと、
iptablesとipvsの両者でmasqueradingを行うことになるのですが、
よく考えてみるとこういった動作が可能なのかどうかわかりません。

あくまで仮定の話なのですが、

例えば、ppp0が111.111.1.1だとして、
クライアント(222.222.2.2)からアクセスがあった場合に、
パケットの処理順序がiptables -> ipvsだと仮定すると、

1. 最初にルータに到達したパケット
[src=222.222.2.2:12345,dst=111.111.1.1:80]

2. iptablesを通過した後のパケット
[src=222.222.2.2:12345,dst=192.168.1.12:80]

3. ipvsを通過した後のパケット
[src=222.222.2.2:12345,dst=192.168.1.3:80]

となり、Webサーバへ到達します。

Webサーバから送られてくる復路のパケットは
[src=192.168.1.3:80,dst=222.222.2.2:12345]
というアドレス構成になるはずですが、

iptablesは2で変換した[192.168.1.12:80,222.222.2.2:12345]
という組み合わせでTCPセッションを記憶しているため、
最初にiptablesを通過するのであれば拒否されてしまいます。

一度、別のルータとは別のマシンでロードバランスさせて、
そこにルータからDNATできるか試してみてはいかがでしょうか。
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2007-04-30 08:58
引用:

あしゅさんの書き込み (2007-04-30 04:25) より:
あくまで仮定の話なのですが、

例えば、ppp0が111.111.1.1だとして、
クライアント(222.222.2.2)からアクセスがあった場合に、
パケットの処理順序がiptables -> ipvsだと仮定すると、

1. 最初にルータに到達したパケット
[src=222.222.2.2:12345,dst=111.111.1.1:80]

2. iptablesを通過した後のパケット
[src=222.222.2.2:12345,dst=192.168.1.12:80]

3. ipvsを通過した後のパケット
[src=222.222.2.2:12345,dst=192.168.1.3:80]

となり、Webサーバへ到達します。

Webサーバから送られてくる復路のパケットは
[src=192.168.1.3:80,dst=222.222.2.2:12345]
というアドレス構成になるはずですが、

iptablesは2で変換した[192.168.1.12:80,222.222.2.2:12345]
という組み合わせでTCPセッションを記憶しているため、
最初にiptablesを通過するのであれば拒否されてしまいます。



ここまで、先読みしてのご意見だったのですね。
単純にiptablesによるNATだけの話ではなかったのですね。

ちなみに、SMTP(25ポート)です。

その現象を確認したいと思い、
# tcpdump -n port 25
としましたが、何も表示されません。
パケットの流れを確認する方法はないでしょうか?

それに、一般的に、WAN側からのパケットをLVSなどのソフトウェアで
ロードバランスする(http:80ポートでもよい)って、どうやっている
のでしょうか?
今回やろうとしていることが、決して奇抜には思えないのですが。

よろしくお願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-30 13:15
引用:

Jumpin' Jack Flashさんの書き込み (2007-04-30 08:58) より:
その現象を確認したいと思い、
# tcpdump -n port 25
としましたが、何も表示されません。
パケットの流れを確認する方法はないでしょうか?


ちょっと実験してみました。

iptablesのみで自ホストの別アドレスにDNATは出来ましたが、
LVSなアドレスに対してDNATした場合はエラーになりました。

ルータ側のdmesgに残っていたログはこんな感じです。
ip_rt_bug: 192.168.1.219 -> 192.168.9.1, eth0

二段階のDNATは出来ないのかもしれません。

引用:

それに、一般的に、WAN側からのパケットをLVSなどのソフトウェアで
ロードバランスする(http:80ポートでもよい)って、どうやっている
のでしょうか?
今回やろうとしていることが、決して奇抜には思えないのですが。


普通に見かける構成ではないと思います。
先ほどのUltra Monkeyのサイトでは、LVSのサービスアドレスは
WAN側となっており、iptablesと二段階のDNATは必要ありません。

でも、PPPはおそらく動的アドレスなんですよね?
動的アドレスだとWAN側でLVSするのは厳しそうです。

解決策として使えそうなものは、
ルータではなく実サーバ側でロードバランスするくらいでしょうか?
http://ultramonkey.jp/2.0.1/topologies/sl-ha-lb-eg.html

どのみち実サーバは冗長構成にするはずなので、
そちらでLVSも冗長構成にすれば可用性でも問題ないと思います。

他に詳しい方がいたら、訂正お願いします。
この辺は全く自信のない分野なので・・・。

スキルアップ/キャリアアップ(JOB@IT)