開発者ドキュメント

Iptablesを使用してプライベートネットワーク内のサーバーを分離する方法

序章

このチュートリアルでは、DigitalOceanプライベートネットワーキングでIptablesを使用する方法を説明します。 また、これを実行する理由についても説明し、独自の環境でこれを実装する方法の例を示します。 このチュートリアルの例では、構成を自分のニーズに適合させることができるように概念を説明します。

DigitalOceanのプライベートネットワーキングオプションは、VPSに2番目のネットワーキングインターフェイスを付与します。これは、同じデータセンターにある同じアカウントでプロビジョニングされた他のサーバーにのみアクセスできます。 つまり、Dropletのプライベートインターフェイスを介して送信されるデータには、チームのメンバーまたはDOパスワードにアクセスできるユーザーのみがアクセスできます。

注:このチュートリアルでは、IPv4セキュリティについて説明します。 Linuxでは、IPv6のセキュリティはIPv4とは別に維持されます。 例えば、 iptables IPv4アドレスのファイアウォールルールのみを維持しますが、IPv6の対応するものは ip6tables、IPv6ネットワークアドレスのファイアウォールルールを維持するために使用できます。

VPSがIPv6用に構成されている場合は、IPv4とIPv6の両方のネットワークインターフェイスを適切なツールで保護することを忘れないでください。 IPv6ツールの詳細については、次のガイドを参照してください。 LinuxVPSでIPv6を使用するようにツールを構成する方法

シナリオ例

この例では、次のチュートリアルで作成された環境を使用します: Ubuntu14.04でMySQLレプリケーションを使用してWordPressのパフォーマンスを最適化する方法。

これは、環境がどのように見えるかの図です。

サンプル環境は5つのVPSを使用します(そしてiptablesは構成されていません):

セットアップがこのように見えない場合でも、フォローできるはずです。 また、プライベートネットワーキングまたはiptablesの基本を使用したVPSの設定について詳しく知りたい場合は、次のリンクが役立つと思われます(このチュートリアルでは、iptablesの基本を理解していることを前提としています)。

すでに概念に精通していて、iptablesのセットアップを確認したい場合は、Iptables構成の概要セクションに進んでください。

私たちの目標

このチュートリアルを終了すると、次の図のような環境ができあがります。

プライベートネットワークエリア内のすべてのサーバーは、このプライベートネットワーク内の他のサーバーとのみ通信できます(オレンジ色のボックス)。 ロードバランサーはインターネット経由でアクセスでき、プライベートネットワークにもリンクされます。 このポリシーの実施は、各サーバーのiptablesを介して実装されます。

:パブリックインターフェイスへのトラフィックをブロックするには、パブリックインターフェイスを無効にするか、ファイアウォールルールを設定してIptablesで同様の効果を実現します。 ファイアウォールオプションを使用するのは、サーバーが接続を開始するときにサーバーがインターネットにアクセスできるようにしながら、不要なネットワークトラフィックをブロックするように構成できるためです(これは、サーバーに更新をダウンロードする場合などに役立ちます)。

VPSにアクセスする方法

独自のプライベートネットワークをロックダウンする方法に入る前に、サーバーにアクセスするためのさまざまな方法(特にコマンドライン)について説明します。 注意しないと自分のサーバーから自分を締め出すことができるので、サーバーに接続するためのすべての方法を知ることは特に重要です。

DigitalOcean VPSにプライベートネットワークを設定している場合は、次の3つの方法でアクセスできます。

パブリックインターフェイス

パブリックインターフェイスには、グローバルインターネット経由でアクセスできます。 これは、ロックダウンされていない限り、あなたまたはインターネット上の他の誰もがこのインターフェイスにアクセスできることを意味します。

インターネット経由でアクセスできる必要があるサーバーにはパブリックインターフェイスが必要です。これにより、顧客やユーザーは、提供しているサービスに接続できます(例: Webページまたはアプリケーション)。 ユーザーがアクセスできるようにする必要がある場合、パブリックインターフェイスのIPアドレスは通常、ドメイン名にマッピングされます(例: example.com )DNS経由。

すべてのVPSでは、デフォルトでパブリックインターフェイスが有効になっています。 このチュートリアルでは、iptablesを使用して、アプリケーションが正しく機能するために必要なネットワークトラフィックのみを受け入れるようにパブリックインターフェイスを制限します(つまり、 HTTP)。

プライベートインターフェース

プライベートインターフェイスには、同じプライベートネットワーク上の他のVPSのみがアクセスできます。 DigitalOceanの場合、これは、同じアカウントでプロビジョニングされた他のVPSのみがプライベートインターフェイスにアクセスできることを意味します。

同じアカウントで複数のVPSに接続している場合は、SSH経由で別のVPSのプライベートインターフェイスに接続できます。 たとえば、haproxy-wwwのパブリックインターフェイスにSSHで接続し、そこからmysql-1のプライベートインターフェイスにSSHで接続できます。 これは、iptablesを使用して一部のサーバーのパブリックインターフェイスからSSH接続をドロップする場合に役立ちます。

