ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由:
Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.

代わりに参照してください:
このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

Iptablesについて

初期設定後にサーバーをより安全にするために、Ubuntuにはディストリビューションのデフォルトファイアウォールであるiptablesが付属しています。 最初に、Ubuntuファイアウォールは構成されていますが、仮想プライベートサーバー上のすべての着信および発信トラフィックを許可するように設定されています。 サーバーでより強力な保護を有効にするために、いくつかの基本的なiptablesルールを追加できます。

iptablesルールは、それぞれの特定のプロセスを作成するために組み合わせることができる一連のオプションから来ています。 ファイアウォールを通過する各パケットは、各ルールによって順番にチェックされます。 ルールに一致するとすぐに、パケットは関連するアクションに従います。それ以外の場合は、パケットは次の行に進みます。

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

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

Iptablesコマンド

このチュートリアルでは、サーバーに基本的なセキュリティを提供する限られた量のコマンドについて説明しますが、iptables用に開発できるさまざまな微妙な特定のケースがあります。 以下は、VPSのファイアウォールを開発するための最も便利なコマンドの一部ですが、これは短いリストであり、他にもさまざまなオプションがあることに注意してください。

-A: (Append), adds a rule to iptables
-L:  (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a  rule perfectly. It translates to one of four possibilities:
	-ACCEPT: the packet is accepted, and no further rules are processed
	-REJECT: the packet is rejected, and the 	sender is notified, and no further rules are processed
	-DROP: the packet is rejected, but the 	sender is not notified, and no further rules are processed
	-LOG: the packet is accepted but logged, and the following rules are processed 
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a rule

Iptablesルールの作成:

次のように入力すると、現在のiptablesルールを確認できます。

sudo iptables -L

これらは次のようになります。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

別のルールセットがある場合、または最初からやり直したい場合は、すべてのルールをフラッシュして削除することで、いつでもルールをデフォルトに戻すことができます。

sudo iptables -F

さらに、iptablesを使用して作業を高速化したい場合は、コマンドに-nを含めることができます。 このオプションはDNSルックアップを無効にし、コマンドがルールセット内の各IPの逆を見つけようとするのを防ぎます。 例として、これを使用してルールを一覧表示できます。

iptables -L -n

基本的なファイアウォール

現状では、現在のルールでは、着信と発信の両方のすべての接続が許可されています。 セキュリティ対策は一切ありません。 テーブルを作成するとき、パケットがACCEPTED、REJECTED、またはDROPPEDになるとすぐに、それ以上のルールは処理されないことに注意してください。 したがって、最初に来るルールが後のルールよりも優先されます。

ルールを作成するときは、SSH(サーバーへの接続方法)を誤ってブロックしないようにする必要があります。

まず、現在のすべての接続、ルール作成時のすべての接続がオンラインのままになることを確認しましょう。

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

先に進んでこれを分解することができます:

  1. -A は、iptablesにルールをテーブルに追加するように指示します。
  2. INPUT は、このルールを入力チェーンの一部として指定します。
  3. m conntrackの後に–cstateESTABLISHED、RELATED が続くと、このルールの結果が現在の接続にのみ適用され、それらに関連する接続が許可されることが保証されます
  4. -j ACCEPT は、パケットをJUMPに受け入れて、接続がまだ確立されていることを通知します。

仮想プライベートサーバーへの現在のすべての接続が中断されることなく維持できることが確認されたら、他の安全でない接続のブロックを開始できます。

2つの共通ポート(SSH用に22、Webトラフィック用に80)で着信するトラフィックを除いて、すべての着信トラフィックをブロックするとします。 次のコマンドを使用して、指定されたポートですべてのトラフィックを許可します。

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

これらのコマンドの両方で、 -p オプションは、接続が確立されているプロトコルを表します。この場合は tcp であり、-dport パケットが送信されるポートを指定します。

望ましいトラフィックがファイアウォールを通過することを保証した後、残りのすべてのトラフィックが仮想サーバーにアクセスするのをブロックすることで終了できます。 これはリストの最後のルールであるため、iptablesの以前のルールのいずれかに一致するすべてのトラフィックは影響を受けず、以前に設定したように扱われます。

残りのすべてのトラフィックをブロックするルールを作成しましょう。

sudo iptables -P INPUT DROP

これで、更新されたルールがどのように見えるかを確認できます。

sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 

ほぼ完成です。 ただし、もう1つのルールがありません。 VPSにループバックアクセスを提供する必要があります。 これ以上修飾子を付けずにルールを追加すると、リストの最後に移動し、ルールに従ってすべてのトラフィックをブロックするため、有効になりません。

この問題に対処するには、INPUTオプションを使用して、リストの最初にこのルールを作成する必要があります。

sudo iptables -I INPUT 1 -i lo -j ACCEPT
  1. -I INPUT 1 は、このルールをテーブルの先頭に配置します
  2. loはループバックインターフェイスを指します
  3. -j ACCEPT は、ループバックトラフィックが受け入れられることを保証します

これで、基本的なファイアウォールの作成が完了しました。 ルールは次のようになります(-vと入力するとiptableの詳細を確認できます)。

sudo iptables -L -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
 1289 93442 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    2   212 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http     

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
 pkts bytes target     prot opt in     out     source               destination       

ただし、仮想サーバーが再起動するとすぐに、iptablesルールが消去されます。 次のステップでは、iptablesルールの保存と復元について説明します。

Iptablesルールの保存

iptablesルールは有効ですが、サーバーが再起動すると自動的に削除されます。 それらが有効なままであることを確認するために、IP-Tablespersistentと呼ばれるパッケージを使用できます。

apt-getを使用してインストールできます。

sudo apt-get install iptables-persistent

インストール中に、iptablesルールをIPv4ルールとIPv6ルールの両方に保存するかどうかを尋ねられます。 両方に「はい」と言ってください。

その後、ルールは/etc/iptables/rules.v4および/etc/iptables/rules.v6に保存されます。

インストールが完了したら、iptables-persistentrunningを開始します。

sudo service iptables-persistent start

サーバーを再起動すると、ルールがそのまま残っていることがわかります。

EtelSverdlov著