sai’s diary

プログラミング関連の備忘録とつぶやきを書いています。

iptables - おすすめのチュートリアル

ネットワーク関連の投稿になりますが、LinuxにはフィルタやNAT/NAPT機能を実現するnetfilterという強力なフレームワークがあり、ユーザはiptablesまたはip6tablesコマンドで操作することが可能です。

Iptablesチュートリアル 1.2.2は「チェーンって何?」「ターゲットって何?」という基本的な説明も丁寧に書かれていますのでこれからiptablesを利用される方は一読しておいて損はないと思います。

iptablesやip6tablesの使い方はヘルプか説明サイトを見れば良いと思いますが、個人的に最初の段階で仕組み(どの様なカテゴリが、どういった順番で処理されるか)を把握しておいた方がその後の理解も早まると思い、人に説明したりする際には以下のチュートリアルにある図を見ながら説明しています。

図はIptablesチュートリアル 1.2.2の6.1. 全般を参照ください。(ページの下の方にあります。)

上記のイメージを把握しておけば、NAPTとフィルタ機能を併用した場合にフィルタ機能はNAPT前、後のどちらで評価されるのか?といった疑問も簡単に解決します。

試しに以下のルールを設定して、対象のPCにDNS(UDP,宛先ポート53)のパケットを送信するとsyslogにはNAPT変換後のパケットが記録されていることが解ります。

以下は実際に確認した結果になります。

iptablesの設定

natのPREROUTINGチェーンに「UDP,宛先ポート53」のパケットを「UDP,宛先ポート5353」に変換するルールを追加します。(対象PCのアドレスは192.168.56.103になります。)
また、filterのINPUTチェーンにUDPパケットをログ出力するルールを追加し、filterが認識するパケットを記録する様にします。

[root@localhost ~]# iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.56.103:5353
[root@localhost ~]# iptables -A INPUT -p udp  -j LOG --log-prefix "[DNAT] "

syslog(LOGターゲットの出力)を確認

syslogを見るとフィルタ機能はNAPT変換後のパケット(宛先ポート=5353)で評価することが解ります。

[root@localhost ~]# cat /var/log/messages
Sep 14 14:48:14 localhost kernel: [DNAT] IN=eth1 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=192.168.56.1 DST=192.168.56.103 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=16148 PROTO=UDP SPT=65268 DPT=5353 LEN=32
Sep 14 14:48:16 localhost kernel: [DNAT] IN=eth1 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=192.168.56.1 DST=192.168.56.103 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=16150 PROTO=UDP SPT=65269 DPT=5353 LEN=32
Sep 14 14:48:18 localhost kernel: [DNAT] IN=eth1 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=192.168.56.1 DST=192.168.56.103 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=16152 PROTO=UDP SPT=65270 DPT=5353 LEN=32
Sep 14 14:48:20 localhost kernel: [DNAT] IN=eth1 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=192.168.56.1 DST=192.168.56.103 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=16154 PROTO=UDP SPT=65271 DPT=5353 LEN=32