このチュートリアルでは、プライベートインターフェイスのネットワークトラフィックを、定義された「プライベートネットワーク」(上の図のオレンジ色のボックス)内のVPSとその他の必要なネットワークトラフィック(ロードバランサーとアプリケーションサーバーの間)のみに制限します。 。

コントロールパネルコンソールアクセス

パブリックインターフェイスとプライベートインターフェイスの両方にアクセスできなくなった場合は、コンソールアクセスを介してVPSに接続できます。 現実の世界では、これはキーボード、マウス、モニターをサーバーに直接接続することに似ています。 誤って両方のインターフェイスまたはSSHサービスを無効にした場合でも、この方法でVPSにいつでもアクセスできることを忘れないでください。

:VPSログインがすべてSSHキーで認証されている場合、コンソールからログインするには、コントロールパネルからrootパスワードをリセットする必要があります。

インターフェイス/ポートアクセス要件を特定する

続行する前に、インターフェイスとポートのアクセス要件を決定することが重要です。 多くのアプリケーションはデフォルトのポートを使用するか、特定のインターフェイスとポートにバインドするように構成できます。 ファイアウォールの設定を誤るとアプリケーションが破損する可能性があるため、ポリシーのニーズが確実になるまでiptablesの設定を変更しないでください。

シナリオ例のネットワークアクセスニーズの内訳は次のとおりです。

また、少なくとも1つのパブリックインターフェイスへのSSH、およびプライベートネットワークエリア上のすべてのサーバー間のSSHを許可する必要があります。 この例では、 tunnel-1 と呼ばれる別のVPSへのパブリックSSHを許可し、他のサーバーではプライベートSSHのみを許可します。他のサーバーの。 技術的には、この目的のために任意の(またはすべての)VPSを使用できます。

ファイアウォールが何を受け入れ、場合によっては削除する必要があるかがわかったので、ファイアウォールの構成に取り掛かりましょう。

Iptables構成の概要

ニーズを満たすためにiptablesを構成する方法の概要は次のとおりです。

haproxy-wwwから始めましょう。これは私たちの唯一の公開サーバーです。 で注意してください iptables コマンド、 eth0 はVPSのパブリックインターフェイスを参照し、 eth1 はVPSのプライベートインターフェイスを参照します。インターフェイス名が異なる場合は、必要に応じて置き換えてください。

パブリックサーバーの構成(haproxy-www)

トンネル-1へのSSH:

sshユーザー@ tunnel_1_public_IP

ここから、SSHでhaproxy-wwwprivateインターフェースに接続します。

sshユーザー@haproxy_www_private_IP

haproxy-www で、すべてのチェーンのデフォルトをACCEPTに設定し、既存のルールを削除します。

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F

tunnel-1がプライベートインターフェイスを介してhaproxy-wwwにSSH接続できるようにします。

sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPT sudo iptables -A OUTPUT -p tcp -d tunnel_1_private_IP --sport 22 -o eth1 -m state --state ESTABLISHED -j ACCEPT

サーバーでループバックトラフィックを許可します。 これにより、サーバーで127.0.0.1またはlocalhostを使用できるようになります。

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

サーバーから開始されるパブリックトラフィックとプライベートトラフィックを許可します。 これにより、サーバーがインターネットにアクセスして、更新プログラムやソフトウェアのダウンロードなどを実行できるようになります。

sudo iptables -I OUTPUT -o eth0 -d 0.0.0.0/0 -j ACCEPT sudo iptables -I INPUT -i eth0 -m state --state ESTABLISHED、RELATED -j ACCEPT

パブリックインターフェイスですべてのHTTPトラフィック(ポート80)を許可します。 This is necessary so users can access our site via *http://www.example.com/*:

sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW、ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED- j受け入れる

両方のWordPressサーバーがプライベートIPアドレスを介してポート80にアクセスできるようにします。

sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP --sport 80 -j ACCEPT sudo iptables -A OUTPUT -p tcp -d wordpress_1_private_IP --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP --sport 80 -j ACCEPT sudo iptables -A OUTPUT -p tcp -d wordpress_2_private_IP --dport 80 -j ACCEPT

必要なすべてのネットワークトラフィックを許可したので、次のように設定することで他のすべてのトラフィックをドロップできます。 DROP 各iptablesチェーンのデフォルトの動作として:

sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP

haproxy-wwwのファイアウォールの構成が完了したので、すべてが正しく機能することを確認する必要があります。 構成に満足している場合は、次のaptコマンドを使用してiptables-persistentパッケージをインストールすることで構成を保存できます。

sudo apt-get update
sudo apt-get install iptables-persistent

iptables-persistentのインストール中に、現在のファイアウォール設定を保存するかどうかを尋ねられます。 はいと答えます。

これで、haproxy-wwwファイアウォールで次のことが可能になります。

残りのサーバーの保護に移りましょう。

プライベートネットワークサーバーの構成

