専用IPのあるWebサイトをあるサーバーから別のサーバーに移動する場合、DNS伝播遅延によるダウンタイムを最小限に抑えるために、IP転送を使用して、元のIPへのすべてのトラフィックが新しいIPに転送されるようにするアプローチがあります。
これを行うときに知っておくべき重要なことはありますか?これが私が使用する予定のステップです。セキュリティの観点から、またはその他の点で私が見逃しているものはありますか?
echo "1" > /proc/sys/net/ipv4/ip_forward
(または永続的に設定)iptables -t nat -A PREROUTING -d original.ip.goes.here -p tcp --dport 80 -j DNAT --to-destination new.ip.goes.here
iptables -t nat -A POSTROUTING -p tcp -d new.ip.goes.here --dport 80 -j MASQUERADE
443
ではなくポート80
に対して、#2と#3を繰り返します。変更前にDNSレコードのTTL)を十分に下げることで、これに頼らずにダウンタイムを減らすことができることは理解していますが、ダウンタイムを最小限に抑えるには、 DNSサーバー(およびおそらくクライアント)は、TTLが短いかどうかを示すよりも長い間、レコードをキャッシュします。
編集:
不足しているものがあるのではないかと思った理由の一部は、なぜip_forward
が常に1
に設定されず、代わりにデフォルトで0
に設定されるのかという問題です-いくつかのセキュリティリスクがあるようにまたは、特定の状況で1
に設定した場合の望ましくない動作。
同じマシンである場合、ファイアウォールの構成方法以外に、IP転送自体に固有の不安はありません。逆に、実サーバーのIPを非表示にすることで、何らかのセキュリティを提供できます。
ip_forwarding
を有効にすることで、Linuxボックスをルーター(ネットワーク間でパケット転送を実行できる)に変えることができます。そのため、デフォルトで無効になっています。
RedHatの次の記事は、これらすべてを非常によく説明しています。
ルールをどこに追加するかは明確ではありません。これは、パケットをインターセプトして目的の宛先にルーティングできるエッジファイアウォール/ルーター/ゲートウェイに追加する必要があるためです。それ以外の場合は機能しません。また、このルールがエッジで適用されている限り、内部ネットワークは以前と同じように保護されているため、追加のセキュリティ問題は発生しません。ただし、これはネットワーク構造によって異なります。
また、これは一時的な措置であり、ルールは後で削除されると思います。可能性のあるすべてのテストを事前に行い、期待どおりに機能することを確認してください。
足りないものがあるのではないかと思った理由の1つは、なぜip_forwardが常に1に設定されているのではなく、デフォルトで0に設定されているのかという問題です。 。
他の多くのシステムと同様に、システムがルーターである必要がない場合、ルーティングを有効にする理由はありません。
ポート80について。example.comでリッスンしているWebサーバーがすでにあるため、新しいWebサーバーへのリバースプロキシを構成するのはかなり簡単です。これを行う方法については、サーバー障害に関する例がたくさんありますが、簡単に説明します。
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://example.com/
ProxyPassReverse / http://example.com/
ServerName example.com
</VirtualHost>
ポート443のhttpsでもまったく同じことができます
<VirtualHost *:443>
ProxyPreserveHost On
ProxyPass / https://example.com/
ProxyPassReverse / https://example.com/
ServerName example.com
</VirtualHost>
他に行う必要があるのは、example.comなどのエントリを使用してローカルDNSリゾルバを構成し、グローバルDNSよりも優先して取得されるようにすることだけです。 dnsmasqのようなものはこれを簡単に行う必要があります。
特定のケースでは、事前にexample.comの新しいvhostを準備し、dnsmasqをインストールして、example.comをローカルhostsファイルに追加します。次に、準備ができたら、dnsmasqサービスを有効にして、Apacheを再起動します。
また、サーバーが悪意のある活動に使用される可能性がある(そしておそらくそうなる)Open Routerになるため、-A ForwardingがACCEPTに設定されていないことも確認する必要があります。そうは言っても、必要なトラフィックのみを転送するルールを追加するだけで、うまくいくはずです。
転送はおそらく2つの理由で無効になっています。1つ目は、ロードされてアクティブになっているすべてのモジュールが計算能力を使用していることです。無効にすると、計算能力を節約できます。それと同じくらい簡単です。番号2はもう少し複雑です。LinuxまたはIptablesを初めて使用するユーザーがデフォルトのルールセットを使用するだけの場合、デフォルトのFORWARD受け入れポリシーがあり、これによりルーターが再びオープンします。サーバーがパケットのルーティングを開始する前に、2番目の「セキュリティ対策」が取られることを誰も望んでいないためです。
ip_forwarding: ip_forwardingは、パブリックIPアドレスが使用されている状況では危険な場合があります。新しくインストールされたLinuxマシンは、この方法でルーティングされることを想定していないネットワークのルーターとして使用できます。
iptables: iptablesのセットアップに関する主な問題は、おそらく新しいマシンでのルーティングです。そのマシンは、古いマシンをルーターとして使用して、マングルされたパケットを送り返す必要があります。そうすると、ルーティングの問題が発生します。ワニスなどのプロキシを使用してhttpトラフィックを転送する方が、はるかに安全/簡単です。ホスティングにApacheまたはnginxを使用している場合は、これらを新しいWebサーバーのプロキシサーバーとして設定することもできます。
これにはhaproxyを使用できます。設定は以下にあります:
global
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
option abortonclose
no option checkcache
option redispatch
retries 3
timeout http-request 30s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout server 1m
timeout http-keep-alive 5s
timeout check 10s
maxconn 4000
# x.x.x.x = new IP
# y.y.y.y = old IP
listen l.x.x.x.x
option forwardfor header X-Real-IP
option http-server-close
source y.y.y.y
bind y.y.y.y:80
server newserver x.x.x.x:80 id 1
listen l.x.x.x.x.ssl
source y.y.y.y
mode tcp
bind y.y.y.y:443
server newserver x.x.x.x:443 id 1
また、dnsmasqを使用してDNS要求を転送することもできます-これに対する有用な答えはここserverfaultにあります 一部のホストにdnsを使用するようにdnsmasqを強制する方法は?
データセンターを数回移動しましたが、移動に伴ってフルクラスCブロックが変更されました。 snatだけでなくiptablesでもconntrackを使用するのが賢明です。
これは私が数回使用した便利な小さなスクリプトです。シンプルで魅力のように動作します。必要に応じてポートを追加します。 DNSが更新され、接続がなくなったら、iptablesルールを削除します。
#!/bin/sh
IPTABLES="/sbin/iptables"
# modify to suit
EXTERNAL="eth0"
OLDSERVER="10.10.10.1"
NEWSERVER="10.10.20.2"
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTERNAL -o $EXTERNAL -p tcp --dport 80 -d $OLDSERVER -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t nat -A PREROUTING -i $EXTERNAL -p tcp --dport 80 -d $OLDSERVER -j DNAT --to-destination $NEWSERVER
$IPTABLES -t nat -A POSTROUTING -p tcp --dport 80 -d $NEWSERVER -j SNAT --to $OLDSERVER
echo 1 > /proc/sys/net/ipv4/ip_forward
この転送はファイアウォールの内側に実装する必要があり、パブリックアクセスに任せないでください。
転送がデフォルトでオンに設定されていない理由については、他の応答がそれを最もよく言うかもしれません:デバイスがパケットをルーティングしていない場合、オンにすべきではありません。セキュリティリスクですか?それはすべて、サーバーの役割と構成に依存します。
お役に立てれば。
Iptables NATリダイレクトは機能しますが、この方法はconntrackモジュールに依存していることに注意してください。サーバーの同時リクエストが多すぎると、conntrackテーブルがいっぱいになり、ダウンタイムが発生します。もちろん、conntrackハッシュテーブルのサイズとハッシュルックアップの実行方法を増やすことができますが、これはパフォーマンスに影響を与える可能性があります。サーバーが多くのWebトラフィックを処理している場合は、これを徹底的に調査することをお勧めします。
ここでのルールでは-j MASQUERADE
も使用しません。 SNATとDNATのみ。私は以前にこれを行いました。私のルールは次のとおりです:
iptables -t nat -A PREROUTING -p tcp -s TEST_IP -d ORIGINAL_IP --dport 80 -j DNAT --to NEW_IP
iptables -t nat -A POSTROUTING -p tcp -s TEST_IP -d NEW_IP --dport 80 -j SNAT --to ORIGINAL_IP
これは、転送を単一の送信元(テスト)ホスト/ IPアドレスに制限し、このホストを使用して転送が機能することをテストできるため、便利です。問題がなければ、-s TEST_IP
を削除してこれらのルールを再適用できます。
Conntrackの過負荷に関する最初のポイントのため、私はまだDNS TTLを低くします-これにより、古いサーバーに到達するトラフィックの総量が最小限に抑えられるため、不正な要求はすべて経由して処理されますiptables NATポートリダイレクト。この場合、リクエストの量は、conntrackテーブルがいっぱいになるリスクを回避するために十分に低くする必要があります。
このような単純なタスクには、iptables
、haproxy
etcは必要ありません。 rinetd
をインストールするだけで、その設定ファイルは最も簡単です。
<your IP/FQDN> <your port> <where to forward IP/FQDN> <where to forward port>
つまり.
old.webserver.com 80 new.webserver.com 80