ファイアーウォール

【Linux】iptables関連コマンドについて

記事内に商品プロモーションを含む場合があります

こんにちは、やすです。

この記事では、ファイアーウォール機能であるiptables関連のコマンドについて紹介します。

iptables

iptablesを使ってパケットフィルタリングの設定をするためのメインコマンドです。

使い方

書式

iptables (-t テーブル) サブコマンド チェイン ルール アクション

では、それぞれ細かく見ていきましょう♪

テーブル

テーブルは「filter」と「nat」があるのですが、通常は「filter」への設定なので(何も指定しない場合は「filter」となる)、あまり-tオプションは使わないですね。

チェインが「PREROUTING」や「POSTROUTING」を指定する時だけ「nat」を指定して使う、と覚えておきましょう。

サブコマンド

何をするかの大枠を指定する部分で、主なサブコマンドは下記です。

この辺は普通に使うので、把握しておいた方が良いです。

サブコマンド説明
-L(–list)ルールを表示。
-A(–append)ルールを追加。
-I(–insert)ルールを挿入。
-D(–delete)ルールを削除。
-F(–flush)ルールをすべて削除。
-N(–new-chain)チェインを作成。
-X(–delete-chain)チェインを削除。
※チェインの中身が空である必要あり。
-P(–policy)ポリシーを設定。

チェイン

主なチェイン(フィルタリングの設定をする対象)は下記です。

チェイン説明
INPUT外から中への通信。
OUTPUT中から外への通信。
FORWARD転送の通信。
PREROUTINGDNAT。ルーティング系の設定。
POSTROUTINGSNAT。ルーティング系の設定。

ルール(オプション)

ルールを設定する時に使う主なオプションは下記です。

ルール(オプション)説明
-s(–source)送信元を指定。
-d(–destination)宛先を指定。
-p(–protocol)プロトコルを指定。
–sport送信元のポート番号。
–dport宛先のポート番号。
-j(–jump)ターゲット(パケットが一致した場合に何をするかのアクション)を指定。
-v(–verbose)詳細表示。-Lと合わせて使うのが多い。
-i(–in-interface)受信のインターフェース名を指定。INPUT、FORWARD、PREROUTINGで使う。
-o(–out-interface)送信用のインターフェース名を指定。OUTPUT、FORWARD、POSTROUTINGで使う。

ターゲット(アクション)

「-j」オプションで指定できるターゲット(アクション)は下記です。

ターゲット説明
ACCEPT許可する
DROP拒否する
REJECT拒否する(相手に拒否したことを通知)
LOGログを取得する
SNAT送信元IPアドレスを指定したIPアドレスに変換する
DNAT宛先IPアドレスを指定したIPアドレスに変換する

使用例

では、具体的な使い方についてみていきましょう!

設定を確認(表示)する

今なんのフィルタリングルールが設定されているかの確認方法です。

#(1)シンプルな表示(-Lのみ)。
#  INPUTに4つルールがありますね。
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  10.0.0.0/8           anywhere
ACCEPT     all  --  172.16.0.0/12        anywhere
ACCEPT     all  --  192.168.0.0/16       anywhere
ACCEPT     udp  --  anywhere             anywhere             udp spt:domain

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@localhost ~]#


#(2)詳細表示(-vL) & ナンバー表示(--line-numbers)。
#  見やすいのでナンバーは基本つけましょう。
[root@localhost ~]# iptables -vL --line-numbers
Chain INPUT (policy ACCEPT 130 packets, 9880 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     1102 71388 ACCEPT     all  --  any    any     10.0.0.0/8           anywhere
2        0     0 ACCEPT     all  --  any    any     172.16.0.0/12        anywhere
3       15  1030 ACCEPT     all  --  any    any     192.168.0.0/16       anywhere
4        0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp spt:domain

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

Chain OUTPUT (policy ACCEPT 501 packets, 34608 bytes)
num   pkts bytes target     prot opt in     out     source               destination
[root@localhost ~]#


#(3)数字で詳細表示(-nvL) & ナンバー表示(--line-numbers)。
#  基本はこれが一番いいと思う。
[root@localhost ~]# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 133 packets, 10108 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     1302 83064 ACCEPT     all  --  *      *       10.0.0.0/8           0.0.0.0/0
2        0     0 ACCEPT     all  --  *      *       172.16.0.0/12        0.0.0.0/0
3       21  1442 ACCEPT     all  --  *      *       192.168.0.0/16       0.0.0.0/0
4        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:53

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

Chain OUTPUT (policy ACCEPT 620 packets, 45332 bytes)
num   pkts bytes target     prot opt in     out     source               destination
[root@localhost ~]#

ポリシーを設定する

ポリシー設定変更をする際は、慎重にやりましょう!!

特に「ACCEPT(許可)」を「DROP(拒否)」や「REJECT(拒否&通知)」に変更すると、INPUTでもOUTPUTでもバツっと通信が切れますので、Teratermで接続している端末の通信を少なくとも許可しておかないと接続すらできなくなってしまいます。

(VMのコンソールで直接はいれるので、そうなってしまったらそこから設定を解除しましょう)

ルールを追加する

#(1)プライベートIP(社内)からの通信を許可したい場合。
[root@localhost ~]# iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -s 172.16.0.0/12 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT

#(2)特定のサーバからの特定ポートの通信を許可したい場合。
[root@localhost ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT

#(3)特定のサーバへの通信を拒否したいような場合。
[root@localhost ~]# iptables -A OUTPUT -d 10.1.1.1 -j DROP

#(4)設定確認。
[root@localhost ~]# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 6 packets, 456 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     1874  118K ACCEPT     all  --  *      *       10.0.0.0/8           0.0.0.0/0
2        0     0 ACCEPT     all  --  *      *       172.16.0.0/12        0.0.0.0/0
3       21  1442 ACCEPT     all  --  *      *       192.168.0.0/16       0.0.0.0/0
4        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:53

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

Chain OUTPUT (policy ACCEPT 203 packets, 17664 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DROP       all  --  *      *       0.0.0.0/0            10.1.1.1
[root@localhost ~]#

ルールを挿入する

更新中

ルールを1件削除する

更新中

ルールを全て削除する

更新中

iptables-save

現在のフィルタリングルールのバックアップを取得するコマンドです。

iptablesのルールの実物は「/etc/sysconfig/iptables(もしくはip6tables)」なので、cpコマンドで作業前に普通にバックアップを取っても大丈夫です。

使い方

iptables-save > バックアップファイル名
※リダイレクトが必須です。

iptables-restore

バックアップファイルを使って、リストア(設定を戻す)コマンドです。

使い方

iptables-restore < バックアップファイル名

その他(IPv6の場合)

IPv6を使っているケースはあまりないと思うのですが、IPv6の場合は「iptables~」だったコマンド部分を「IP6tables~」に変えれば同じように使えます。

↓ IPv4とIPv6の違い。

IPv4 ⇒ 192.168.0.1

IPv6 ⇒ 2001:0db8:0000:0000:0000:0123:0000:00ab

IPv4 ・・・ 32ビットをピリオドで4つに区切り(8ビットずつ区切り)、10進数で表現したもの。

IPv6 ・・・ 128ビットをコロンで8つに区切り(16ビットずつ区切り)、16進数で表現したもの。

まとめ

今回はiptables関連のコマンドの使い方について、紹介しました。

ではまた、バイバーイ♪