:残りのすべてのサーバーに対して次のすべての手順を実行します: wordpress-1 wordpress-2 mysql-1 、および[X127X ]mysql-2。 このセクションでは、これらのサーバーを一般的にprivate-VPSと呼びます。

プライベートネットワーク内での通信を必要とするネットワークインターフェイスとポートの数が多いため、特定のIPアドレスとポートの組み合わせのみを許可するのではなく、必要なIPアドレスをホワイトリストに登録することで作業を簡素化します。 また、デフォルトで発信トラフィックを許可し、着信トラフィックのみを制限します。

トンネル-1へのSSH:

sshユーザー@ tunnel_1_public_IP

ここから、SSHでprivate-VPSprivateインターフェースに接続します。

sshユーザー@private_VPS_private_IP

private-VPS で、すべてのチェーンのデフォルトをACCEPTに設定し、既存のルールを削除します。

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F

tunnel-1がプライベートインターフェイスを介してprivate-VPSにSSH接続できるようにします。

sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPT

サーバーでループバックトラフィックを許可します。 これにより、サーバーで127.0.0.1またはlocalhostを使用できるようになります。

sudo iptables -A INPUT -i lo -j ACCEPT

サーバーから開始されるパブリックトラフィックとプライベートトラフィックを許可します。 これにより、サーバーがインターネットにアクセスして、更新プログラムやソフトウェアのダウンロードなどを実行できるようになります。

sudo iptables -I INPUT -i eth0 -m state --state ESTABLISHED、RELATED -j ACCEPT

プライベートネットワークエリアへのアクセスのみが必要なすべてのサーバーをホワイトリストに登録します(作業中のサーバーのエントリは省略できます)。

sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP -j ACCEPT sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP -j ACCEPT sudo iptables -A INPUT -p tcp -s mysql_1_private_IP -j ACCEPT sudo iptables -A INPUT -s mysql_2_private_IP -j ACCEPT

両方のWordPressサーバーでのみ、 haproxy-www HTTPアクセス(ポート80)を許可して、ページを取得できるようにします。

sudo iptables -A INPUT -p tcp -s haproxy_www_private_IP --sport 80 -j ACCEPT sudo iptables -A OUTPUT -p tcp -d haproxy_www_private_IP --dport 80 -j ACCEPT

デフォルトでは、INPUTチェーンとFORWARDチェーンを削除します。 プライベートネットワーク上のサーバーを信頼しているため、OUTPUTのデフォルトをACCEPTのままにしていることに注意してください。

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP

プライベートVPSのファイアウォールの構成が完了したので、すべてが正しく機能することを確認する必要があります。 構成に満足している場合は、次のaptコマンドを使用してiptables-persistentパッケージをインストールすることで構成を保存できます。

sudo apt-get update
sudo apt-get install iptables-persistent

iptables-persistentのインストール中に、現在のファイアウォール設定を保存するかどうかを尋ねられます。 はいと答えます。

これで、private-VPSファイアウォールで次のことが可能になります。

トラブルシューティング:Iptablesリストとロギング

ファイアウォールを構成し、アプリケーションが機能しなくなった場合、ファイアウォールのトラブルシューティングを行う最善の方法は、ポリシーリストとログを確認することです。

Iptables構成を表示する

iptables構成またはポリシーリストを表示するには、次のコマンドを実行します。

sudo iptables -vL --line-numbers

これにより、設定したすべてのチェーンとルールが行番号とともに表示されます。 また、ドロップされたパケットの数も表示されます。 ドロップされたパケットがないと予想される場合は、ログを確認してください。

Iptablesログを読む

LOGという新しいチェーンを作成します。

iptables -N LOG

INPUT / OUTPUT / FORWARDをLOGチェーンにルーティングします(置換 CHAIN 「INPUT」など、監視するチェーンを使用する場合):

iptables -A INPUT -j LOG

次に、次のコマンドを使用してパケットをログに記録します。

iptables -A LOG -m limit --limit 60/min -j LOG --log-prefix "Iptables DROP: " --log-level 7

これで、システムメッセージを監視して、ドロップされているパケットを確認できます。

Ubuntuでは、次のコマンドを使用してメッセージをリアルタイムで読み取ることができます。

sudo tail -f /var/log/syslog

CentOSでは、次のコマンドを使用してメッセージをリアルタイムで読み取ることができます。

sudo tail -f /var/log/messages

ログには、インターフェイス、送信元ポート、宛先ポート、およびドロップされた各パケットに関するその他の情報が一覧表示されます。 これは、発生する可能性のある問題を把握するのに役立ちます。

結論

このチュートリアルを実行すると、iptablesを使用して、パブリックインターネットおよび同じ共有プライベートネットワーク内の他のVPSからVPSを保護するための優れた基盤が得られるはずです(つまり、 同じデータセンター)。 新しいサーバーを追加したり、サーバーの設定を変更したりする場合は、ファイアウォールを更新する必要があることに注意してください。

モバイルバージョンを終了