web-dev-qa-db-ja.com

LinuxでのIP転送-確認または確認するために重要なことは何ですか?

専用IPのあるWebサイトをあるサーバーから別のサーバーに移動する場合、DNS伝播遅延によるダウンタイムを最小限に抑えるために、IP転送を使用して、元のIPへのすべてのトラフィックが新しいIPに転送されるようにするアプローチがあります。

これを行うときに知っておくべき重要なことはありますか?これが私が使用する予定のステップです。セキュリティの観点から、またはその他の点で私が見逃しているものはありますか?

  1. echo "1" > /proc/sys/net/ipv4/ip_forward(または永続的に設定)
  2. iptables -t nat -A PREROUTING -d original.ip.goes.here -p tcp --dport 80 -j DNAT --to-destination new.ip.goes.here
  3. iptables -t nat -A POSTROUTING -p tcp -d new.ip.goes.here --dport 80 -j MASQUERADE
  4. サイトにSSLがある場合は、ポート443ではなくポート80に対して、#2と#3を繰り返します。

変更前にDNSレコードのTTL)を十分に下げることで、これに頼らずにダウンタイムを減らすことができることは理解していますが、ダウンタイムを最小限に抑えるには、 DNSサーバー(およびおそらくクライアント)は、TTLが短いかどうかを示すよりも長い間、レコードをキャッシュします。

編集:

不足しているものがあるのではないかと思った理由の一部は、なぜip_forwardが常に1に設定されず、代わりにデフォルトで0に設定されるのかという問題です-いくつかのセキュリティリスクがあるようにまたは、特定の状況で1に設定した場合の望ましくない動作。

2
sa289

同じマシンである場合、ファイアウォールの構成方法以外に、IP転送自体に固有の不安はありません。逆に、実サーバーのIPを非表示にすることで、何らかのセキュリティを提供できます。

ip_forwardingを有効にすることで、Linuxボックスをルーター(ネットワーク間でパケット転送を実行できる)に変えることができます。そのため、デフォルトで無効になっています。

RedHatの次の記事は、これらすべてを非常によく説明しています。

7.4。FORWARDおよびNATルール

ルールをどこに追加するかは明確ではありません。これは、パケットをインターセプトして目的の宛先にルーティングできるエッジファイアウォール/ルーター/ゲートウェイに追加する必要があるためです。それ以外の場合は機能しません。また、このルールがエッジで適用されている限り、内部ネットワークは以前と同じように保護されているため、追加のセキュリティ問題は発生しません。ただし、これはネットワーク構造によって異なります。

また、これは一時的な措置であり、ルールは後で削除されると思います。可能性のあるすべてのテストを事前に行い、期待どおりに機能することを確認してください。

1
Diamond

足りないものがあるのではないかと思った理由の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を再起動します。

4
user9517

また、サーバーが悪意のある活動に使用される可能性がある(そしておそらくそうなる)Open Routerになるため、-A ForwardingがACCEPTに設定されていないことも確認する必要があります。そうは言っても、必要なトラフィックのみを転送するルールを追加するだけで、うまくいくはずです。

転送はおそらく2つの理由で無効になっています。1つ目は、ロードされてアクティブになっているすべてのモジュールが計算能力を使用していることです。無効にすると、計算能力を節約できます。それと同じくらい簡単です。番号2はもう少し複雑です。LinuxまたはIptablesを初めて使用するユーザーがデフォルトのルールセットを使用するだけの場合、デフォルトのFORWARD受け入れポリシーがあり、これによりルーターが再びオープンします。サーバーがパケットのルーティングを開始する前に、2番目の「セキュリティ対策」が取られることを誰も望んでいないためです。

1
Flole

ip_forwarding: ip_forwardingは、パブリックIPアドレスが使用されている状況では危険な場合があります。新しくインストールされたLinuxマシンは、この方法でルーティングされることを想定していないネットワークのルーターとして使用できます。

iptables: iptablesのセットアップに関する主な問題は、おそらく新しいマシンでのルーティングです。そのマシンは、古いマシンをルーターとして使用して、マングルされたパケットを送り返す必要があります。そうすると、ルーティングの問題が発生します。ワニスなどのプロキシを使用してhttpトラフィックを転送する方が、はるかに安全/簡単です。ホスティングにApacheまたはnginxを使用している場合は、これらを新しいWebサーバーのプロキシサーバーとして設定することもできます。

1
Micha Kersloot

これには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を強制する方法は?

1
Mugurel

データセンターを数回移動しましたが、移動に伴ってフルクラス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

この転送はファイアウォールの内側に実装する必要があり、パブリックアクセスに任せないでください。

転送がデフォルトでオンに設定されていない理由については、他の応答がそれを最もよく言うかもしれません:デバイスがパケットをルーティングしていない場合、オンにすべきではありません。セキュリティリスクですか?それはすべて、サーバーの役割と構成に依存します。

お役に立てれば。

1
Gmck

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テーブルがいっぱいになるリスクを回避するために十分に低くする必要があります。

1
parkamark

このような単純なタスクには、iptableshaproxyetcは必要ありません。 rinetdをインストールするだけで、その設定ファイルは最も簡単です。

<your IP/FQDN> <your port> <where to forward IP/FQDN> <where to forward port>

つまり.

old.webserver.com 80 new.webserver.com 80
0
user1700494