序章
このチュートリアルでは、DigitalOceanプライベートネットワーキングでIptablesを使用する方法を説明します。 また、これを実行する理由についても説明し、独自の環境でこれを実装する方法の例を示します。 このチュートリアルの例では、構成を自分のニーズに適合させることができるように概念を説明します。
DigitalOceanのプライベートネットワーキングオプションは、VPSに2番目のネットワーキングインターフェイスを付与します。これは、同じデータセンターにある同じアカウントでプロビジョニングされた他のサーバーにのみアクセスできます。 つまり、Dropletのプライベートインターフェイスを介して送信されるデータには、チームのメンバーまたはDOパスワードにアクセスできるユーザーのみがアクセスできます。
注:このチュートリアルでは、IPv4セキュリティについて説明します。 Linuxでは、IPv6のセキュリティはIPv4とは別に維持されます。 たとえば、iptables
はIPv4アドレスのファイアウォールルールのみを維持しますが、ip6tables
と呼ばれるIPv6の対応物があり、IPv6ネットワークアドレスのファイアウォールルールを維持するために使用できます。
VPSがIPv6用に構成されている場合は、IPv4とIPv6の両方のネットワークインターフェイスを適切なツールで保護することを忘れないでください。 IPv6ツールの詳細については、次のガイドを参照してください。 LinuxVPSでIPv6を使用するようにツールを構成する方法。
シナリオ例
この例では、次のチュートリアルで作成された環境を使用します: Ubuntu14.04でMySQLレプリケーションを使用してWordPressのパフォーマンスを最適化する方法。
これは、環境がどのように見えるかの図です。
サンプル環境は5つのVPSを使用します(そしてiptablesは構成されていません):
- haproxy-www :リバースプロキシロードバランサー
- wordpress-1 :最初のアプリケーションサーバー
- wordpress-2 :2番目のアプリケーションサーバー
- mysql-1 :マスターMySQLデータベースサーバー
- mysql-2 :スレーブMySQLデータベースサーバー
セットアップがこのように見えない場合でも、フォローできるはずです。 また、プライベートネットワーキングまたはiptablesの基本を使用したVPSの設定について詳しく知りたい場合は、次のリンクが役立つと思われます(このチュートリアルでは、iptablesの基本を理解していることを前提としています)。
- DigitalOceanプライベートネットワーキングを設定して使用する方法
- 既存の液滴でDigitalOceanプライベートネットワーキングを有効にする方法
- Iptablesファイアウォールのしくみ
- Ubuntu14.04で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の設定を変更しないでください。
シナリオ例のネットワークアクセスニーズの内訳は次のとおりです。
- haproxy-www :
- wordpress-1 :(すべてプライベート)
- wordpress-2 :(すべてプライベート)
- mysql-1 :(すべてプライベート)
- mysql-2 :スレーブMySQLデータベースサーバー
また、少なくとも1つのパブリックインターフェイスへのSSH、およびプライベートネットワークエリア上のすべてのサーバー間のSSHを許可する必要があります。 この例では、 tunnel-1 と呼ばれる別のVPSへのパブリックSSHを許可し、他のサーバーではプライベートSSHのみを許可します。他のサーバーの。 技術的には、この目的のために任意の(またはすべての)VPSを使用できます。
ファイアウォールが何を受け入れ、場合によっては削除する必要があるかがわかったので、ファイアウォールの構成に取り掛かりましょう。
Iptables構成の概要
ニーズを満たすためにiptablesを構成する方法の概要は次のとおりです。
- デフォルトでドロップ
- プライベートネットワークインターフェイスからtunnel-1VPSへのSSHを許可する
- サーバーから開始されるインターネットトラフィックを許可する
- 特定のプライベートネットワークトラフィックを明示的に許可する(IPアドレスやポートによる)
haproxy-wwwから始めましょう。これは私たちの唯一の公開サーバーです。 iptables
コマンドでは、 eth0 はVPSのパブリックインターフェイスを指し、 eth1 はVPSのプライベートインターフェイスを指します。インターフェイス名が異なる場合は、それらに置き換えてください。必要に応じて。
パブリックサーバーの構成(haproxy-www)
トンネル-1へのSSH:
sshユーザー@ tunnel_1_public_IP
ここから、SSHでhaproxy-wwwのprivateインターフェースに接続します。
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)を許可します。 これは、ユーザーが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
必要なすべてのネットワークトラフィックを許可したので、各iptablesチェーンのデフォルトの動作としてDROP
を設定することにより、他のすべてのトラフィックをドロップできます。
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ファイアウォールで次のことが可能になります。
- プライベートネットワーク経由でトンネル1からSSH
- ループバックトラフィック
- haproxy-wwwが開始するインターネットアクティビティ
- パブリックインターネット上のHTTP
- それ自体とWordPressアプリケーションサーバー間のHTTP
- 他のソースからの着信トラフィックはありません
残りのサーバーの保護に移りましょう。
プライベートネットワークサーバーの構成
注:残りのすべてのサーバーに対して次のすべての手順を実行します: wordpress-1 、 wordpress-2 、 mysql-1 、および[X127X ]mysql-2。 このセクションでは、これらのサーバーを一般的にprivate-VPSと呼びます。
プライベートネットワーク内での通信を必要とするネットワークインターフェイスとポートの数が多いため、特定のIPアドレスとポートの組み合わせのみを許可するのではなく、必要なIPアドレスをホワイトリストに登録することで作業を簡素化します。 また、デフォルトで発信トラフィックを許可し、着信トラフィックのみを制限します。
トンネル-1へのSSH:
sshユーザー@ tunnel_1_public_IP
ここから、SSHでprivate-VPSのprivateインターフェースに接続します。
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ファイアウォールで次のことが可能になります。
- プライベートネットワーク経由でトンネル1からSSH
- ループバックトラフィック
- プライベート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を保護するための優れた基盤が得られるはずです(つまり、 同じデータセンター)。 新しいサーバーを追加したり、サーバーの設定を変更したりする場合は、ファイアウォールを更新する必要があることに注意してください。