iptablesは、linuxでパケットフィルタリングができるコマンドです。パケットフィルタリングとは、ネットワークを流れるパケットを、遮断したり通過させたりするものです。ufwコマンドでもある程度できますが、iptablesはufwに比べてより細かい設定ができます。ここではubuntuserver22.04を使っています。
iptablesの操作
iptablesをインストール
$ sudo apt install iptables iptables-persistent
設定の保存
$ sudo /etc/init.d/netfilter-persistent save
設定に適用
$ sudo /etc/init.d/netfilter-persistent reload
iptablesの流れ
コマンド等
コマンド
-A | 指定したチェインの最後にルールを追加 |
-P | 指定したチェインのポリシー変更 |
-I | ルールを番号を指定してルール挿入 |
| |
-D | 指定したチェーンからルールを削除 |
-L | ルールのリストを一覧表示 |
-F | 指定したチェイン内のルール全削除 |
| |
チェイン
INPUT | ホストに入ってくるパケットに適用 |
OUTPUT | ホストから出ていくパケットに適用 |
FORWARD | ホストを経由するパケットに適用 |
PREROUTING | ルーティング決定前のパケットに適用 |
POSTROUTING | ルーティング決定後のパケットに適用 |
テーブル
filter | フィルタリングを行う |
nat | アドレス変換を行う |
ほかにも「mangle」「raw」などがあるが省略
ターゲット
ACCEPT | パケットの通過の許可 |
DROP | パケットを破棄(送信元に通知なし) |
SNAT | 送信元IPアドレス |
MASQU ERADE | 送信元IPアドレスとポート番号の変換 |
LOG | ログに出力 |
REJECT | パケットを拒否(送信元に通知) |
DNAT | 送信先IPアドレス |
ルール
-s | 送信元IPアドレス |
–sport | 送信元ポート番号 |
–to | 宛先IPアドレス・ポート番号 |
-i | 入力インターフェース(eth0など) |
-p | プロトコル(tcp,udp,icmp,all) |
-d | 送信先IPアドレス |
–dport | 送信元ポート番号 |
-j | 適用するターゲット |
-o | 出力インターフェース(ppp0など) |
例
$ sudo iptables -nvL
現在のiptablesの設定一覧表示
$ sudo iptables -nvL --line-numbers
現在の設定状況に番号を付番して一覧表示
$ iptables -t filter -A INPUT -s 192.168.120.0/24 -j ACCEPT
192.168.120.0/24からのパケット許可
$ iptables -t filter -A INPUT -s 100.1.1.0/24 -j DROP
100.1.1.0/24からのパケットは破棄(通知なし)
→「-t」を省略すると、デフォルト設定が「-t filter」となる。
$ iptables -t nat -A PREROUTING -d 203.0.113.200 -j SNAT --to-destination 172.16.0.200
パケットの宛先アドレスを203.0.113.200から172.16.0.200へ変換
$ iptables -A FORWARD -j REJECT
FORWARDパケットをデフォルトで拒否(通知あり)
$ iptables -A INPUT -p icmp -s 192.168.0.0/24 -j REJECT
192.168.0.0/24からのicmpパケットを拒否(通知あり)
→192.168.0.10のホストからping を打つと送信元にエラーが返る
$ iptables -A INPUT -p icmp -s 192.168.0.0/24 -j DROP
192.168.0.0/24からのicmpパケットを破棄(通知なし)
→192.168.0.10のホストからping を打っても音沙汰なし
$ iptables -A INPUT -p icmp -s 192.168.10.0/24 -j LOG
/var/log/kern.logにログがある(ubuntu)
# iptables -A FORWARD -d 192.168.1.2 -p tcp --dport 80 -j ACCEPT
# iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth1 -j DNAT --to 192.168.1.2:80
ホストがインターネットと内部LANにある時、インターネットからポート8080番に届いたパケット(インターネット側eth1)を、LAN内(192.168.1.0/16)のホスト192.168.1.2の80番ポートへ転送。
$ iptables -t nat -A PREROUTING -p tcp -d 10.0.0.1 -dport 80 -j DNAT --todestination 192.168.1.1
境界にあるLinuxサーバに来た、公開サーバ(10.0.0.1)宛のパケットを、当該公開サーバの内部ネットワークアドレス(192.168.1.1)宛に転送
参考文献
LinuC Level2 10.0教科書
LinuC Level2 10.0問題集
Ubuntuでiptablesを再起動後にも保持する方法
コメント