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