こんにちは、やすです。
この記事では、ファイアーウォール機能である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 | 転送の通信。 |
PREROUTING | DNAT。ルーティング系の設定。 |
POSTROUTING | SNAT。ルーティング系の設定。 |
ルール(オプション)
ルールを設定する時に使う主なオプションは下記です。
ルール(オプション) | 説明 |
---|---|
-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関連のコマンドの使い方について、紹介しました。
ではまた、バイバーイ♪