<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tezca</id>
	<title>ArchWiki - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tezca"/>
	<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Tezca"/>
	<updated>2026-04-18T14:23:59Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.44.3</generator>
	<entry>
		<id>https://wiki.archlinux.jp/index.php?title=%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%95%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB&amp;diff=8835</id>
		<title>シンプルなステートフルファイアウォール</title>
		<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php?title=%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%95%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB&amp;diff=8835"/>
		<updated>2017-05-11T18:08:13Z</updated>

		<summary type="html">&lt;p&gt;Tezca: /* INPUT チェイン */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ファイアウォール]]&lt;br /&gt;
[[en:Simple stateful firewall]]&lt;br /&gt;
[[es:Simple stateful firewall]]&lt;br /&gt;
[[ru:Simple stateful firewall]]&lt;br /&gt;
[[zh-hans:Simple stateful firewall]]&lt;br /&gt;
{{Related articles start}}&lt;br /&gt;
{{Related|インターネット共有}}&lt;br /&gt;
{{Related|ルーター}}&lt;br /&gt;
{{Related|ファイアウォール}}&lt;br /&gt;
{{Related|Uncomplicated Firewall}}&lt;br /&gt;
{{Related articles end}}&lt;br /&gt;
このページでは [[iptables]] を使ってステートフルファイアウォールを設定する方法を説明します。また、ルールの意味と理由の説明も行います。シンプルに説明するため、大きく2つのセクションにページは分かれています。最初のセクションではシングルマシンのためのファイアウォールを扱い、2番目のセクションでは最初のセクションのファイアウォールに加えて NAT ゲートウェイを設定します。&lt;br /&gt;
&lt;br /&gt;
{{Warning|記述されているルールは順番通りに実行してください。リモートマシンにログインしている場合、ルールを設定している間にマシンから閉めだされてしまう可能性があります。以下の手順に従うのはローカルでログインしている場合に限ります。[[#iptables.rules のサンプルファイル|サンプル設定ファイル]]を使うことでこの問題を回避することが可能です。}}&lt;br /&gt;
&lt;br /&gt;
== 前提要件 ==&lt;br /&gt;
&lt;br /&gt;
{{Note|iptables のサポートを有効にしてカーネルがコンパイルされている必要があります。Arch Linux の標準カーネルには iptables のサポートが含まれています。}}&lt;br /&gt;
&lt;br /&gt;
まず、ユーザーランドユーティリティ {{Pkg|iptables}} をインストールしてください。もしくは既にインストール済みかどうか確認してください。&lt;br /&gt;
&lt;br /&gt;
この記事では iptables のルールセットが全く存在しないことを前提としています。現在のルールセットをチェックして、ルールが存在しないことを確認するには、次を実行:&lt;br /&gt;
&lt;br /&gt;
{{hc|# iptables-save|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Generated by iptables-save v1.4.19.1 on Thu Aug  1 19:28:53 2013&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT ACCEPT [50:3763]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [30:3472]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Thu Aug  1 19:28:53 2013&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
もしくは&lt;br /&gt;
&lt;br /&gt;
{{hc|# iptables -nvL --line-numbers|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Chain INPUT (policy ACCEPT 156 packets, 12541 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 82 packets, 8672 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
ルールが存在する場合、デフォルトのルールセットをロードすることでルールをリセットすることが可能です:&lt;br /&gt;
&lt;br /&gt;
 # iptables-restore &amp;lt; /etc/iptables/empty.rules&lt;br /&gt;
&lt;br /&gt;
もしくは、[[Iptables#ルールをリセットする]] を参照。&lt;br /&gt;
&lt;br /&gt;
== シングルマシン用のファイアウォール ==&lt;br /&gt;
&lt;br /&gt;
{{Note|iptables はチェインの上から下の順番でルールを処理していくため、よくヒットするルールをチェインの初めに置くことを推奨します。もちろん、実行されるロジックによって制約は出て来ます。また、ルールにはランタイムコストもあるため、バイト/パケット数のカウンタだけを見てルールの順番を並び替えるのは賢いとは言えません。}}&lt;br /&gt;
&lt;br /&gt;
=== 必要なチェインの作成 ===&lt;br /&gt;
&lt;br /&gt;
基本的なセットアップとして、2つのユーザー定義チェインを作成し、それを使ってファイアウォールのポートを開きます。&lt;br /&gt;
&lt;br /&gt;
 # iptables -N TCP&lt;br /&gt;
 # iptables -N UDP&lt;br /&gt;
&lt;br /&gt;
もちろんチェインの名前は何でもかまいません。ここでは後のルールで使用するプロトコルに沿うように名前を決めています。&lt;br /&gt;
&lt;br /&gt;
=== FORWARD チェイン ===&lt;br /&gt;
&lt;br /&gt;
マシンを NAT ゲートウェイとしてセットアップしたい場合、[[#NAT ゲートウェイの設定]]を見て下さい。シングルマシンの場合、&#039;&#039;&#039;FORWARD&#039;&#039;&#039; チェインのポリシーをとりあえず &#039;&#039;&#039;DROP&#039;&#039;&#039; に設定して先に進みます:&lt;br /&gt;
&lt;br /&gt;
 # iptables -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
=== OUTPUT チェイン ===&lt;br /&gt;
&lt;br /&gt;
送信トラフィックはフィルタリングしません。セットアップがとても複雑になってしまい、いろいろと考える必要が出てくるからです。ここではシンプルに、&#039;&#039;&#039;OUTPUT&#039;&#039;&#039; ポリシーを &#039;&#039;&#039;ACCEPT&#039;&#039;&#039; に設定します。&lt;br /&gt;
&lt;br /&gt;
 # iptables -P OUTPUT ACCEPT&lt;br /&gt;
&lt;br /&gt;
=== INPUT チェイン ===&lt;br /&gt;
&lt;br /&gt;
上記のチェインと同じように、勝手にルールを通過してしまわないように &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインのデフォルトポリシーは &#039;&#039;&#039;DROP&#039;&#039;&#039; に設定します。セキュアなファイアウォールを設定するときは、全てのトラフィックをドロップしてから、許可するトラフィックを指定するのがベストです。&lt;br /&gt;
&lt;br /&gt;
{{Warning|SSH でログインしている場合、以下の設定をすると SSH セッションが即座に切断されます。切断されないようにするには: (1) 下の INPUT チェインのルールを先に追加 (それでセッションが開いたままになります), (2) インバウンド SSH を許可するルールを追加 (接続が終了した場合に再接続できるようにするため) (3) ポリシーを設定。}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -P INPUT DROP&lt;br /&gt;
&lt;br /&gt;
あらゆるネットワークインターフェイスから受信されたパケットは全て &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインをまず通過します (パケットの送信先が対象のマシンになっている場合)。このチェインの中では、問題ないと思われるパケットだけを許可するようにします。&lt;br /&gt;
&lt;br /&gt;
INPUT チェインにはまず、確立済みの接続に属するトラフィックや、ICMP エラーまたはエコー応答 (ping されたときにホストが返すパケット) などの接続に関連する正当なトラフィックを許可するルールを追加します。&#039;&#039;&#039;ICMP&#039;&#039;&#039; は &#039;&#039;&#039;Internet Control Message Protocol&#039;&#039;&#039; の略です。ICMP メッセージは輻輳制御や MTU にとても重要なので、このルールによって通してやります。&lt;br /&gt;
&lt;br /&gt;
接続ステート {{ic|ESTABLISHED}} は最初の ({{ic|--ctstate NEW}}) 接続試行で許可された以前の他のルール、またはルールの設定時にアクティブになっていた接続 (例えばアクティブな SSH リモート接続) を示します:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
次のルールでは &amp;quot;loopback&amp;quot; (lo) インターフェイスからのトラフィックを全て許可します。多くのアプリケーションやサービスで必須となります。&lt;br /&gt;
&lt;br /&gt;
{{Note|ファイアウォールでトラフィックを規制したくない場合 &amp;quot;eth1&amp;quot; など信頼できるインターフェイスを追加することもできます。ただし、ネットワーク上のあらゆる場所 (例えばルーターなど) からのあらゆるトラフィックを転送する NAT 構成にしている場合、他の設定は無関係になるため注意してください。}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -i lo -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
3番目のルールでは &amp;quot;INVALID&amp;quot; ステートに一致する全てのトラフィックを破棄します。トラフィックは4つの &amp;quot;state&amp;quot; カテゴリに分けることができます: NEW, ESTABLISHED, RELATED, INVALID。これによって &amp;quot;stateless&amp;quot; ファイアウォールではなく &amp;quot;stateful&amp;quot; ファイアウォールと呼称しています。ステートは &amp;quot;nf_conntrack_*&amp;quot; カーネルモジュールによって追跡されます。カーネルモジュールはルールを追加したときにカーネルによって自動的にロードされます。&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* 以下のルールはヘッダーやチェック、TCP フラグがおかしいパケットや不適切な ICMP メッセージ (ホストに何も送信していないのにポート到達不可など)、シーケンス番号予測攻撃などによるシーケンス外のパケットを全て破棄します。&amp;quot;DROP&amp;quot; ターゲットは何も返答せずにパケットを破棄します。それに対して REJECT は礼儀正しくパケットを拒否します。INVALID なパケットに対する適切な &amp;quot;REJECT&amp;quot; レスポンスはありえないため、パケットを受信したことを誰にも分からないように DROP を使っています。&lt;br /&gt;
* ICMPv6 近隣探索パケットは未追跡のまま、たとえ壊れていなくても常に &amp;quot;INVALID&amp;quot; に分類されます。次のコマンドで承認することができます: {{ic|iptables -A INPUT -p 41 -j ACCEPT}}。&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
次のルールでは &#039;&#039;&#039;ICMP エコー要求&#039;&#039;&#039; (ping) を全て許可します。最初のパケットだけを NEW としてカウントし、後は全て RELATED,ESTABLISHED ルールで処理します。コンピュータはルーターではないので、他の ICMP トラフィックをステート NEW で許可する必要はありません。&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
新しい接続を処理するために、INPUT チェインに TCP チェインと UDP チェインを適用します。いったん TCP チェインや UDP チェインで接続が許可されると、以降は&lt;br /&gt;
RELATED/ESTABLISHED のルールで処理されます。TCP チェインと UDP チェインはどちらも新しい接続を許可するか、または丁寧にそれらを REJECT します。新しい TCP 接続は必ず SYN&lt;br /&gt;
パケットから始まります。&lt;br /&gt;
&lt;br /&gt;
{{Note| NEW but not SYN is the only invalid TCP flag not covered by the INVALID state. The reason is because they are rarely malicious packets, and they should not just be dropped. Instead, we simply do not accept them, so they are rejected with a TCP RESET by the next rule.}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
 # iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
&lt;br /&gt;
We reject TCP connections with TCP RESET packets and UDP streams with ICMP port unreachable messages if the ports are not opened. This imitates default Linux behavior (RFC compliant), and it allows the sender to quickly close the connection and clean up.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
 # iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
For other protocols, we add a final rule to the INPUT chain to reject all remaining incoming traffic with icmp protocol unreachable messages. This imitates Linux&#039;s default behavior.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
=== iptables.rules のサンプルファイル ===&lt;br /&gt;
&lt;br /&gt;
上記のコマンドを全て実行した時に作成される {{ic|iptables.rules}} ファイルの例:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/iptables/iptables.rules|&lt;br /&gt;
# Generated by iptables-save v1.4.18 on Sun Mar 17 14:21:12 2013&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:TCP - [0:0]&lt;br /&gt;
:UDP - [0:0]&lt;br /&gt;
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
-A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
-A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Sun Mar 17 14:21:12 2013&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
このファイルは次のコマンドで生成できます:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
生成したファイルは下のセクションで使うことができます。SSH 経由でリモートからファイアウォールを設定する場合、先に進む前に新しい SSH 接続を許可するため以下のルールを追加してください (ポート番号は必要に応じて変更してください):&lt;br /&gt;
&lt;br /&gt;
 -A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
=== TCP と UDP チェイン ===&lt;br /&gt;
&lt;br /&gt;
TCP と UDP チェインには特定のポートで新規接続の TCP 接続と UDP ストリームを許可するルールを作成します。&lt;br /&gt;
&lt;br /&gt;
{{Note|リモートからアクセスする SSH や HTTP などのサービスの接続を許可するためのルールを追加する必要があります。}}&lt;br /&gt;
&lt;br /&gt;
==== 接続要求でポートを開く ====&lt;br /&gt;
&lt;br /&gt;
ウェブサーバーへの TCP 接続を許可するには (ポート 80):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
ウェブサーバーへの TCP 接続 (HTTPS) を許可するには (ポート 443):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 443 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
SSH のリモート接続を許可するには (ポート 22):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
DNS サーバーへの UDP ストリームを許可するには (ポート 53):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A UDP -p udp --dport 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
複数のポートにマッチするような、高度なルールについては {{Ic|man iptables}} を見て下さい。&lt;br /&gt;
&lt;br /&gt;
==== ポートノッキング ====&lt;br /&gt;
デフォルトではファイアウォールによって閉じられているポートを、外部から開く方法がポートノッキングです。予め決めておいたポートに連続して接続試行することで行います。正しいポート&amp;quot;ノック&amp;quot; (接続試行) がなされた場合、ファイアウォールは特定のポートを開いて接続できるようにします。詳しくは[[ポートノッキング]]を見て下さい。&lt;br /&gt;
&lt;br /&gt;
=== なりすまし攻撃からの防護 ===&lt;br /&gt;
&lt;br /&gt;
{{Note|現在 {{ic|rp_filter}} はデフォルトで {{ic|/usr/lib/sysctl.d/50-default.conf}} で {{ic|1}} に設定されているため、以下の手順は必要ありません。}}&lt;br /&gt;
&lt;br /&gt;
インターネットやローカルネットワークからの予約ローカルアドレスの使用は sysctl で {{Ic|rp_filter}} (Reverse Path Filter) を 1 に設定することでブロックされます。以下の行を {{Ic|/etc/sysctl.d/90-firewall.conf}} ファイルに追加することで Linux カーネルに組み込まれている送信元アドレス検証が有効になります (詳しくは [[sysctl]] を参照)。カーネルによる検証は個別の iptables ルールよりもなりすましを上手く処理します:&lt;br /&gt;
&lt;br /&gt;
 net.ipv4.conf.all.rp_filter=1&lt;br /&gt;
&lt;br /&gt;
統計が必要な場合、netfilter で設定することもできます:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t raw -I PREROUTING -m rpfilter --invert -j DROP&lt;br /&gt;
&lt;br /&gt;
{{Note|両方を有効にする意味はありません。netfilter の方法のほうが新しく IPv6 でも機能します。}}&lt;br /&gt;
&lt;br /&gt;
非同期ルーティングを使用する構成の場合、代わりに {{ic|1=rp_filter=2}} sysctl オプションを使用する必要があります。{{ic|--loose}} スイッチを {{ic|rpfilter}} モジュールに渡すことで netfilter と同じ設定ができます。&lt;br /&gt;
&lt;br /&gt;
=== コンピュータを&amp;quot;隠匿&amp;quot;する ===&lt;br /&gt;
&lt;br /&gt;
デスクトップマシンとして使っている場合、特定の接続要求はブロックするのが好ましいでしょう。&lt;br /&gt;
&lt;br /&gt;
==== ping リクエストのブロック ====&lt;br /&gt;
&lt;br /&gt;
&#039;Ping&#039; リクエストはデバイス間の通信状態を確認するために送信先アドレスに送られる ICMP パケットです。ネットワークが問題ないようでしたら、ping リクエストは全てブロックしてもかまいません。リクエストをブロックするだけではコンピュータを隠匿することにはならないので注意してください。たとえコンピュータに送られた全てのパケットを拒否したとしても、シンプルな nmap による IP 範囲の &amp;quot;ping スキャン&amp;quot; で露顕してしまいます。&lt;br /&gt;
&lt;br /&gt;
ブロックは初歩的な&amp;quot;防護&amp;quot;であり、将来問題が起こった時にデバッグするのが困難になります。あくまで勉強用にやってみるくらいにしてください。&lt;br /&gt;
&lt;br /&gt;
エコー要求をブロックするには、次の行を {{Ic|/etc/sysctl.d/90-firewall.conf}} ファイルに追加してください (詳しくは [[sysctl]] を参照):&lt;br /&gt;
&lt;br /&gt;
 net.ipv4.icmp_echo_ignore_all = 1&lt;br /&gt;
&lt;br /&gt;
詳しくは iptables の man ページや http://www.snowman.net/projects/ipt_recent/ のドキュメントやサンプルを読んでください。&lt;br /&gt;
&lt;br /&gt;
==== ポートスキャナを騙す ====&lt;br /&gt;
&lt;br /&gt;
{{Note|以下の設定は [[Wikipedia:ja:DoS攻撃|DoS]] 攻撃に悪用される可能性があります。偽装した IP でパケットを送信してサービスへの接続をブロックさせてしまうという攻撃が考えられます。}}&lt;br /&gt;
&lt;br /&gt;
攻撃者はポートスキャンを使ってコンピュータの開いているポートを確認します。ポートスキャンによって攻撃者は稼働しているサービスを調査することができ、場合によってはサービスの脆弱性を利用してくる可能性があります。&lt;br /&gt;
&lt;br /&gt;
INVALID ステートルールは UDP, ACK, SYN スキャン以外の全てのポートスキャンを処理します (nmap ではそれぞれ -sU, -sA, -sS)。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ACK スキャン&#039;&#039;は開いているポートを確認するのには使われませんが、ファイアウォールによってフィルタリングされているポートを識別するのには使われます。NEW ステートの TCP 接続は全て SYN チェックするため、ACK スキャンによって送信されたパケットは全て TCP RESET パケットで拒否されます。一部のファイアウォールはパケットを破棄するため、攻撃者はファイアウォールのルールを暴き出すことができます。&lt;br /&gt;
&lt;br /&gt;
recent モジュールを使うことで他の2種類のポートスキャンを騙すことができます。recent モジュールでホストを &amp;quot;recent&amp;quot; リストに追加して、特定の種類の攻撃を停止させます。現在の recent リストは {{Ic|/proc/net/xt_recent/}} で確認できます。&lt;br /&gt;
&lt;br /&gt;
===== SYN スキャン =====&lt;br /&gt;
&lt;br /&gt;
SYN スキャンでは、ポートスキャナは全てのポートに SYN パケットを送信します。閉じられているポートは TCP RESET パケットを返しますが、厳格なファイアウォールはパケットを破棄します。開いているポートは、ファイアウォールがあるかどうかに関わらず、SYN ACK パケットを返します。&lt;br /&gt;
&lt;br /&gt;
recent モジュールを使うことで接続を拒否されたホストの記録をつけることができ、開いているポートに SYN パケットが送信されたときにポートが閉じているかのように TCP RESET を返すことが可能です。開かれているポートが最初にスキャンされた場合、SYN ACK が返されてしまうため、確実にポートを隠匿するには標準以外のポートを ssh などのアプリケーションで使用する必要があります。&lt;br /&gt;
&lt;br /&gt;
まず、TCP チェインの一番上にルールを追加します。以下のルールは過去60秒以内に TCP-PORTSCAN リストに入ったホストに対して TCP RESET で応答します。{{Ic|--update}} スイッチで recent リストが更新され、60秒のカウンターがリセットされます。&lt;br /&gt;
&lt;br /&gt;
 # iptables -I TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
そして TCP パケットを拒否するルールを修正して拒否されたパケットを送信したホストを TCP-PORTSCAN リストに追加するようにしてください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
 # iptables -A INPUT -p tcp -m recent --set --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
===== UDP スキャン =====&lt;br /&gt;
&lt;br /&gt;
UDP ポートスキャンは TCP の SYN スキャンと似ていますが UDP は &amp;quot;connectionless&amp;quot; プロトコルです。ハンドシェイクや ACK は存在しません。代わりに、スキャナは各 UDP ポートに UDP パケットを送信します。ポートが閉じていると ICMP のポート到達不可メッセージが返ってきますが、ポートが開いている場合、何も返答が返ってきません。UDP は &amp;quot;reliable&amp;quot; プロトコルではないので、パケットが消失したかどうか知る手段がスキャナにはなく、返答がないポートを何度も確認する必要があります。&lt;br /&gt;
&lt;br /&gt;
Linux カーネルは ICMP ポートの到達不可メッセージを非常にゆっくりと送信するため、Linux マシンに対して完全な UDP スキャンをかけようとすると10時間以上かかります。それでも、一般的なポートは識別できるため、SYN スキャンに対してと同じ対抗策を UDP スキャンに対しても設定すると良いでしょう。&lt;br /&gt;
&lt;br /&gt;
まず UDP-PORTSCAN リストのホストからのパケットを拒否するルールを UDP チェインの一番上に追加してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -I UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
&lt;br /&gt;
そして、UDP の拒否パケットルールを以下のように修正します:&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
 # iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
&lt;br /&gt;
===== 最終的なルールのリストア =====&lt;br /&gt;
&lt;br /&gt;
If either or both of the portscanning tricks above were used the final default rule is no longer the last rule in the INPUT chain. It needs to be the last rule otherwise it will intercept the trick port scanner rules you just added and they will never be used.  Simply delete the rule (-D), then add it once again using append (-A) which will place it at the end of the chain.&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
 # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
=== 他の攻撃からの防護 ===&lt;br /&gt;
&lt;br /&gt;
関連するカーネルパラメータは [[sysctl#TCP/IP スタックの防御]] に載っています。&lt;br /&gt;
&lt;br /&gt;
==== ブルートフォース攻撃 ====&lt;br /&gt;
&lt;br /&gt;
残念ながら、外部 IP アドレスからアクセスできるサービスにはよくブルートフォース攻撃が行われます。ブルートフォース攻撃が普遍的な理由としては、攻撃を行うのがとても簡単で、攻撃用のツールが数多く存在するということが挙げられます。幸いに、ブルートフォース攻撃からサービスを守るための方法はいろいろあります。その一つとして、適切な {{ic|iptables}} ルールを使って接続を開始しようとするパケットが一定数あったときに IP をブラックリストに入れる方法があります。また、ログファイルを監視して、試行失敗からブラックリストを作成する専用のデーモンを使うこともできます。&lt;br /&gt;
{{Warning|IP ブラックリストを使うことで攻撃を多少止めることはできますが、別段にデーモンを使う必要があり、ログがちゃんと記録されてないと上手くいきません (攻撃者が執拗にサーバーを攻撃した場合、{{ic|/var}} を含むパーティションが満杯になる可能性があります)。さらに、攻撃者にあなたの IP アドレスが知られてしまったら、攻撃者はソースヘッダを偽装してパケットを送りつけることができるため、サーバーから締め出される恐れもあります。ブルートフォース攻撃については [[SSH 鍵]]がスマートな解決法になるでしょう。}}&lt;br /&gt;
パスワード認証 (特に {{ic|sshd}}) が何回も失敗した時にその IP を接続不可にするパッケージとして [[Fail2ban]] と [[Sshguard]] が存在します。どちらも iptables のルールを更新することで、ブラックリストに入っている IP アドレスからの接続を拒否します。&lt;br /&gt;
&lt;br /&gt;
以下は {{ic|iptables}} を使って SSH のブルートフォース攻撃を止めるための設定例です:&lt;br /&gt;
&lt;br /&gt;
 # iptables -N IN_SSH&lt;br /&gt;
 # iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP&lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP &lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --set -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Most of the options should be self-explanatory, they allow for three connection packets in ten seconds. Further tries in that time will blacklist the IP. The next rule adds a quirk by allowing a total of four attempts in 30 minutes. This is done because some bruteforce attacks are actually performed slow and not in a burst of attempts. The rules employ a number of additional options. To read more about them, check the original reference for this example: [http://compilefailure.blogspot.com/2011/04/better-ssh-brute-force-prevention-with.html compilefailure.blogspot.com]&lt;br /&gt;
&lt;br /&gt;
Using the above rules, now ensure that:&lt;br /&gt;
 # iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
is in an appropriate position in the iptables.rules file. &lt;br /&gt;
&lt;br /&gt;
This arrangement works for the IN_SSH rule if you followed this entire wiki so far:&lt;br /&gt;
 *&lt;br /&gt;
 -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
 -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
 -A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
 *&lt;br /&gt;
&lt;br /&gt;
The above rules can, of course, be used to protect any service, though protecting the SSH daemon is probably the most often required one.&lt;br /&gt;
&lt;br /&gt;
{{Tip|For self-testing the rules after setup, the actual blacklist happening can slow the test making it difficult to fine-tune parameters. One can watch the incoming attempts via {{ic|cat /proc/net/xt_recent/sshbf}}. To unblock the own IP during testing, root is needed {{ic|# echo / &amp;gt; /proc/net/xt_recent/sshbf}}}}&lt;br /&gt;
&lt;br /&gt;
=== ルールの保存 ===&lt;br /&gt;
&lt;br /&gt;
ルールセットの設定が完了したら、ハードドライブに保存して、マシンを起動する度にロードされるようにします。&lt;br /&gt;
&lt;br /&gt;
ルールの設定を保存する場所は systemd のユニットファイルで指定します:&lt;br /&gt;
&lt;br /&gt;
 iptables=/etc/iptables/iptables.rules&lt;br /&gt;
 ip6tables=/etc/iptables/ip6tables.rules&lt;br /&gt;
&lt;br /&gt;
次のコマンドでルールを保存します:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
そして &#039;&#039;&#039;iptables&#039;&#039;&#039; [[デーモン]]を有効化して、起動時にルールがロードされるようにしてください。&lt;br /&gt;
&lt;br /&gt;
ルールが正しくロードされているか確認するには次のコマンドを使用:&lt;br /&gt;
&lt;br /&gt;
 # systemctl start iptables.service &amp;amp;&amp;amp; systemctl status iptables.service&lt;br /&gt;
&lt;br /&gt;
=== IPv6 ===&lt;br /&gt;
&lt;br /&gt;
IPv6 を使用しない場合 (ほとんどの ISP は IPv6 をサポートしていません)、[[IPv6#IPv6 の無効化|無効化]]したほうが良いでしょう。&lt;br /&gt;
&lt;br /&gt;
使用する場合、IPv6 のファイアウォールルールを有効にしてください。まず IPv4 のルールをベースとしてコピー:&lt;br /&gt;
 # cp /etc/iptables/iptables.rules /etc/iptables/ip6tables.rules&lt;br /&gt;
最初に、ルールの中で記述している IP を IPv4 のフォーマットから IPv6 のフォーマットに変換します。&lt;br /&gt;
&lt;br /&gt;
Next, a few of the rules (built as example in this article for IPv4) have to be adapted. IPv6 obtained a new ICMPv6 protocol, replacing ICMP. Hence, the reject error return codes {{ic|--reject-with icmp-port-unreachable}} and {{ic|--reject-with icmp-proto-unreachable}} have to be converted to ICMPv6 codes. &lt;br /&gt;
&lt;br /&gt;
The available ICMPv6 error codes are listed in [https://tools.ietf.org/html/rfc4443#section-3.1 RFC 4443], which specifies connection attempts blocked by a firewall rule should use {{ic|--reject-with icmp6-adm-prohibited}}. Doing so will basically inform the remote system that the connection was rejected by a firewall, rather than a listening service. &lt;br /&gt;
&lt;br /&gt;
If it is preferred not to explicitly inform about the existence of a firewall filter, the packet may also be rejected without the message: &lt;br /&gt;
&lt;br /&gt;
  -A INPUT -j REJECT&lt;br /&gt;
&lt;br /&gt;
The above will reject with the default return error of {{ic|--reject-with-icmp6-port-unreachable}}. You should note though, that identifying a firewall is a basic feature of port scanning applications and most will identify it regardless. &lt;br /&gt;
&lt;br /&gt;
In the next step make sure the protocol and extension are changed to be IPv6 appropriate for the rule regarding all new incoming ICMP echo requests (pings):&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Netfilter conntrack does not appear to track ICMPv6 Neighbor Discovery Protocol (the IPv6 equivalent of ARP), so we need to allow ICMPv6 traffic regardless of state for all directly attached subnets. The following should be inserted after dropping {{ic|--ctstate INVALID}}, but before any other DROP or REJECT targets, along with a corresponding line for each directly attached subnet:&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Since there is no kernel reverse path filter for IPv6, you may want to enable one in &#039;&#039;ip6tables&#039;&#039; with the following:&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -t raw -A PREROUTING -m rpfilter -j ACCEPT&lt;br /&gt;
 # ip6tables -t raw -A PREROUTING -j DROP&lt;br /&gt;
&lt;br /&gt;
設定が完了したら、&#039;&#039;ip6tables&#039;&#039; サービスを[[有効化]]してください。&#039;&#039;iptables&#039;&#039; とは別個に実行させます。&lt;br /&gt;
&lt;br /&gt;
== NAT ゲートウェイの設定 ==&lt;br /&gt;
&lt;br /&gt;
このセクションでは NAT ゲートウェイについて扱います。[[#シングルマシン用のファイアウォール|ガイドの前半部分]]を読んで &#039;&#039;&#039;INPUT&#039;&#039;&#039;, &#039;&#039;&#039;OUTPUT&#039;&#039;&#039;, &#039;&#039;&#039;TCP&#039;&#039;&#039;, &#039;&#039;&#039;UDP&#039;&#039;&#039; チェインを設定していることが前提です。これまで全てのルールは &#039;&#039;&#039;filter&#039;&#039;&#039; テーブルに作成していました。このセクションでは、&#039;&#039;&#039;nat&#039;&#039;&#039; テーブルも使用していきます。&lt;br /&gt;
&lt;br /&gt;
=== フィルターテーブルの設定 ===&lt;br /&gt;
&lt;br /&gt;
==== 必要なチェインの作成 ====&lt;br /&gt;
&lt;br /&gt;
以下の設定では、2つの異なるチェインをフィルターテーブルで使用します: &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; と &#039;&#039;&#039;fw-open&#039;&#039;&#039; チェインです。以下のコマンドでチェインを作成してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -N fw-interfaces&lt;br /&gt;
 # iptables -N fw-open&lt;br /&gt;
&lt;br /&gt;
==== FORWARD チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FORWARD&#039;&#039;&#039; チェインの設定は上のセクションにある &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインの設定と大体同じです。&lt;br /&gt;
&lt;br /&gt;
Now we set up a rule with the &#039;&#039;&#039;conntrack&#039;&#039;&#039; match, identical to the one in the &#039;&#039;&#039;INPUT&#039;&#039;&#039; chain:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The next step is to enable forwarding for trusted interfaces and to make all packets pass the &#039;&#039;&#039;fw-open&#039;&#039;&#039; chain.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -j fw-interfaces &lt;br /&gt;
 # iptables -A FORWARD -j fw-open &lt;br /&gt;
&lt;br /&gt;
The remaining packets are denied with an &#039;&#039;&#039;ICMP&#039;&#039;&#039; message:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -j REJECT --reject-with icmp-host-unreachable&lt;br /&gt;
 # iptables -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
==== fw-interfaces と fw-open チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
The meaning of the &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; and &#039;&#039;&#039;fw-open&#039;&#039;&#039; chains is explained later, when we deal with the &#039;&#039;&#039;POSTROUTING&#039;&#039;&#039; and &#039;&#039;&#039;PREROUTING&#039;&#039;&#039; chains in the &#039;&#039;&#039;nat&#039;&#039;&#039; table, respectively.&lt;br /&gt;
&lt;br /&gt;
=== nat テーブルの設定 ===&lt;br /&gt;
&lt;br /&gt;
このセクションでは、出力インターフェイス (公のインターネット IP が付与されるインターフェイス) の名前を &#039;&#039;&#039;ppp0&#039;&#039;&#039; とします。使用する出力インターフェイスが別の名前の場合、以下のルールで使われている名前もそれにあわせて変更するようにしてください。&lt;br /&gt;
&lt;br /&gt;
==== POSTROUTING チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
Now, we have to define who is allowed to connect to the internet. Let&#039;s assume we have the subnet &#039;&#039;&#039;192.168.0.0/24&#039;&#039;&#039; (which means all addresses that are of the form 192.168.0.*) on &#039;&#039;&#039;eth0&#039;&#039;&#039;. We first need to accept the machines on this interface in the FORWARD table, that is why we created the &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; chain above:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A fw-interfaces -i eth0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Now, we have to alter all outgoing packets so that they have our public IP address as the source address, instead of the local LAN address. To do this, we use the &#039;&#039;&#039;MASQUERADE&#039;&#039;&#039; target:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
上記の &#039;&#039;&#039;-o ppp0&#039;&#039;&#039; パラメータは必ず必要なので忘れないでください。パラメータを記述しなかった場合、ネットワークが接続できなくなります。&lt;br /&gt;
&lt;br /&gt;
Let&#039;s assume we have another subnet, &#039;&#039;&#039;10.3.0.0/16&#039;&#039;&#039; (which means all addresses 10.3.*.*), on the interface &#039;&#039;&#039;eth1&#039;&#039;&#039;. We add the same rules as above again:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A fw-interfaces -i eth1 -j ACCEPT&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -s 10.3.0.0/16 -o ppp0 -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
最後に[[インターネット共有#パケット転送の有効化|パケット転送を有効化]]してください (既に有効にしている場合は必要ありません)。&lt;br /&gt;
&lt;br /&gt;
Machines from these subnets can now use your new NAT machine as their gateway. Note that you may want to set up a DNS and DHCP server like &#039;&#039;&#039;dnsmasq&#039;&#039;&#039; or a combination of &#039;&#039;&#039;bind&#039;&#039;&#039; and &#039;&#039;&#039;dhcpd&#039;&#039;&#039; to simplify network settings DNS resolution on the client machines. This is not the topic of this guide.&lt;br /&gt;
&lt;br /&gt;
==== PREROUTING チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
Sometimes, we want to change the address of an incoming packet from the gateway to a LAN machine. To do this, we use the &#039;&#039;&#039;fw-open&#039;&#039;&#039; chain defined above, as well as the &#039;&#039;&#039;PREROUTING&#039;&#039;&#039; chain in the &#039;&#039;&#039;nat&#039;&#039;&#039; table in the following two simple examples. &lt;br /&gt;
&lt;br /&gt;
First, we want to change all incoming SSH packets (port 22) to the ssh server of the machine &#039;&#039;&#039;192.168.0.5&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT --to 192.168.0.5&lt;br /&gt;
 # iptables -A fw-open -d 192.168.0.5 -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The second example will show you how to change packets to a different port than the incoming port. We want to change any incoming connection on port &#039;&#039;&#039;8000&#039;&#039;&#039; to our web server on &#039;&#039;&#039;192.168.0.6&#039;&#039;&#039;, port &#039;&#039;&#039;80&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to 192.168.0.6:80&lt;br /&gt;
 # iptables -A fw-open -d 192.168.0.6 -p tcp --dport 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The same setup also works with udp packets.&lt;br /&gt;
&lt;br /&gt;
=== ルールの保存 ===&lt;br /&gt;
&lt;br /&gt;
ルールを保存してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
そして &#039;&#039;&#039;iptables&#039;&#039;&#039; [[デーモン]]を有効にすることで、起動時にルールがロードされるようにします。&lt;br /&gt;
&lt;br /&gt;
== 参照 ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.webhostingtalk.com/showthread.php?t=456571 Methods to block SSH attacks]&lt;br /&gt;
*[http://www.ducea.com/2006/06/28/using-iptables-to-block-brute-force-attacks/ Using iptables to block brute force attacks]&lt;br /&gt;
*[http://linuxconfig.org/collection-of-basic-linux-firewall-iptables-rules 20 Iptables Examples For New SysAdmins]&lt;br /&gt;
*[http://www.thegeekstuff.com/2011/06/iptables-rules-examples/ 25 Most Frequently Used Linux IPTables Rules Examples]&lt;/div&gt;</summary>
		<author><name>Tezca</name></author>
	</entry>
	<entry>
		<id>https://wiki.archlinux.jp/index.php?title=%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%95%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB&amp;diff=8834</id>
		<title>シンプルなステートフルファイアウォール</title>
		<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php?title=%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%95%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB&amp;diff=8834"/>
		<updated>2017-05-11T09:17:59Z</updated>

		<summary type="html">&lt;p&gt;Tezca: /* INPUT チェイン */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ファイアウォール]]&lt;br /&gt;
[[en:Simple stateful firewall]]&lt;br /&gt;
[[es:Simple stateful firewall]]&lt;br /&gt;
[[ru:Simple stateful firewall]]&lt;br /&gt;
[[zh-hans:Simple stateful firewall]]&lt;br /&gt;
{{Related articles start}}&lt;br /&gt;
{{Related|インターネット共有}}&lt;br /&gt;
{{Related|ルーター}}&lt;br /&gt;
{{Related|ファイアウォール}}&lt;br /&gt;
{{Related|Uncomplicated Firewall}}&lt;br /&gt;
{{Related articles end}}&lt;br /&gt;
このページでは [[iptables]] を使ってステートフルファイアウォールを設定する方法を説明します。また、ルールの意味と理由の説明も行います。シンプルに説明するため、大きく2つのセクションにページは分かれています。最初のセクションではシングルマシンのためのファイアウォールを扱い、2番目のセクションでは最初のセクションのファイアウォールに加えて NAT ゲートウェイを設定します。&lt;br /&gt;
&lt;br /&gt;
{{Warning|記述されているルールは順番通りに実行してください。リモートマシンにログインしている場合、ルールを設定している間にマシンから閉めだされてしまう可能性があります。以下の手順に従うのはローカルでログインしている場合に限ります。[[#iptables.rules のサンプルファイル|サンプル設定ファイル]]を使うことでこの問題を回避することが可能です。}}&lt;br /&gt;
&lt;br /&gt;
== 前提要件 ==&lt;br /&gt;
&lt;br /&gt;
{{Note|iptables のサポートを有効にしてカーネルがコンパイルされている必要があります。Arch Linux の標準カーネルには iptables のサポートが含まれています。}}&lt;br /&gt;
&lt;br /&gt;
まず、ユーザーランドユーティリティ {{Pkg|iptables}} をインストールしてください。もしくは既にインストール済みかどうか確認してください。&lt;br /&gt;
&lt;br /&gt;
この記事では iptables のルールセットが全く存在しないことを前提としています。現在のルールセットをチェックして、ルールが存在しないことを確認するには、次を実行:&lt;br /&gt;
&lt;br /&gt;
{{hc|# iptables-save|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Generated by iptables-save v1.4.19.1 on Thu Aug  1 19:28:53 2013&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT ACCEPT [50:3763]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [30:3472]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Thu Aug  1 19:28:53 2013&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
もしくは&lt;br /&gt;
&lt;br /&gt;
{{hc|# iptables -nvL --line-numbers|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Chain INPUT (policy ACCEPT 156 packets, 12541 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 82 packets, 8672 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
ルールが存在する場合、デフォルトのルールセットをロードすることでルールをリセットすることが可能です:&lt;br /&gt;
&lt;br /&gt;
 # iptables-restore &amp;lt; /etc/iptables/empty.rules&lt;br /&gt;
&lt;br /&gt;
もしくは、[[Iptables#ルールをリセットする]] を参照。&lt;br /&gt;
&lt;br /&gt;
== シングルマシン用のファイアウォール ==&lt;br /&gt;
&lt;br /&gt;
{{Note|iptables はチェインの上から下の順番でルールを処理していくため、よくヒットするルールをチェインの初めに置くことを推奨します。もちろん、実行されるロジックによって制約は出て来ます。また、ルールにはランタイムコストもあるため、バイト/パケット数のカウンタだけを見てルールの順番を並び替えるのは賢いとは言えません。}}&lt;br /&gt;
&lt;br /&gt;
=== 必要なチェインの作成 ===&lt;br /&gt;
&lt;br /&gt;
基本的なセットアップとして、2つのユーザー定義チェインを作成し、それを使ってファイアウォールのポートを開きます。&lt;br /&gt;
&lt;br /&gt;
 # iptables -N TCP&lt;br /&gt;
 # iptables -N UDP&lt;br /&gt;
&lt;br /&gt;
もちろんチェインの名前は何でもかまいません。ここでは後のルールで使用するプロトコルに沿うように名前を決めています。&lt;br /&gt;
&lt;br /&gt;
=== FORWARD チェイン ===&lt;br /&gt;
&lt;br /&gt;
マシンを NAT ゲートウェイとしてセットアップしたい場合、[[#NAT ゲートウェイの設定]]を見て下さい。シングルマシンの場合、&#039;&#039;&#039;FORWARD&#039;&#039;&#039; チェインのポリシーをとりあえず &#039;&#039;&#039;DROP&#039;&#039;&#039; に設定して先に進みます:&lt;br /&gt;
&lt;br /&gt;
 # iptables -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
=== OUTPUT チェイン ===&lt;br /&gt;
&lt;br /&gt;
送信トラフィックはフィルタリングしません。セットアップがとても複雑になってしまい、いろいろと考える必要が出てくるからです。ここではシンプルに、&#039;&#039;&#039;OUTPUT&#039;&#039;&#039; ポリシーを &#039;&#039;&#039;ACCEPT&#039;&#039;&#039; に設定します。&lt;br /&gt;
&lt;br /&gt;
 # iptables -P OUTPUT ACCEPT&lt;br /&gt;
&lt;br /&gt;
=== INPUT チェイン ===&lt;br /&gt;
&lt;br /&gt;
上記のチェインと同じように、勝手にルールを通過してしまわないように &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインのデフォルトポリシーは &#039;&#039;&#039;DROP&#039;&#039;&#039; に設定します。セキュアなファイアウォールを設定するときは、全てのトラフィックをドロップしてから、許可するトラフィックを指定するのがベストです。&lt;br /&gt;
&lt;br /&gt;
{{Warning|SSH でログインしている場合、以下の設定をすると SSH セッションが即座に切断されます。切断されないようにするには: (1) 下の INPUT チェインのルールを先に追加 (それでセッションが開いたままになります), (2) インバウンド SSH を許可するルールを追加 (接続が終了した場合に再接続できるようにするため) (3) ポリシーを設定。}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -P INPUT DROP&lt;br /&gt;
&lt;br /&gt;
あらゆるネットワークインターフェイスから受信されたパケットは全て &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインをまず通過します (パケットの送信先が対象のマシンになっている場合)。このチェインの中では、問題ないと思われるパケットだけを許可するようにします。&lt;br /&gt;
&lt;br /&gt;
INPUT チェインにはまず、確立済みの接続に属するトラフィックや、ICMP エラーまたはエコー応答 (ping されたときにホストが返すパケット) などの接続に関連する正当なトラフィックを許可するルールを追加します。&#039;&#039;&#039;ICMP&#039;&#039;&#039; は &#039;&#039;&#039;Internet Control Message Protocol&#039;&#039;&#039; の略です。ICMP メッセージは輻輳制御や MTU にとても重要なので、このルールによって通してやります。&lt;br /&gt;
&lt;br /&gt;
接続ステート {{ic|ESTABLISHED}} は最初の ({{ic|--ctstate NEW}}) 接続試行で許可された以前の他のルール、またはルールの設定時にアクティブになっていた接続 (例えばアクティブな SSH リモート接続) を示します:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
次のルールでは &amp;quot;loopback&amp;quot; (lo) インターフェイスからのトラフィックを全て許可します。多くのアプリケーションやサービスで必須となります。&lt;br /&gt;
&lt;br /&gt;
{{Note|ファイアウォールでトラフィックを規制したくない場合 &amp;quot;eth1&amp;quot; など信頼できるインターフェイスを追加することもできます。ただし、ネットワーク上のあらゆる場所 (例えばルーターなど) からのあらゆるトラフィックを転送する NAT 構成にしている場合、他の設定は無関係になるため注意してください。}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -i lo -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
3番目のルールでは &amp;quot;INVALID&amp;quot; ステートに一致する全てのトラフィックを破棄します。トラフィックは4つの &amp;quot;state&amp;quot; カテゴリに分けることができます: NEW, ESTABLISHED, RELATED, INVALID。これによって &amp;quot;stateless&amp;quot; ファイアウォールではなく &amp;quot;stateful&amp;quot; ファイアウォールと呼称しています。ステートは &amp;quot;nf_conntrack_*&amp;quot; カーネルモジュールによって追跡されます。カーネルモジュールはルールを追加したときにカーネルによって自動的にロードされます。&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* 以下のルールはヘッダーやチェック、TCP フラグがおかしいパケットや不適切な ICMP メッセージ (ホストに何も送信していないのにポート到達不可など)、シーケンス番号予測攻撃などによるシーケンス外のパケットを全て破棄します。&amp;quot;DROP&amp;quot; ターゲットは何も返答せずにパケットを破棄します。それに対して REJECT は礼儀正しくパケットを拒否します。INVALID なパケットに対する適切な &amp;quot;REJECT&amp;quot; レスポンスはありえないため、パケットを受信したことを誰にも分からないように DROP を使っています。&lt;br /&gt;
* ICMPv6 近隣探索パケットは未追跡のまま、たとえ壊れていなくても常に &amp;quot;INVALID&amp;quot; に分類されます。次のコマンドで承認することができます: {{ic|iptables -A INPUT -p 41 -j ACCEPT}}。&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
次のルールでは &#039;&#039;&#039;ICMP エコー要求&#039;&#039;&#039; (ping) を全て許可します。最初のパケットだけを NEW としてカウントし、後は全て RELATED,ESTABLISHED ルールで処理します。コンピュータはルーターではないので、他の ICMP トラフィックをステート NEW で許可する必要はありません。&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
新しい接続を処理するために、INPUT チェインに TCP チェインと UDP チェインを適用します。いったん TCP チェインや UDP チェインで接続が許可されると、以降は&lt;br /&gt;
RRELATED/ESTABLISHED のルールで処理されます。TCP チェインと UDP チェインはどちらも新しい接続を許可するか、または丁寧にそれらを REJECT します。新しい TCP 接続は必ず SYN&lt;br /&gt;
パケットから始まります。&lt;br /&gt;
&lt;br /&gt;
{{Note| NEW but not SYN is the only invalid TCP flag not covered by the INVALID state. The reason is because they are rarely malicious packets, and they should not just be dropped. Instead, we simply do not accept them, so they are rejected with a TCP RESET by the next rule.}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
 # iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
&lt;br /&gt;
We reject TCP connections with TCP RESET packets and UDP streams with ICMP port unreachable messages if the ports are not opened. This imitates default Linux behavior (RFC compliant), and it allows the sender to quickly close the connection and clean up.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
 # iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
For other protocols, we add a final rule to the INPUT chain to reject all remaining incoming traffic with icmp protocol unreachable messages. This imitates Linux&#039;s default behavior.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
=== iptables.rules のサンプルファイル ===&lt;br /&gt;
&lt;br /&gt;
上記のコマンドを全て実行した時に作成される {{ic|iptables.rules}} ファイルの例:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/iptables/iptables.rules|&lt;br /&gt;
# Generated by iptables-save v1.4.18 on Sun Mar 17 14:21:12 2013&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:TCP - [0:0]&lt;br /&gt;
:UDP - [0:0]&lt;br /&gt;
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
-A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
-A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Sun Mar 17 14:21:12 2013&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
このファイルは次のコマンドで生成できます:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
生成したファイルは下のセクションで使うことができます。SSH 経由でリモートからファイアウォールを設定する場合、先に進む前に新しい SSH 接続を許可するため以下のルールを追加してください (ポート番号は必要に応じて変更してください):&lt;br /&gt;
&lt;br /&gt;
 -A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
=== TCP と UDP チェイン ===&lt;br /&gt;
&lt;br /&gt;
TCP と UDP チェインには特定のポートで新規接続の TCP 接続と UDP ストリームを許可するルールを作成します。&lt;br /&gt;
&lt;br /&gt;
{{Note|リモートからアクセスする SSH や HTTP などのサービスの接続を許可するためのルールを追加する必要があります。}}&lt;br /&gt;
&lt;br /&gt;
==== 接続要求でポートを開く ====&lt;br /&gt;
&lt;br /&gt;
ウェブサーバーへの TCP 接続を許可するには (ポート 80):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
ウェブサーバーへの TCP 接続 (HTTPS) を許可するには (ポート 443):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 443 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
SSH のリモート接続を許可するには (ポート 22):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
DNS サーバーへの UDP ストリームを許可するには (ポート 53):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A UDP -p udp --dport 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
複数のポートにマッチするような、高度なルールについては {{Ic|man iptables}} を見て下さい。&lt;br /&gt;
&lt;br /&gt;
==== ポートノッキング ====&lt;br /&gt;
デフォルトではファイアウォールによって閉じられているポートを、外部から開く方法がポートノッキングです。予め決めておいたポートに連続して接続試行することで行います。正しいポート&amp;quot;ノック&amp;quot; (接続試行) がなされた場合、ファイアウォールは特定のポートを開いて接続できるようにします。詳しくは[[ポートノッキング]]を見て下さい。&lt;br /&gt;
&lt;br /&gt;
=== なりすまし攻撃からの防護 ===&lt;br /&gt;
&lt;br /&gt;
{{Note|現在 {{ic|rp_filter}} はデフォルトで {{ic|/usr/lib/sysctl.d/50-default.conf}} で {{ic|1}} に設定されているため、以下の手順は必要ありません。}}&lt;br /&gt;
&lt;br /&gt;
インターネットやローカルネットワークからの予約ローカルアドレスの使用は sysctl で {{Ic|rp_filter}} (Reverse Path Filter) を 1 に設定することでブロックされます。以下の行を {{Ic|/etc/sysctl.d/90-firewall.conf}} ファイルに追加することで Linux カーネルに組み込まれている送信元アドレス検証が有効になります (詳しくは [[sysctl]] を参照)。カーネルによる検証は個別の iptables ルールよりもなりすましを上手く処理します:&lt;br /&gt;
&lt;br /&gt;
 net.ipv4.conf.all.rp_filter=1&lt;br /&gt;
&lt;br /&gt;
統計が必要な場合、netfilter で設定することもできます:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t raw -I PREROUTING -m rpfilter --invert -j DROP&lt;br /&gt;
&lt;br /&gt;
{{Note|両方を有効にする意味はありません。netfilter の方法のほうが新しく IPv6 でも機能します。}}&lt;br /&gt;
&lt;br /&gt;
非同期ルーティングを使用する構成の場合、代わりに {{ic|1=rp_filter=2}} sysctl オプションを使用する必要があります。{{ic|--loose}} スイッチを {{ic|rpfilter}} モジュールに渡すことで netfilter と同じ設定ができます。&lt;br /&gt;
&lt;br /&gt;
=== コンピュータを&amp;quot;隠匿&amp;quot;する ===&lt;br /&gt;
&lt;br /&gt;
デスクトップマシンとして使っている場合、特定の接続要求はブロックするのが好ましいでしょう。&lt;br /&gt;
&lt;br /&gt;
==== ping リクエストのブロック ====&lt;br /&gt;
&lt;br /&gt;
&#039;Ping&#039; リクエストはデバイス間の通信状態を確認するために送信先アドレスに送られる ICMP パケットです。ネットワークが問題ないようでしたら、ping リクエストは全てブロックしてもかまいません。リクエストをブロックするだけではコンピュータを隠匿することにはならないので注意してください。たとえコンピュータに送られた全てのパケットを拒否したとしても、シンプルな nmap による IP 範囲の &amp;quot;ping スキャン&amp;quot; で露顕してしまいます。&lt;br /&gt;
&lt;br /&gt;
ブロックは初歩的な&amp;quot;防護&amp;quot;であり、将来問題が起こった時にデバッグするのが困難になります。あくまで勉強用にやってみるくらいにしてください。&lt;br /&gt;
&lt;br /&gt;
エコー要求をブロックするには、次の行を {{Ic|/etc/sysctl.d/90-firewall.conf}} ファイルに追加してください (詳しくは [[sysctl]] を参照):&lt;br /&gt;
&lt;br /&gt;
 net.ipv4.icmp_echo_ignore_all = 1&lt;br /&gt;
&lt;br /&gt;
詳しくは iptables の man ページや http://www.snowman.net/projects/ipt_recent/ のドキュメントやサンプルを読んでください。&lt;br /&gt;
&lt;br /&gt;
==== ポートスキャナを騙す ====&lt;br /&gt;
&lt;br /&gt;
{{Note|以下の設定は [[Wikipedia:ja:DoS攻撃|DoS]] 攻撃に悪用される可能性があります。偽装した IP でパケットを送信してサービスへの接続をブロックさせてしまうという攻撃が考えられます。}}&lt;br /&gt;
&lt;br /&gt;
攻撃者はポートスキャンを使ってコンピュータの開いているポートを確認します。ポートスキャンによって攻撃者は稼働しているサービスを調査することができ、場合によってはサービスの脆弱性を利用してくる可能性があります。&lt;br /&gt;
&lt;br /&gt;
INVALID ステートルールは UDP, ACK, SYN スキャン以外の全てのポートスキャンを処理します (nmap ではそれぞれ -sU, -sA, -sS)。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ACK スキャン&#039;&#039;は開いているポートを確認するのには使われませんが、ファイアウォールによってフィルタリングされているポートを識別するのには使われます。NEW ステートの TCP 接続は全て SYN チェックするため、ACK スキャンによって送信されたパケットは全て TCP RESET パケットで拒否されます。一部のファイアウォールはパケットを破棄するため、攻撃者はファイアウォールのルールを暴き出すことができます。&lt;br /&gt;
&lt;br /&gt;
recent モジュールを使うことで他の2種類のポートスキャンを騙すことができます。recent モジュールでホストを &amp;quot;recent&amp;quot; リストに追加して、特定の種類の攻撃を停止させます。現在の recent リストは {{Ic|/proc/net/xt_recent/}} で確認できます。&lt;br /&gt;
&lt;br /&gt;
===== SYN スキャン =====&lt;br /&gt;
&lt;br /&gt;
SYN スキャンでは、ポートスキャナは全てのポートに SYN パケットを送信します。閉じられているポートは TCP RESET パケットを返しますが、厳格なファイアウォールはパケットを破棄します。開いているポートは、ファイアウォールがあるかどうかに関わらず、SYN ACK パケットを返します。&lt;br /&gt;
&lt;br /&gt;
recent モジュールを使うことで接続を拒否されたホストの記録をつけることができ、開いているポートに SYN パケットが送信されたときにポートが閉じているかのように TCP RESET を返すことが可能です。開かれているポートが最初にスキャンされた場合、SYN ACK が返されてしまうため、確実にポートを隠匿するには標準以外のポートを ssh などのアプリケーションで使用する必要があります。&lt;br /&gt;
&lt;br /&gt;
まず、TCP チェインの一番上にルールを追加します。以下のルールは過去60秒以内に TCP-PORTSCAN リストに入ったホストに対して TCP RESET で応答します。{{Ic|--update}} スイッチで recent リストが更新され、60秒のカウンターがリセットされます。&lt;br /&gt;
&lt;br /&gt;
 # iptables -I TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
そして TCP パケットを拒否するルールを修正して拒否されたパケットを送信したホストを TCP-PORTSCAN リストに追加するようにしてください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
 # iptables -A INPUT -p tcp -m recent --set --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
===== UDP スキャン =====&lt;br /&gt;
&lt;br /&gt;
UDP ポートスキャンは TCP の SYN スキャンと似ていますが UDP は &amp;quot;connectionless&amp;quot; プロトコルです。ハンドシェイクや ACK は存在しません。代わりに、スキャナは各 UDP ポートに UDP パケットを送信します。ポートが閉じていると ICMP のポート到達不可メッセージが返ってきますが、ポートが開いている場合、何も返答が返ってきません。UDP は &amp;quot;reliable&amp;quot; プロトコルではないので、パケットが消失したかどうか知る手段がスキャナにはなく、返答がないポートを何度も確認する必要があります。&lt;br /&gt;
&lt;br /&gt;
Linux カーネルは ICMP ポートの到達不可メッセージを非常にゆっくりと送信するため、Linux マシンに対して完全な UDP スキャンをかけようとすると10時間以上かかります。それでも、一般的なポートは識別できるため、SYN スキャンに対してと同じ対抗策を UDP スキャンに対しても設定すると良いでしょう。&lt;br /&gt;
&lt;br /&gt;
まず UDP-PORTSCAN リストのホストからのパケットを拒否するルールを UDP チェインの一番上に追加してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -I UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
&lt;br /&gt;
そして、UDP の拒否パケットルールを以下のように修正します:&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
 # iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
&lt;br /&gt;
===== 最終的なルールのリストア =====&lt;br /&gt;
&lt;br /&gt;
If either or both of the portscanning tricks above were used the final default rule is no longer the last rule in the INPUT chain. It needs to be the last rule otherwise it will intercept the trick port scanner rules you just added and they will never be used.  Simply delete the rule (-D), then add it once again using append (-A) which will place it at the end of the chain.&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
 # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
=== 他の攻撃からの防護 ===&lt;br /&gt;
&lt;br /&gt;
関連するカーネルパラメータは [[sysctl#TCP/IP スタックの防御]] に載っています。&lt;br /&gt;
&lt;br /&gt;
==== ブルートフォース攻撃 ====&lt;br /&gt;
&lt;br /&gt;
残念ながら、外部 IP アドレスからアクセスできるサービスにはよくブルートフォース攻撃が行われます。ブルートフォース攻撃が普遍的な理由としては、攻撃を行うのがとても簡単で、攻撃用のツールが数多く存在するということが挙げられます。幸いに、ブルートフォース攻撃からサービスを守るための方法はいろいろあります。その一つとして、適切な {{ic|iptables}} ルールを使って接続を開始しようとするパケットが一定数あったときに IP をブラックリストに入れる方法があります。また、ログファイルを監視して、試行失敗からブラックリストを作成する専用のデーモンを使うこともできます。&lt;br /&gt;
{{Warning|IP ブラックリストを使うことで攻撃を多少止めることはできますが、別段にデーモンを使う必要があり、ログがちゃんと記録されてないと上手くいきません (攻撃者が執拗にサーバーを攻撃した場合、{{ic|/var}} を含むパーティションが満杯になる可能性があります)。さらに、攻撃者にあなたの IP アドレスが知られてしまったら、攻撃者はソースヘッダを偽装してパケットを送りつけることができるため、サーバーから締め出される恐れもあります。ブルートフォース攻撃については [[SSH 鍵]]がスマートな解決法になるでしょう。}}&lt;br /&gt;
パスワード認証 (特に {{ic|sshd}}) が何回も失敗した時にその IP を接続不可にするパッケージとして [[Fail2ban]] と [[Sshguard]] が存在します。どちらも iptables のルールを更新することで、ブラックリストに入っている IP アドレスからの接続を拒否します。&lt;br /&gt;
&lt;br /&gt;
以下は {{ic|iptables}} を使って SSH のブルートフォース攻撃を止めるための設定例です:&lt;br /&gt;
&lt;br /&gt;
 # iptables -N IN_SSH&lt;br /&gt;
 # iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP&lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP &lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --set -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Most of the options should be self-explanatory, they allow for three connection packets in ten seconds. Further tries in that time will blacklist the IP. The next rule adds a quirk by allowing a total of four attempts in 30 minutes. This is done because some bruteforce attacks are actually performed slow and not in a burst of attempts. The rules employ a number of additional options. To read more about them, check the original reference for this example: [http://compilefailure.blogspot.com/2011/04/better-ssh-brute-force-prevention-with.html compilefailure.blogspot.com]&lt;br /&gt;
&lt;br /&gt;
Using the above rules, now ensure that:&lt;br /&gt;
 # iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
is in an appropriate position in the iptables.rules file. &lt;br /&gt;
&lt;br /&gt;
This arrangement works for the IN_SSH rule if you followed this entire wiki so far:&lt;br /&gt;
 *&lt;br /&gt;
 -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
 -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
 -A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
 *&lt;br /&gt;
&lt;br /&gt;
The above rules can, of course, be used to protect any service, though protecting the SSH daemon is probably the most often required one.&lt;br /&gt;
&lt;br /&gt;
{{Tip|For self-testing the rules after setup, the actual blacklist happening can slow the test making it difficult to fine-tune parameters. One can watch the incoming attempts via {{ic|cat /proc/net/xt_recent/sshbf}}. To unblock the own IP during testing, root is needed {{ic|# echo / &amp;gt; /proc/net/xt_recent/sshbf}}}}&lt;br /&gt;
&lt;br /&gt;
=== ルールの保存 ===&lt;br /&gt;
&lt;br /&gt;
ルールセットの設定が完了したら、ハードドライブに保存して、マシンを起動する度にロードされるようにします。&lt;br /&gt;
&lt;br /&gt;
ルールの設定を保存する場所は systemd のユニットファイルで指定します:&lt;br /&gt;
&lt;br /&gt;
 iptables=/etc/iptables/iptables.rules&lt;br /&gt;
 ip6tables=/etc/iptables/ip6tables.rules&lt;br /&gt;
&lt;br /&gt;
次のコマンドでルールを保存します:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
そして &#039;&#039;&#039;iptables&#039;&#039;&#039; [[デーモン]]を有効化して、起動時にルールがロードされるようにしてください。&lt;br /&gt;
&lt;br /&gt;
ルールが正しくロードされているか確認するには次のコマンドを使用:&lt;br /&gt;
&lt;br /&gt;
 # systemctl start iptables.service &amp;amp;&amp;amp; systemctl status iptables.service&lt;br /&gt;
&lt;br /&gt;
=== IPv6 ===&lt;br /&gt;
&lt;br /&gt;
IPv6 を使用しない場合 (ほとんどの ISP は IPv6 をサポートしていません)、[[IPv6#IPv6 の無効化|無効化]]したほうが良いでしょう。&lt;br /&gt;
&lt;br /&gt;
使用する場合、IPv6 のファイアウォールルールを有効にしてください。まず IPv4 のルールをベースとしてコピー:&lt;br /&gt;
 # cp /etc/iptables/iptables.rules /etc/iptables/ip6tables.rules&lt;br /&gt;
最初に、ルールの中で記述している IP を IPv4 のフォーマットから IPv6 のフォーマットに変換します。&lt;br /&gt;
&lt;br /&gt;
Next, a few of the rules (built as example in this article for IPv4) have to be adapted. IPv6 obtained a new ICMPv6 protocol, replacing ICMP. Hence, the reject error return codes {{ic|--reject-with icmp-port-unreachable}} and {{ic|--reject-with icmp-proto-unreachable}} have to be converted to ICMPv6 codes. &lt;br /&gt;
&lt;br /&gt;
The available ICMPv6 error codes are listed in [https://tools.ietf.org/html/rfc4443#section-3.1 RFC 4443], which specifies connection attempts blocked by a firewall rule should use {{ic|--reject-with icmp6-adm-prohibited}}. Doing so will basically inform the remote system that the connection was rejected by a firewall, rather than a listening service. &lt;br /&gt;
&lt;br /&gt;
If it is preferred not to explicitly inform about the existence of a firewall filter, the packet may also be rejected without the message: &lt;br /&gt;
&lt;br /&gt;
  -A INPUT -j REJECT&lt;br /&gt;
&lt;br /&gt;
The above will reject with the default return error of {{ic|--reject-with-icmp6-port-unreachable}}. You should note though, that identifying a firewall is a basic feature of port scanning applications and most will identify it regardless. &lt;br /&gt;
&lt;br /&gt;
In the next step make sure the protocol and extension are changed to be IPv6 appropriate for the rule regarding all new incoming ICMP echo requests (pings):&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Netfilter conntrack does not appear to track ICMPv6 Neighbor Discovery Protocol (the IPv6 equivalent of ARP), so we need to allow ICMPv6 traffic regardless of state for all directly attached subnets. The following should be inserted after dropping {{ic|--ctstate INVALID}}, but before any other DROP or REJECT targets, along with a corresponding line for each directly attached subnet:&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Since there is no kernel reverse path filter for IPv6, you may want to enable one in &#039;&#039;ip6tables&#039;&#039; with the following:&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -t raw -A PREROUTING -m rpfilter -j ACCEPT&lt;br /&gt;
 # ip6tables -t raw -A PREROUTING -j DROP&lt;br /&gt;
&lt;br /&gt;
設定が完了したら、&#039;&#039;ip6tables&#039;&#039; サービスを[[有効化]]してください。&#039;&#039;iptables&#039;&#039; とは別個に実行させます。&lt;br /&gt;
&lt;br /&gt;
== NAT ゲートウェイの設定 ==&lt;br /&gt;
&lt;br /&gt;
このセクションでは NAT ゲートウェイについて扱います。[[#シングルマシン用のファイアウォール|ガイドの前半部分]]を読んで &#039;&#039;&#039;INPUT&#039;&#039;&#039;, &#039;&#039;&#039;OUTPUT&#039;&#039;&#039;, &#039;&#039;&#039;TCP&#039;&#039;&#039;, &#039;&#039;&#039;UDP&#039;&#039;&#039; チェインを設定していることが前提です。これまで全てのルールは &#039;&#039;&#039;filter&#039;&#039;&#039; テーブルに作成していました。このセクションでは、&#039;&#039;&#039;nat&#039;&#039;&#039; テーブルも使用していきます。&lt;br /&gt;
&lt;br /&gt;
=== フィルターテーブルの設定 ===&lt;br /&gt;
&lt;br /&gt;
==== 必要なチェインの作成 ====&lt;br /&gt;
&lt;br /&gt;
以下の設定では、2つの異なるチェインをフィルターテーブルで使用します: &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; と &#039;&#039;&#039;fw-open&#039;&#039;&#039; チェインです。以下のコマンドでチェインを作成してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -N fw-interfaces&lt;br /&gt;
 # iptables -N fw-open&lt;br /&gt;
&lt;br /&gt;
==== FORWARD チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FORWARD&#039;&#039;&#039; チェインの設定は上のセクションにある &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインの設定と大体同じです。&lt;br /&gt;
&lt;br /&gt;
Now we set up a rule with the &#039;&#039;&#039;conntrack&#039;&#039;&#039; match, identical to the one in the &#039;&#039;&#039;INPUT&#039;&#039;&#039; chain:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The next step is to enable forwarding for trusted interfaces and to make all packets pass the &#039;&#039;&#039;fw-open&#039;&#039;&#039; chain.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -j fw-interfaces &lt;br /&gt;
 # iptables -A FORWARD -j fw-open &lt;br /&gt;
&lt;br /&gt;
The remaining packets are denied with an &#039;&#039;&#039;ICMP&#039;&#039;&#039; message:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -j REJECT --reject-with icmp-host-unreachable&lt;br /&gt;
 # iptables -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
==== fw-interfaces と fw-open チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
The meaning of the &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; and &#039;&#039;&#039;fw-open&#039;&#039;&#039; chains is explained later, when we deal with the &#039;&#039;&#039;POSTROUTING&#039;&#039;&#039; and &#039;&#039;&#039;PREROUTING&#039;&#039;&#039; chains in the &#039;&#039;&#039;nat&#039;&#039;&#039; table, respectively.&lt;br /&gt;
&lt;br /&gt;
=== nat テーブルの設定 ===&lt;br /&gt;
&lt;br /&gt;
このセクションでは、出力インターフェイス (公のインターネット IP が付与されるインターフェイス) の名前を &#039;&#039;&#039;ppp0&#039;&#039;&#039; とします。使用する出力インターフェイスが別の名前の場合、以下のルールで使われている名前もそれにあわせて変更するようにしてください。&lt;br /&gt;
&lt;br /&gt;
==== POSTROUTING チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
Now, we have to define who is allowed to connect to the internet. Let&#039;s assume we have the subnet &#039;&#039;&#039;192.168.0.0/24&#039;&#039;&#039; (which means all addresses that are of the form 192.168.0.*) on &#039;&#039;&#039;eth0&#039;&#039;&#039;. We first need to accept the machines on this interface in the FORWARD table, that is why we created the &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; chain above:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A fw-interfaces -i eth0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Now, we have to alter all outgoing packets so that they have our public IP address as the source address, instead of the local LAN address. To do this, we use the &#039;&#039;&#039;MASQUERADE&#039;&#039;&#039; target:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
上記の &#039;&#039;&#039;-o ppp0&#039;&#039;&#039; パラメータは必ず必要なので忘れないでください。パラメータを記述しなかった場合、ネットワークが接続できなくなります。&lt;br /&gt;
&lt;br /&gt;
Let&#039;s assume we have another subnet, &#039;&#039;&#039;10.3.0.0/16&#039;&#039;&#039; (which means all addresses 10.3.*.*), on the interface &#039;&#039;&#039;eth1&#039;&#039;&#039;. We add the same rules as above again:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A fw-interfaces -i eth1 -j ACCEPT&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -s 10.3.0.0/16 -o ppp0 -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
最後に[[インターネット共有#パケット転送の有効化|パケット転送を有効化]]してください (既に有効にしている場合は必要ありません)。&lt;br /&gt;
&lt;br /&gt;
Machines from these subnets can now use your new NAT machine as their gateway. Note that you may want to set up a DNS and DHCP server like &#039;&#039;&#039;dnsmasq&#039;&#039;&#039; or a combination of &#039;&#039;&#039;bind&#039;&#039;&#039; and &#039;&#039;&#039;dhcpd&#039;&#039;&#039; to simplify network settings DNS resolution on the client machines. This is not the topic of this guide.&lt;br /&gt;
&lt;br /&gt;
==== PREROUTING チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
Sometimes, we want to change the address of an incoming packet from the gateway to a LAN machine. To do this, we use the &#039;&#039;&#039;fw-open&#039;&#039;&#039; chain defined above, as well as the &#039;&#039;&#039;PREROUTING&#039;&#039;&#039; chain in the &#039;&#039;&#039;nat&#039;&#039;&#039; table in the following two simple examples. &lt;br /&gt;
&lt;br /&gt;
First, we want to change all incoming SSH packets (port 22) to the ssh server of the machine &#039;&#039;&#039;192.168.0.5&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT --to 192.168.0.5&lt;br /&gt;
 # iptables -A fw-open -d 192.168.0.5 -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The second example will show you how to change packets to a different port than the incoming port. We want to change any incoming connection on port &#039;&#039;&#039;8000&#039;&#039;&#039; to our web server on &#039;&#039;&#039;192.168.0.6&#039;&#039;&#039;, port &#039;&#039;&#039;80&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to 192.168.0.6:80&lt;br /&gt;
 # iptables -A fw-open -d 192.168.0.6 -p tcp --dport 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The same setup also works with udp packets.&lt;br /&gt;
&lt;br /&gt;
=== ルールの保存 ===&lt;br /&gt;
&lt;br /&gt;
ルールを保存してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
そして &#039;&#039;&#039;iptables&#039;&#039;&#039; [[デーモン]]を有効にすることで、起動時にルールがロードされるようにします。&lt;br /&gt;
&lt;br /&gt;
== 参照 ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.webhostingtalk.com/showthread.php?t=456571 Methods to block SSH attacks]&lt;br /&gt;
*[http://www.ducea.com/2006/06/28/using-iptables-to-block-brute-force-attacks/ Using iptables to block brute force attacks]&lt;br /&gt;
*[http://linuxconfig.org/collection-of-basic-linux-firewall-iptables-rules 20 Iptables Examples For New SysAdmins]&lt;br /&gt;
*[http://www.thegeekstuff.com/2011/06/iptables-rules-examples/ 25 Most Frequently Used Linux IPTables Rules Examples]&lt;/div&gt;</summary>
		<author><name>Tezca</name></author>
	</entry>
	<entry>
		<id>https://wiki.archlinux.jp/index.php?title=%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%95%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB&amp;diff=8833</id>
		<title>シンプルなステートフルファイアウォール</title>
		<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php?title=%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%95%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB&amp;diff=8833"/>
		<updated>2017-05-11T09:17:24Z</updated>

		<summary type="html">&lt;p&gt;Tezca: /* INPUT チェイン */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ファイアウォール]]&lt;br /&gt;
[[en:Simple stateful firewall]]&lt;br /&gt;
[[es:Simple stateful firewall]]&lt;br /&gt;
[[ru:Simple stateful firewall]]&lt;br /&gt;
[[zh-hans:Simple stateful firewall]]&lt;br /&gt;
{{Related articles start}}&lt;br /&gt;
{{Related|インターネット共有}}&lt;br /&gt;
{{Related|ルーター}}&lt;br /&gt;
{{Related|ファイアウォール}}&lt;br /&gt;
{{Related|Uncomplicated Firewall}}&lt;br /&gt;
{{Related articles end}}&lt;br /&gt;
このページでは [[iptables]] を使ってステートフルファイアウォールを設定する方法を説明します。また、ルールの意味と理由の説明も行います。シンプルに説明するため、大きく2つのセクションにページは分かれています。最初のセクションではシングルマシンのためのファイアウォールを扱い、2番目のセクションでは最初のセクションのファイアウォールに加えて NAT ゲートウェイを設定します。&lt;br /&gt;
&lt;br /&gt;
{{Warning|記述されているルールは順番通りに実行してください。リモートマシンにログインしている場合、ルールを設定している間にマシンから閉めだされてしまう可能性があります。以下の手順に従うのはローカルでログインしている場合に限ります。[[#iptables.rules のサンプルファイル|サンプル設定ファイル]]を使うことでこの問題を回避することが可能です。}}&lt;br /&gt;
&lt;br /&gt;
== 前提要件 ==&lt;br /&gt;
&lt;br /&gt;
{{Note|iptables のサポートを有効にしてカーネルがコンパイルされている必要があります。Arch Linux の標準カーネルには iptables のサポートが含まれています。}}&lt;br /&gt;
&lt;br /&gt;
まず、ユーザーランドユーティリティ {{Pkg|iptables}} をインストールしてください。もしくは既にインストール済みかどうか確認してください。&lt;br /&gt;
&lt;br /&gt;
この記事では iptables のルールセットが全く存在しないことを前提としています。現在のルールセットをチェックして、ルールが存在しないことを確認するには、次を実行:&lt;br /&gt;
&lt;br /&gt;
{{hc|# iptables-save|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Generated by iptables-save v1.4.19.1 on Thu Aug  1 19:28:53 2013&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT ACCEPT [50:3763]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [30:3472]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Thu Aug  1 19:28:53 2013&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
もしくは&lt;br /&gt;
&lt;br /&gt;
{{hc|# iptables -nvL --line-numbers|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Chain INPUT (policy ACCEPT 156 packets, 12541 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 82 packets, 8672 bytes)&lt;br /&gt;
num   pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
ルールが存在する場合、デフォルトのルールセットをロードすることでルールをリセットすることが可能です:&lt;br /&gt;
&lt;br /&gt;
 # iptables-restore &amp;lt; /etc/iptables/empty.rules&lt;br /&gt;
&lt;br /&gt;
もしくは、[[Iptables#ルールをリセットする]] を参照。&lt;br /&gt;
&lt;br /&gt;
== シングルマシン用のファイアウォール ==&lt;br /&gt;
&lt;br /&gt;
{{Note|iptables はチェインの上から下の順番でルールを処理していくため、よくヒットするルールをチェインの初めに置くことを推奨します。もちろん、実行されるロジックによって制約は出て来ます。また、ルールにはランタイムコストもあるため、バイト/パケット数のカウンタだけを見てルールの順番を並び替えるのは賢いとは言えません。}}&lt;br /&gt;
&lt;br /&gt;
=== 必要なチェインの作成 ===&lt;br /&gt;
&lt;br /&gt;
基本的なセットアップとして、2つのユーザー定義チェインを作成し、それを使ってファイアウォールのポートを開きます。&lt;br /&gt;
&lt;br /&gt;
 # iptables -N TCP&lt;br /&gt;
 # iptables -N UDP&lt;br /&gt;
&lt;br /&gt;
もちろんチェインの名前は何でもかまいません。ここでは後のルールで使用するプロトコルに沿うように名前を決めています。&lt;br /&gt;
&lt;br /&gt;
=== FORWARD チェイン ===&lt;br /&gt;
&lt;br /&gt;
マシンを NAT ゲートウェイとしてセットアップしたい場合、[[#NAT ゲートウェイの設定]]を見て下さい。シングルマシンの場合、&#039;&#039;&#039;FORWARD&#039;&#039;&#039; チェインのポリシーをとりあえず &#039;&#039;&#039;DROP&#039;&#039;&#039; に設定して先に進みます:&lt;br /&gt;
&lt;br /&gt;
 # iptables -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
=== OUTPUT チェイン ===&lt;br /&gt;
&lt;br /&gt;
送信トラフィックはフィルタリングしません。セットアップがとても複雑になってしまい、いろいろと考える必要が出てくるからです。ここではシンプルに、&#039;&#039;&#039;OUTPUT&#039;&#039;&#039; ポリシーを &#039;&#039;&#039;ACCEPT&#039;&#039;&#039; に設定します。&lt;br /&gt;
&lt;br /&gt;
 # iptables -P OUTPUT ACCEPT&lt;br /&gt;
&lt;br /&gt;
=== INPUT チェイン ===&lt;br /&gt;
&lt;br /&gt;
上記のチェインと同じように、勝手にルールを通過してしまわないように &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインのデフォルトポリシーは &#039;&#039;&#039;DROP&#039;&#039;&#039; に設定します。セキュアなファイアウォールを設定するときは、全てのトラフィックをドロップしてから、許可するトラフィックを指定するのがベストです。&lt;br /&gt;
&lt;br /&gt;
{{Warning|SSH でログインしている場合、以下の設定をすると SSH セッションが即座に切断されます。切断されないようにするには: (1) 下の INPUT チェインのルールを先に追加 (それでセッションが開いたままになります), (2) インバウンド SSH を許可するルールを追加 (接続が終了した場合に再接続できるようにするため) (3) ポリシーを設定。}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -P INPUT DROP&lt;br /&gt;
&lt;br /&gt;
あらゆるネットワークインターフェイスから受信されたパケットは全て &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインをまず通過します (パケットの送信先が対象のマシンになっている場合)。このチェインの中では、問題ないと思われるパケットだけを許可するようにします。&lt;br /&gt;
&lt;br /&gt;
INPUT チェインにはまず、確立済みの接続に属するトラフィックや、ICMP エラーまたはエコー応答 (ping されたときにホストが返すパケット) などの接続に関連する正当なトラフィックを許可するルールを追加します。&#039;&#039;&#039;ICMP&#039;&#039;&#039; は &#039;&#039;&#039;Internet Control Message Protocol&#039;&#039;&#039; の略です。ICMP メッセージは輻輳制御や MTU にとても重要なので、このルールによって通してやります。&lt;br /&gt;
&lt;br /&gt;
接続ステート {{ic|ESTABLISHED}} は最初の ({{ic|--ctstate NEW}}) 接続試行で許可された以前の他のルール、またはルールの設定時にアクティブになっていた接続 (例えばアクティブな SSH リモート接続) を示します:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
次のルールでは &amp;quot;loopback&amp;quot; (lo) インターフェイスからのトラフィックを全て許可します。多くのアプリケーションやサービスで必須となります。&lt;br /&gt;
&lt;br /&gt;
{{Note|ファイアウォールでトラフィックを規制したくない場合 &amp;quot;eth1&amp;quot; など信頼できるインターフェイスを追加することもできます。ただし、ネットワーク上のあらゆる場所 (例えばルーターなど) からのあらゆるトラフィックを転送する NAT 構成にしている場合、他の設定は無関係になるため注意してください。}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -i lo -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
3番目のルールでは &amp;quot;INVALID&amp;quot; ステートに一致する全てのトラフィックを破棄します。トラフィックは4つの &amp;quot;state&amp;quot; カテゴリに分けることができます: NEW, ESTABLISHED, RELATED, INVALID。これによって &amp;quot;stateless&amp;quot; ファイアウォールではなく &amp;quot;stateful&amp;quot; ファイアウォールと呼称しています。ステートは &amp;quot;nf_conntrack_*&amp;quot; カーネルモジュールによって追跡されます。カーネルモジュールはルールを追加したときにカーネルによって自動的にロードされます。&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* 以下のルールはヘッダーやチェック、TCP フラグがおかしいパケットや不適切な ICMP メッセージ (ホストに何も送信していないのにポート到達不可など)、シーケンス番号予測攻撃などによるシーケンス外のパケットを全て破棄します。&amp;quot;DROP&amp;quot; ターゲットは何も返答せずにパケットを破棄します。それに対して REJECT は礼儀正しくパケットを拒否します。INVALID なパケットに対する適切な &amp;quot;REJECT&amp;quot; レスポンスはありえないため、パケットを受信したことを誰にも分からないように DROP を使っています。&lt;br /&gt;
* ICMPv6 近隣探索パケットは未追跡のまま、たとえ壊れていなくても常に &amp;quot;INVALID&amp;quot; に分類されます。次のコマンドで承認することができます: {{ic|iptables -A INPUT -p 41 -j ACCEPT}}。&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
次のルールでは &#039;&#039;&#039;ICMP エコー要求&#039;&#039;&#039; (ping) を全て許可します。最初のパケットだけを NEW としてカウントし、後は全て RELATED,ESTABLISHED ルールで処理します。コンピュータはルーターではないので、他の ICMP トラフィックをステート NEW で許可する必要はありません。&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
新しく来た接続を処理するために、INPUT チェインに TCP チェインと UDP チェインを適用します。いったん TCP チェインや UDP チェインで接続が許可されると、以降は&lt;br /&gt;
RRELATED/ESTABLISHED のルールで処理されます。TCP チェインと UDP チェインはどちらも新しく来た接続を許可するか、または丁寧にそれらを REJECT します。新しい TCP 接続は必ず SYN&lt;br /&gt;
パケットから始まります。&lt;br /&gt;
&lt;br /&gt;
{{Note| NEW but not SYN is the only invalid TCP flag not covered by the INVALID state. The reason is because they are rarely malicious packets, and they should not just be dropped. Instead, we simply do not accept them, so they are rejected with a TCP RESET by the next rule.}}&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
 # iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
&lt;br /&gt;
We reject TCP connections with TCP RESET packets and UDP streams with ICMP port unreachable messages if the ports are not opened. This imitates default Linux behavior (RFC compliant), and it allows the sender to quickly close the connection and clean up.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
 # iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
For other protocols, we add a final rule to the INPUT chain to reject all remaining incoming traffic with icmp protocol unreachable messages. This imitates Linux&#039;s default behavior.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
=== iptables.rules のサンプルファイル ===&lt;br /&gt;
&lt;br /&gt;
上記のコマンドを全て実行した時に作成される {{ic|iptables.rules}} ファイルの例:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/iptables/iptables.rules|&lt;br /&gt;
# Generated by iptables-save v1.4.18 on Sun Mar 17 14:21:12 2013&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:TCP - [0:0]&lt;br /&gt;
:UDP - [0:0]&lt;br /&gt;
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
-A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
-A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Sun Mar 17 14:21:12 2013&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
このファイルは次のコマンドで生成できます:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
生成したファイルは下のセクションで使うことができます。SSH 経由でリモートからファイアウォールを設定する場合、先に進む前に新しい SSH 接続を許可するため以下のルールを追加してください (ポート番号は必要に応じて変更してください):&lt;br /&gt;
&lt;br /&gt;
 -A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
=== TCP と UDP チェイン ===&lt;br /&gt;
&lt;br /&gt;
TCP と UDP チェインには特定のポートで新規接続の TCP 接続と UDP ストリームを許可するルールを作成します。&lt;br /&gt;
&lt;br /&gt;
{{Note|リモートからアクセスする SSH や HTTP などのサービスの接続を許可するためのルールを追加する必要があります。}}&lt;br /&gt;
&lt;br /&gt;
==== 接続要求でポートを開く ====&lt;br /&gt;
&lt;br /&gt;
ウェブサーバーへの TCP 接続を許可するには (ポート 80):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
ウェブサーバーへの TCP 接続 (HTTPS) を許可するには (ポート 443):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 443 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
SSH のリモート接続を許可するには (ポート 22):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
DNS サーバーへの UDP ストリームを許可するには (ポート 53):&lt;br /&gt;
&lt;br /&gt;
 # iptables -A UDP -p udp --dport 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
複数のポートにマッチするような、高度なルールについては {{Ic|man iptables}} を見て下さい。&lt;br /&gt;
&lt;br /&gt;
==== ポートノッキング ====&lt;br /&gt;
デフォルトではファイアウォールによって閉じられているポートを、外部から開く方法がポートノッキングです。予め決めておいたポートに連続して接続試行することで行います。正しいポート&amp;quot;ノック&amp;quot; (接続試行) がなされた場合、ファイアウォールは特定のポートを開いて接続できるようにします。詳しくは[[ポートノッキング]]を見て下さい。&lt;br /&gt;
&lt;br /&gt;
=== なりすまし攻撃からの防護 ===&lt;br /&gt;
&lt;br /&gt;
{{Note|現在 {{ic|rp_filter}} はデフォルトで {{ic|/usr/lib/sysctl.d/50-default.conf}} で {{ic|1}} に設定されているため、以下の手順は必要ありません。}}&lt;br /&gt;
&lt;br /&gt;
インターネットやローカルネットワークからの予約ローカルアドレスの使用は sysctl で {{Ic|rp_filter}} (Reverse Path Filter) を 1 に設定することでブロックされます。以下の行を {{Ic|/etc/sysctl.d/90-firewall.conf}} ファイルに追加することで Linux カーネルに組み込まれている送信元アドレス検証が有効になります (詳しくは [[sysctl]] を参照)。カーネルによる検証は個別の iptables ルールよりもなりすましを上手く処理します:&lt;br /&gt;
&lt;br /&gt;
 net.ipv4.conf.all.rp_filter=1&lt;br /&gt;
&lt;br /&gt;
統計が必要な場合、netfilter で設定することもできます:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t raw -I PREROUTING -m rpfilter --invert -j DROP&lt;br /&gt;
&lt;br /&gt;
{{Note|両方を有効にする意味はありません。netfilter の方法のほうが新しく IPv6 でも機能します。}}&lt;br /&gt;
&lt;br /&gt;
非同期ルーティングを使用する構成の場合、代わりに {{ic|1=rp_filter=2}} sysctl オプションを使用する必要があります。{{ic|--loose}} スイッチを {{ic|rpfilter}} モジュールに渡すことで netfilter と同じ設定ができます。&lt;br /&gt;
&lt;br /&gt;
=== コンピュータを&amp;quot;隠匿&amp;quot;する ===&lt;br /&gt;
&lt;br /&gt;
デスクトップマシンとして使っている場合、特定の接続要求はブロックするのが好ましいでしょう。&lt;br /&gt;
&lt;br /&gt;
==== ping リクエストのブロック ====&lt;br /&gt;
&lt;br /&gt;
&#039;Ping&#039; リクエストはデバイス間の通信状態を確認するために送信先アドレスに送られる ICMP パケットです。ネットワークが問題ないようでしたら、ping リクエストは全てブロックしてもかまいません。リクエストをブロックするだけではコンピュータを隠匿することにはならないので注意してください。たとえコンピュータに送られた全てのパケットを拒否したとしても、シンプルな nmap による IP 範囲の &amp;quot;ping スキャン&amp;quot; で露顕してしまいます。&lt;br /&gt;
&lt;br /&gt;
ブロックは初歩的な&amp;quot;防護&amp;quot;であり、将来問題が起こった時にデバッグするのが困難になります。あくまで勉強用にやってみるくらいにしてください。&lt;br /&gt;
&lt;br /&gt;
エコー要求をブロックするには、次の行を {{Ic|/etc/sysctl.d/90-firewall.conf}} ファイルに追加してください (詳しくは [[sysctl]] を参照):&lt;br /&gt;
&lt;br /&gt;
 net.ipv4.icmp_echo_ignore_all = 1&lt;br /&gt;
&lt;br /&gt;
詳しくは iptables の man ページや http://www.snowman.net/projects/ipt_recent/ のドキュメントやサンプルを読んでください。&lt;br /&gt;
&lt;br /&gt;
==== ポートスキャナを騙す ====&lt;br /&gt;
&lt;br /&gt;
{{Note|以下の設定は [[Wikipedia:ja:DoS攻撃|DoS]] 攻撃に悪用される可能性があります。偽装した IP でパケットを送信してサービスへの接続をブロックさせてしまうという攻撃が考えられます。}}&lt;br /&gt;
&lt;br /&gt;
攻撃者はポートスキャンを使ってコンピュータの開いているポートを確認します。ポートスキャンによって攻撃者は稼働しているサービスを調査することができ、場合によってはサービスの脆弱性を利用してくる可能性があります。&lt;br /&gt;
&lt;br /&gt;
INVALID ステートルールは UDP, ACK, SYN スキャン以外の全てのポートスキャンを処理します (nmap ではそれぞれ -sU, -sA, -sS)。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ACK スキャン&#039;&#039;は開いているポートを確認するのには使われませんが、ファイアウォールによってフィルタリングされているポートを識別するのには使われます。NEW ステートの TCP 接続は全て SYN チェックするため、ACK スキャンによって送信されたパケットは全て TCP RESET パケットで拒否されます。一部のファイアウォールはパケットを破棄するため、攻撃者はファイアウォールのルールを暴き出すことができます。&lt;br /&gt;
&lt;br /&gt;
recent モジュールを使うことで他の2種類のポートスキャンを騙すことができます。recent モジュールでホストを &amp;quot;recent&amp;quot; リストに追加して、特定の種類の攻撃を停止させます。現在の recent リストは {{Ic|/proc/net/xt_recent/}} で確認できます。&lt;br /&gt;
&lt;br /&gt;
===== SYN スキャン =====&lt;br /&gt;
&lt;br /&gt;
SYN スキャンでは、ポートスキャナは全てのポートに SYN パケットを送信します。閉じられているポートは TCP RESET パケットを返しますが、厳格なファイアウォールはパケットを破棄します。開いているポートは、ファイアウォールがあるかどうかに関わらず、SYN ACK パケットを返します。&lt;br /&gt;
&lt;br /&gt;
recent モジュールを使うことで接続を拒否されたホストの記録をつけることができ、開いているポートに SYN パケットが送信されたときにポートが閉じているかのように TCP RESET を返すことが可能です。開かれているポートが最初にスキャンされた場合、SYN ACK が返されてしまうため、確実にポートを隠匿するには標準以外のポートを ssh などのアプリケーションで使用する必要があります。&lt;br /&gt;
&lt;br /&gt;
まず、TCP チェインの一番上にルールを追加します。以下のルールは過去60秒以内に TCP-PORTSCAN リストに入ったホストに対して TCP RESET で応答します。{{Ic|--update}} スイッチで recent リストが更新され、60秒のカウンターがリセットされます。&lt;br /&gt;
&lt;br /&gt;
 # iptables -I TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
そして TCP パケットを拒否するルールを修正して拒否されたパケットを送信したホストを TCP-PORTSCAN リストに追加するようにしてください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
 # iptables -A INPUT -p tcp -m recent --set --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset&lt;br /&gt;
&lt;br /&gt;
===== UDP スキャン =====&lt;br /&gt;
&lt;br /&gt;
UDP ポートスキャンは TCP の SYN スキャンと似ていますが UDP は &amp;quot;connectionless&amp;quot; プロトコルです。ハンドシェイクや ACK は存在しません。代わりに、スキャナは各 UDP ポートに UDP パケットを送信します。ポートが閉じていると ICMP のポート到達不可メッセージが返ってきますが、ポートが開いている場合、何も返答が返ってきません。UDP は &amp;quot;reliable&amp;quot; プロトコルではないので、パケットが消失したかどうか知る手段がスキャナにはなく、返答がないポートを何度も確認する必要があります。&lt;br /&gt;
&lt;br /&gt;
Linux カーネルは ICMP ポートの到達不可メッセージを非常にゆっくりと送信するため、Linux マシンに対して完全な UDP スキャンをかけようとすると10時間以上かかります。それでも、一般的なポートは識別できるため、SYN スキャンに対してと同じ対抗策を UDP スキャンに対しても設定すると良いでしょう。&lt;br /&gt;
&lt;br /&gt;
まず UDP-PORTSCAN リストのホストからのパケットを拒否するルールを UDP チェインの一番上に追加してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -I UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
&lt;br /&gt;
そして、UDP の拒否パケットルールを以下のように修正します:&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
 # iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
&lt;br /&gt;
===== 最終的なルールのリストア =====&lt;br /&gt;
&lt;br /&gt;
If either or both of the portscanning tricks above were used the final default rule is no longer the last rule in the INPUT chain. It needs to be the last rule otherwise it will intercept the trick port scanner rules you just added and they will never be used.  Simply delete the rule (-D), then add it once again using append (-A) which will place it at the end of the chain.&lt;br /&gt;
&lt;br /&gt;
 # iptables -D INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
 # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
=== 他の攻撃からの防護 ===&lt;br /&gt;
&lt;br /&gt;
関連するカーネルパラメータは [[sysctl#TCP/IP スタックの防御]] に載っています。&lt;br /&gt;
&lt;br /&gt;
==== ブルートフォース攻撃 ====&lt;br /&gt;
&lt;br /&gt;
残念ながら、外部 IP アドレスからアクセスできるサービスにはよくブルートフォース攻撃が行われます。ブルートフォース攻撃が普遍的な理由としては、攻撃を行うのがとても簡単で、攻撃用のツールが数多く存在するということが挙げられます。幸いに、ブルートフォース攻撃からサービスを守るための方法はいろいろあります。その一つとして、適切な {{ic|iptables}} ルールを使って接続を開始しようとするパケットが一定数あったときに IP をブラックリストに入れる方法があります。また、ログファイルを監視して、試行失敗からブラックリストを作成する専用のデーモンを使うこともできます。&lt;br /&gt;
{{Warning|IP ブラックリストを使うことで攻撃を多少止めることはできますが、別段にデーモンを使う必要があり、ログがちゃんと記録されてないと上手くいきません (攻撃者が執拗にサーバーを攻撃した場合、{{ic|/var}} を含むパーティションが満杯になる可能性があります)。さらに、攻撃者にあなたの IP アドレスが知られてしまったら、攻撃者はソースヘッダを偽装してパケットを送りつけることができるため、サーバーから締め出される恐れもあります。ブルートフォース攻撃については [[SSH 鍵]]がスマートな解決法になるでしょう。}}&lt;br /&gt;
パスワード認証 (特に {{ic|sshd}}) が何回も失敗した時にその IP を接続不可にするパッケージとして [[Fail2ban]] と [[Sshguard]] が存在します。どちらも iptables のルールを更新することで、ブラックリストに入っている IP アドレスからの接続を拒否します。&lt;br /&gt;
&lt;br /&gt;
以下は {{ic|iptables}} を使って SSH のブルートフォース攻撃を止めるための設定例です:&lt;br /&gt;
&lt;br /&gt;
 # iptables -N IN_SSH&lt;br /&gt;
 # iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP&lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP &lt;br /&gt;
 # iptables -A IN_SSH -m recent --name sshbf --set -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Most of the options should be self-explanatory, they allow for three connection packets in ten seconds. Further tries in that time will blacklist the IP. The next rule adds a quirk by allowing a total of four attempts in 30 minutes. This is done because some bruteforce attacks are actually performed slow and not in a burst of attempts. The rules employ a number of additional options. To read more about them, check the original reference for this example: [http://compilefailure.blogspot.com/2011/04/better-ssh-brute-force-prevention-with.html compilefailure.blogspot.com]&lt;br /&gt;
&lt;br /&gt;
Using the above rules, now ensure that:&lt;br /&gt;
 # iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
is in an appropriate position in the iptables.rules file. &lt;br /&gt;
&lt;br /&gt;
This arrangement works for the IN_SSH rule if you followed this entire wiki so far:&lt;br /&gt;
 *&lt;br /&gt;
 -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
 -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j IN_SSH&lt;br /&gt;
 -A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
 *&lt;br /&gt;
&lt;br /&gt;
The above rules can, of course, be used to protect any service, though protecting the SSH daemon is probably the most often required one.&lt;br /&gt;
&lt;br /&gt;
{{Tip|For self-testing the rules after setup, the actual blacklist happening can slow the test making it difficult to fine-tune parameters. One can watch the incoming attempts via {{ic|cat /proc/net/xt_recent/sshbf}}. To unblock the own IP during testing, root is needed {{ic|# echo / &amp;gt; /proc/net/xt_recent/sshbf}}}}&lt;br /&gt;
&lt;br /&gt;
=== ルールの保存 ===&lt;br /&gt;
&lt;br /&gt;
ルールセットの設定が完了したら、ハードドライブに保存して、マシンを起動する度にロードされるようにします。&lt;br /&gt;
&lt;br /&gt;
ルールの設定を保存する場所は systemd のユニットファイルで指定します:&lt;br /&gt;
&lt;br /&gt;
 iptables=/etc/iptables/iptables.rules&lt;br /&gt;
 ip6tables=/etc/iptables/ip6tables.rules&lt;br /&gt;
&lt;br /&gt;
次のコマンドでルールを保存します:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
そして &#039;&#039;&#039;iptables&#039;&#039;&#039; [[デーモン]]を有効化して、起動時にルールがロードされるようにしてください。&lt;br /&gt;
&lt;br /&gt;
ルールが正しくロードされているか確認するには次のコマンドを使用:&lt;br /&gt;
&lt;br /&gt;
 # systemctl start iptables.service &amp;amp;&amp;amp; systemctl status iptables.service&lt;br /&gt;
&lt;br /&gt;
=== IPv6 ===&lt;br /&gt;
&lt;br /&gt;
IPv6 を使用しない場合 (ほとんどの ISP は IPv6 をサポートしていません)、[[IPv6#IPv6 の無効化|無効化]]したほうが良いでしょう。&lt;br /&gt;
&lt;br /&gt;
使用する場合、IPv6 のファイアウォールルールを有効にしてください。まず IPv4 のルールをベースとしてコピー:&lt;br /&gt;
 # cp /etc/iptables/iptables.rules /etc/iptables/ip6tables.rules&lt;br /&gt;
最初に、ルールの中で記述している IP を IPv4 のフォーマットから IPv6 のフォーマットに変換します。&lt;br /&gt;
&lt;br /&gt;
Next, a few of the rules (built as example in this article for IPv4) have to be adapted. IPv6 obtained a new ICMPv6 protocol, replacing ICMP. Hence, the reject error return codes {{ic|--reject-with icmp-port-unreachable}} and {{ic|--reject-with icmp-proto-unreachable}} have to be converted to ICMPv6 codes. &lt;br /&gt;
&lt;br /&gt;
The available ICMPv6 error codes are listed in [https://tools.ietf.org/html/rfc4443#section-3.1 RFC 4443], which specifies connection attempts blocked by a firewall rule should use {{ic|--reject-with icmp6-adm-prohibited}}. Doing so will basically inform the remote system that the connection was rejected by a firewall, rather than a listening service. &lt;br /&gt;
&lt;br /&gt;
If it is preferred not to explicitly inform about the existence of a firewall filter, the packet may also be rejected without the message: &lt;br /&gt;
&lt;br /&gt;
  -A INPUT -j REJECT&lt;br /&gt;
&lt;br /&gt;
The above will reject with the default return error of {{ic|--reject-with-icmp6-port-unreachable}}. You should note though, that identifying a firewall is a basic feature of port scanning applications and most will identify it regardless. &lt;br /&gt;
&lt;br /&gt;
In the next step make sure the protocol and extension are changed to be IPv6 appropriate for the rule regarding all new incoming ICMP echo requests (pings):&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Netfilter conntrack does not appear to track ICMPv6 Neighbor Discovery Protocol (the IPv6 equivalent of ARP), so we need to allow ICMPv6 traffic regardless of state for all directly attached subnets. The following should be inserted after dropping {{ic|--ctstate INVALID}}, but before any other DROP or REJECT targets, along with a corresponding line for each directly attached subnet:&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Since there is no kernel reverse path filter for IPv6, you may want to enable one in &#039;&#039;ip6tables&#039;&#039; with the following:&lt;br /&gt;
&lt;br /&gt;
 # ip6tables -t raw -A PREROUTING -m rpfilter -j ACCEPT&lt;br /&gt;
 # ip6tables -t raw -A PREROUTING -j DROP&lt;br /&gt;
&lt;br /&gt;
設定が完了したら、&#039;&#039;ip6tables&#039;&#039; サービスを[[有効化]]してください。&#039;&#039;iptables&#039;&#039; とは別個に実行させます。&lt;br /&gt;
&lt;br /&gt;
== NAT ゲートウェイの設定 ==&lt;br /&gt;
&lt;br /&gt;
このセクションでは NAT ゲートウェイについて扱います。[[#シングルマシン用のファイアウォール|ガイドの前半部分]]を読んで &#039;&#039;&#039;INPUT&#039;&#039;&#039;, &#039;&#039;&#039;OUTPUT&#039;&#039;&#039;, &#039;&#039;&#039;TCP&#039;&#039;&#039;, &#039;&#039;&#039;UDP&#039;&#039;&#039; チェインを設定していることが前提です。これまで全てのルールは &#039;&#039;&#039;filter&#039;&#039;&#039; テーブルに作成していました。このセクションでは、&#039;&#039;&#039;nat&#039;&#039;&#039; テーブルも使用していきます。&lt;br /&gt;
&lt;br /&gt;
=== フィルターテーブルの設定 ===&lt;br /&gt;
&lt;br /&gt;
==== 必要なチェインの作成 ====&lt;br /&gt;
&lt;br /&gt;
以下の設定では、2つの異なるチェインをフィルターテーブルで使用します: &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; と &#039;&#039;&#039;fw-open&#039;&#039;&#039; チェインです。以下のコマンドでチェインを作成してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables -N fw-interfaces&lt;br /&gt;
 # iptables -N fw-open&lt;br /&gt;
&lt;br /&gt;
==== FORWARD チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FORWARD&#039;&#039;&#039; チェインの設定は上のセクションにある &#039;&#039;&#039;INPUT&#039;&#039;&#039; チェインの設定と大体同じです。&lt;br /&gt;
&lt;br /&gt;
Now we set up a rule with the &#039;&#039;&#039;conntrack&#039;&#039;&#039; match, identical to the one in the &#039;&#039;&#039;INPUT&#039;&#039;&#039; chain:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The next step is to enable forwarding for trusted interfaces and to make all packets pass the &#039;&#039;&#039;fw-open&#039;&#039;&#039; chain.&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -j fw-interfaces &lt;br /&gt;
 # iptables -A FORWARD -j fw-open &lt;br /&gt;
&lt;br /&gt;
The remaining packets are denied with an &#039;&#039;&#039;ICMP&#039;&#039;&#039; message:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A FORWARD -j REJECT --reject-with icmp-host-unreachable&lt;br /&gt;
 # iptables -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
==== fw-interfaces と fw-open チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
The meaning of the &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; and &#039;&#039;&#039;fw-open&#039;&#039;&#039; chains is explained later, when we deal with the &#039;&#039;&#039;POSTROUTING&#039;&#039;&#039; and &#039;&#039;&#039;PREROUTING&#039;&#039;&#039; chains in the &#039;&#039;&#039;nat&#039;&#039;&#039; table, respectively.&lt;br /&gt;
&lt;br /&gt;
=== nat テーブルの設定 ===&lt;br /&gt;
&lt;br /&gt;
このセクションでは、出力インターフェイス (公のインターネット IP が付与されるインターフェイス) の名前を &#039;&#039;&#039;ppp0&#039;&#039;&#039; とします。使用する出力インターフェイスが別の名前の場合、以下のルールで使われている名前もそれにあわせて変更するようにしてください。&lt;br /&gt;
&lt;br /&gt;
==== POSTROUTING チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
Now, we have to define who is allowed to connect to the internet. Let&#039;s assume we have the subnet &#039;&#039;&#039;192.168.0.0/24&#039;&#039;&#039; (which means all addresses that are of the form 192.168.0.*) on &#039;&#039;&#039;eth0&#039;&#039;&#039;. We first need to accept the machines on this interface in the FORWARD table, that is why we created the &#039;&#039;&#039;fw-interfaces&#039;&#039;&#039; chain above:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A fw-interfaces -i eth0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Now, we have to alter all outgoing packets so that they have our public IP address as the source address, instead of the local LAN address. To do this, we use the &#039;&#039;&#039;MASQUERADE&#039;&#039;&#039; target:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
上記の &#039;&#039;&#039;-o ppp0&#039;&#039;&#039; パラメータは必ず必要なので忘れないでください。パラメータを記述しなかった場合、ネットワークが接続できなくなります。&lt;br /&gt;
&lt;br /&gt;
Let&#039;s assume we have another subnet, &#039;&#039;&#039;10.3.0.0/16&#039;&#039;&#039; (which means all addresses 10.3.*.*), on the interface &#039;&#039;&#039;eth1&#039;&#039;&#039;. We add the same rules as above again:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A fw-interfaces -i eth1 -j ACCEPT&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -s 10.3.0.0/16 -o ppp0 -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
最後に[[インターネット共有#パケット転送の有効化|パケット転送を有効化]]してください (既に有効にしている場合は必要ありません)。&lt;br /&gt;
&lt;br /&gt;
Machines from these subnets can now use your new NAT machine as their gateway. Note that you may want to set up a DNS and DHCP server like &#039;&#039;&#039;dnsmasq&#039;&#039;&#039; or a combination of &#039;&#039;&#039;bind&#039;&#039;&#039; and &#039;&#039;&#039;dhcpd&#039;&#039;&#039; to simplify network settings DNS resolution on the client machines. This is not the topic of this guide.&lt;br /&gt;
&lt;br /&gt;
==== PREROUTING チェインの設定 ====&lt;br /&gt;
&lt;br /&gt;
Sometimes, we want to change the address of an incoming packet from the gateway to a LAN machine. To do this, we use the &#039;&#039;&#039;fw-open&#039;&#039;&#039; chain defined above, as well as the &#039;&#039;&#039;PREROUTING&#039;&#039;&#039; chain in the &#039;&#039;&#039;nat&#039;&#039;&#039; table in the following two simple examples. &lt;br /&gt;
&lt;br /&gt;
First, we want to change all incoming SSH packets (port 22) to the ssh server of the machine &#039;&#039;&#039;192.168.0.5&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT --to 192.168.0.5&lt;br /&gt;
 # iptables -A fw-open -d 192.168.0.5 -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The second example will show you how to change packets to a different port than the incoming port. We want to change any incoming connection on port &#039;&#039;&#039;8000&#039;&#039;&#039; to our web server on &#039;&#039;&#039;192.168.0.6&#039;&#039;&#039;, port &#039;&#039;&#039;80&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 # iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to 192.168.0.6:80&lt;br /&gt;
 # iptables -A fw-open -d 192.168.0.6 -p tcp --dport 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
The same setup also works with udp packets.&lt;br /&gt;
&lt;br /&gt;
=== ルールの保存 ===&lt;br /&gt;
&lt;br /&gt;
ルールを保存してください:&lt;br /&gt;
&lt;br /&gt;
 # iptables-save &amp;gt; /etc/iptables/iptables.rules&lt;br /&gt;
&lt;br /&gt;
そして &#039;&#039;&#039;iptables&#039;&#039;&#039; [[デーモン]]を有効にすることで、起動時にルールがロードされるようにします。&lt;br /&gt;
&lt;br /&gt;
== 参照 ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.webhostingtalk.com/showthread.php?t=456571 Methods to block SSH attacks]&lt;br /&gt;
*[http://www.ducea.com/2006/06/28/using-iptables-to-block-brute-force-attacks/ Using iptables to block brute force attacks]&lt;br /&gt;
*[http://linuxconfig.org/collection-of-basic-linux-firewall-iptables-rules 20 Iptables Examples For New SysAdmins]&lt;br /&gt;
*[http://www.thegeekstuff.com/2011/06/iptables-rules-examples/ 25 Most Frequently Used Linux IPTables Rules Examples]&lt;/div&gt;</summary>
		<author><name>Tezca</name></author>
	</entry>
</feed>