LoginSignup
29
32

More than 3 years have passed since last update.

iptablesを使いこなす

Last updated at Posted at 2015-06-24

はじめに

iptablesというのは、Firewall(ファイアウォール)の一種で外部からのアクセスを制限するルールを設定します。iptablesの他には、ufwが有名です。

ufwのほうがシンプルに使えますが、iptablesのほうが一般的です。

Arch Linuxの場合は、iproute2が依存しているためデフォルトでもインストールされます。

$ sudo pacman -S iptables

iptables.rules

iptables.rulesというのは、iptablesのルールを書いた設定ファイルです。デフォルトで置かれてる場合もあれば、ない場合もあります。ない場合は、/usr/share/etc/iptablesなどからサンプルファイルがあると思うので、それを持ってきて編集しましょう。例えば、Arch Linuxの場合は、以下の様な形でシンプルな設定が一瞬で可能となります。ただし、この設定は中身を見てもらっても分かる通り、外部からのアクセスを一旦ほぼすべて制限するものです。したがって、SSHなどで特定ポートのみを許可している場合などは注意しましょう。有効にするとアクセスできなくなります。

# cp /etc/iptables/simple_firewall.rules /etc/iptables/iptables.rules
# cat /etc/iptables/iptables.rules

# systemctl start iptables
# systemctl enable iptables

ここで、例えば、local ssh, git push, git pullなどの基本的なアクセスを実現したいのであれば以下の様な感じになります。

/etc/iptables/iptables.rules
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s 192.168.1.1/255.255.255.0 -p tcp --dport 11234 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j DROP
-A INPUT -4 -p icmp -j ACCEPT
-A INPUT -6 -p icmp6 -j ACCEPT
COMMIT
テーブル一覧 内容
filter パケットフィルタリングを参照するテーブルを指定する。
nat 新しいセッションを開くパケットが参照するテーブルを指定する。
mangle 特別なパケットが参照するテーブルを指定する。
チェーン一覧 テーブル
INPUT 入力(受信)パケット
OUTPUT 出力(送信)パケット
FORWARD フォワードするパケット
PREROUTING 受信時を宛先アドレスを変換するチェイン
POSTROUTING 送信時に送信元アドレスを変換するチェイン
ターゲット一覧 内容
ACCEPT パケットの通過を許可
DROP パケットを破棄
RETRUN チェーン内のルール評価を終了する
MASQUERADE 「-t nat」と「-A POSTROUTING」と同時に用いて送信元IPとポート番号を書き換える
REJECT パケットを拒否し、ICMPメッセージを返信
PREROUTING 特定ポートにリダイレクト
LOG Logを採取する
SNAT パケットの送信元アドレスを修正する。natテーブルでpostroutingチェーンでのみ利用できる。
DNAT パケットの送信先アドレスを修正する。natテーブルでpostroutingチェーンでのみ利用できる。
オプション一覧 内容
-p [!] <protocol> ルールで使うプロトコル(tcp、udp、icmp、all)を指定
-s [!] <address> [/<netmask>] 送信元アドレス。IPアドレスのほかにホスト名などでも指定できる
-d [!] <address> [/<netmask>] 接続先アドレス。IPアドレスのほかにホスト名などでも指定できる
--sport <port> 送信元ポートを指定する。
--dport <port> 送信先ポートを指定する。
-i <interface> パケットが入ってくるインターフェイス(eth0、eth1など)を指定
-o <interface> パケットが出ていくインターフェイスを指定
-j <target> パケットがマッチしたときのアクション(ターゲット)を指定
-t <table> テーブル(filter、nat、mangle)を指定
-m <module> モジュールを指定する。-pで暗黙に指定されるので省略することも可。
--icmp-type [!] <type> ICMPでタイプ名を指定する。( iptables -p icmp

で表示されるタイプを指定。
 ! | -p、-s、-dなどで、条件を反転する。「! 192.168.0.1」とすると、「192.168.0.1以外」という意味になる

--stateで指定可能なものは以下があります。

名称 状態
INVALID 既存のコネクションとは関係のないパケット
NEW 新しいコネクションの接続に関するパケット
ESTABLISHED 接続済みコネクションのパケット
RELATED 接続済みコネクションに関連して発生した新たなコネクションパケット
コマンド一覧 内容
iptables [ -t <table> ] -A append。最後尾に追加。
iptables [ -t <table> ] -L line-numbers。設定内容表示。
iptables [ -t <table> ] -D delete。既存のルールの削除。
iptables [ -t <table> ] -F flush。指定したチェーン全てを削除。
iptables [ -t <table> ] -I insert。先頭にチェーンを追加。ルール番号を指定することで任意の場所に挿入。
iptables [ -t <table> ] -P チェーン内全体で有効なポリシーを定義。デフォルトはAccept。
iptables [ -t <table> ] -N new。新しいチェーンを作成。

iptstate

次に、iptstateというものを紹介します。htopのようなもので、ログをグラフィカルに表示してくれるので分かりやすいです。

$ sudo pacman -S iptstate

$ sudo iptstate

参考

29
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
32