ネットワーク設定 · 3 min read · Feb 13, 2026
基本的なIptables - Debian/RedHat
概要
ここで読みやすいバージョンを見つけることができます: 5dollarwhitebox.org
多くの人々はIPTablesに驚き、理解するのが難しいと感じています。しかし、一度基本を理解すれば、簡単です。この文書はiptablesの使用に関する基本的なハウツーとして機能します。私は決してiptablesの専門家ではありませんが、かなりの間このように使用しています。もし私が間違いを犯した場合は、遠慮なくメールしてください。
システム
Debian Sarge 3.1 Vanilla 2.6.12.4カーネル from mirrors.kernel.org iptables管理ユーティリティバージョン 1.2.11-10
準備
このハウツーはDebian Sarge 3.1ボックスで実行されますが、コマンドと構文はどのLinuxディストリビューションでも機能するはずです。iptablesを構成する前に、まずそれがカーネルにコンパイルされていることを確認し、適切なユーザーランドユーティリティがインストールされていることを確認する必要があります。
カーネルがコンパイルされたときの設定ファイルを持っているはずです。”CONFIG_IP_NF”でgrepすると、ほとんどの行/オプションに対して’=y’または’=m’が生成されるはずです。ここでは、”CONFIG_IP_NF_IPTABLES”がカーネルモジュールとしてコンパイルされたことがわかります。
# cat /boot/config-2.4.30 | grep -i “CONFIG_IP_NF”
- CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_AMANDA=m
CONFIG_IP_NF_TFTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_RECENT=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_MATCH_UNCLEAN=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_MIRROR=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_NAT_AMANDA=m
CONFIG_IP_NF_NAT_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_NAT_TFTP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_IP_NF_COMPAT_IPCHAINS=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_COMPAT_IPFWADM=m
CONFIG_IP_NF_NAT_NEEDED=y*
これはそれほど必要ではありません。なぜなら、ルールを追加しようとすると、iptablesが機能するかどうかすぐにわかるからです。
iptables管理ユーティリティがインストールされているかどうかを確認するには、次のコマンドを実行します:
# dpkg -l iptables
- iptables 1.2.11-10 Linux kernel 2.4+ iptables管理用*
…またはrpmベースのディストリビューションの場合:
# rpm -qa | grep iptables
iptables-xxxxx
…またはバイナリがそこにあるかどうかを確認できます!
# which iptables
/sbin/iptables
ユーティリティが欠けている場合は、次のようにインストールできます:
APT
# apt-get update && apt-get install iptables
RPM
# rpm -Uvh iptables-xxxx.rpm
準備中################################# [100%]
メインファイル
Debian
/etc/init.d/iptables – サービスを開始|停止|再起動するためのINITスクリプト(およびルールセットを保存します)。このファイルはSarge以降はデフォルトではありませんが、まだ入手可能です(お見せします)。
/var/lib/iptables – Debianの「アクティブ」と「非アクティブ」iptables-saveカウンタファイルのホーム(すなわち、保存されたルールセット)。RedHatでは、保存されたルールは’/etc/sysconfig/iptables’にあります。
/var/lib/iptables/active – アクティブカウンタ(後で詳しく説明します)
/var/lib/iptables/inactive – 非アクティブカウンタ
/sbin/iptables – 管理ユーティリティ/バイナリ。
RedHat
/etc/init.d/iptables – サービスを開始|停止|再起動するためのINITスクリプト(およびルールセットを保存します)。
/etc/sysconfig/iptables – RedHatのiptables-saveカウンタファイルのためのファイル(すなわち、保存されたルールセット)。
/sbin/iptables – 管理ユーティリティ/バイナリ。
IPTablesについて少し
現在どのルールセットが適用されているかを確認するには、次のコマンドを実行します:
# iptables –list
*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*
これは、ルールセットが適用されていない場合に表示されるものです。これを見ると、3つの「チェーン」があることがわかります。
INPUT - このサーバーに向けられたトラフィックのルールを保持します。
FORWARD – このサーバーの背後にあるIPに転送されるトラフィックのルールを保持します(すなわち、このボックスが他のサーバーのファイアウォールとして機能する場合)。
OUTPUT – このサーバーからインターネットに出て行くトラフィックのルールを保持します。
主に私たちはこのサーバーに向けられたトラフィックを扱い、INPUTチェーンのルールを発行します。トラフィックがカーネルを通過すると、パケットがルールに一致するかどうかに基づいて「ターゲット」を決定します。一般的なターゲットは:
ACCEPT – トラフィックが配信のために受け入れられます。
REJECT – トラフィックが拒否され、送信ホストにパケットが返送されます。
DROP - トラフィックがドロップされます。送信ホストに何も返送されません。
ルールセットの構成
では、始めましょう。ルールが追加される順序は非常に重要であることに注意することが重要です。たとえば、最初のルールがすべてを拒否するものであれば、特定の許可をしても、それは拒否されます。
また、何をしてもディスクに保存されないことに注意してください。’iptables-save’を実行するか、initスクリプトを使用して保存するまで、すべてのカウンタ/ルールセットはメモリ内にあります。サーバーが再起動するか、’iptables –flush’を実行すると、作業したすべての内容が失われます。個人的には、すべてを整理してコメントを付けるために、’iptables-rules.sh’というbashスクリプトファイルで作業しています。間違いを犯した場合、すべてのルールをフラッシュしたいだけなら、bashスクリプトに戻って再編集し、保存してスクリプトを実行するだけです(ただし、これは起動時には実行されません…それについては次のセクションで説明します)。
このサーバーにsshでリモート作業している場合は、自分をロックアウトしないように最善を尽くすことが非常に重要です。したがって、最初のルールは、どんな場合でも自分のIPアドレスからsshにアクセスできることを確認することです。
# iptables -A INPUT -s 192.168.1.10 -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT
これを分解してみましょう:
-A => iptablesにこのルールをINPUTチェーンに「追加」するように指示します。
-s => ソースアドレス。このルールはこのIPからのトラフィックにのみ関連します。SSH接続しているIPアドレスに置き換えてください。
-d => 宛先アドレス。このルールはこのIPに向かうトラフィックにのみ関連します。このサーバーのIPに置き換えてください。
-p => プロトコル。TCPトラフィックを指定します。
–dport => 宛先ポート。TCPポート22(SSH)用のトラフィックを指定します。
-j => ジャンプ。このルールのすべてが一致する場合は、’ACCEPT’に「ジャンプ」します。
次に、一般的なネットワークトラフィックのための標準ルールを使用したいと思います。これは基本的な内容を少し超えますが、iptablesはパケットがどの「状態」にあるかを判断できます。これは標準的なTCP通信に関係しています。たとえば、データを送信する際の2つのホスト間の3ウェイハンドシェイクです。
NEW => サーバー1がサーバー2に接続し、SYN(同期)パケットを発行します。
RELATED => サーバー2がSYNパケットを受信し、SYN-ACK(同期確認)パケットで応答します。
ESTABLISHED => サーバー1がSYN-ACKパケットを受信し、最終的なACK(確認)パケットで応答します。
この3ウェイハンドシェイクが完了すると、トラフィックは現在ESTABLISHEDになります。このタイプのTCP通信には、次のような3つのルールが必要です:
# iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
最後のルールは明らかにサーバーから出て行くトラフィックを許可します。
基本が整ったので、iptablesがルールセットをリストするのを見てみましょう:
# iptables –list
*Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp – 192.168.1.10 10.1.15.1 tcp dpt:ssh
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all – anywhere anywhere state NEW,RELATED,ESTABLISHED*
ここから、好きなルールを追加できます。基本的なウェブサーバーを運営している場合、次のようなものが必要になるでしょう:
個別の拒否を最初に:
悪者(ソースIPアドレスをブロック):
# iptables -A INPUT -s 172.34.5.8 -j DROP
スパマーを拒否(FQDNの使用に注意):
# iptables -A INPUT -s mail.spammer.org -d 10.1.15.1 -p tcp –dport 25 -j REJECT
次に開放する: ———————————————————————–
MYSQL(特定のIPへのリモートアクセスを許可):
SSH:
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT
Sendmail/Postfix:
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 25 -j ACCEPT
FTP:(ポート20-21の範囲を指定できることに注意)
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 20:21 -j ACCEPT
パッシブFTPポートかもしれません:(再び、1つのルールでポート50000から50050を指定)
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 50000:50050 -j ACCEPT
HTTP/Apache
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 80 -j ACCEPT
SSL/Apache
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 443 -j ACCEPT
IMAP
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 143 -j ACCEPT
IMAPS
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 993 -j ACCEPT
POP3
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 110 -j ACCEPT
POP3S
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 995 -j ACCEPT
ローカルホストからのトラフィック:
# iptables -A INPUT -d 10.1.15.1 -s 127.0.0.1 -j ACCEPT
ICMP/Ping:
# iptables -A INPUT -d 10.1.15.1 -p icmp -j ACCEPT
グローバル拒否を最後に:
そのIPへの他のすべてを拒否:
# iptables -A INPUT -d 10.1.15.1 -j REJECT
または、任意のIPへの他のすべてを拒否:
# iptables -A INPUT -j REJECT
グローバル拒否の行は最後に行います!これらは最後でなければなりません。
ルールセットの保存
initスクリプトを使用すると、ルールセットの保存は非常に簡単です。設定に満足したら、次のいずれかを実行してください:
Debianの方法
古いスタイルのinitスクリプトはデフォルトではSargeにはありませんが、レガシー用にまだ存在します。新しい方法は、’/etc/network/if-up.d’と’/etc/network/if-down.d’をiptablesスクリプト用に使用することだと思います(ただし、私はそれが好きではありません)。
レガシーINITスクリプトを次のように取得できます:
# gunzip /usr/share/doc/iptables/examples/oldinitdscript.gz -c > /etc/init.d/iptables
スクリプトが配置されたので、必要なことを行うことができます。
アクティブルール
アクティブルールはiptablesを起動するときに読み込まれるルールです:
# /etc/init.d/iptables save active
iptablesルールセットを保存中: カウンタ付きで”active”を保存します。
これにより、/var/lib/iptables/activeにルールが保存されます。
非アクティブルール
iptablesを停止するときに”inactive”と呼ばれる2番目のルールセットを構成することもできます。iptablesは実際には「停止」しません。単に現在のルールセットをフラッシュし、その後「非アクティブ」ルールを読み込みます。
# /etc/init.d/iptables stop
iptablesルールセットを読み込み中: “inactive”をロードします。
したがって、’inactive’ルールを設定し、次のように保存できます:
# /etc/init.d/iptables save inactive
iptablesルールセットを保存中: カウンタ付きで”inactive”を保存します。
RedHatの方法
RedHatのINITスクリプトは非常に似ています。これを使用してiptablesを開始および停止し、ルールセットを保存できます。
アクティブルールを保存するには、次のコマンドを実行します:
# /etc/init.d/iptables save
これにより、ルールが’/etc/sysconfig/iptables’に保存されます。
iptablesを起動すると、ルールは’/etc/sysconfig/iptables’から読み込まれます:
# /etc/init.d/iptables start
iptablesを起動中 [OK]
iptablesを停止すると、すべてのルールがフラッシュされます:
# /etc/init.d/iptables stop
iptablesを停止中 [OK]
手動保存と復元
iptables-saveおよびiptables-restoreユーティリティを手動で使用することもできます:
ルールをファイルに保存
# iptables-save > /root/iptables-save.out
ルールを復元
# iptables-restore -c /root/iptables-save.out
‘-c’はiptables-restoreにこのファイルがiptables-saveを使用して作成されたものであることを伝え、ルールを「カウンタ」として出力します。
結論
これで、iptablesの基本がわかりました。iptablesの使用法はあまりにも多く、実際にそれに関するハウツーを始めることはできません。しかし、基本的なセキュリティとIPTablesの理解のために、これがあなたの助けになれば幸いです。追加できることがあれば、遠慮なくメールしてください。
—
BJ Dierkes, RHCE4-LPIC1
wdierkes [at] 5dollarwhitebox [dot] org
テキサス州、アメリカ
リソース
- Netfilter/Iptables: http://www.netfilter.org/
- トランスミッションコントロールプロトコル: http://www.rhyshaden.com/tcp.htm
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。