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を再起動後にも保持する方法
コメント