$ cat /etc/services | grep ssh
iptablesで設定できるのは、パケットの発信元IPアドレス(-s)、発信元ポート番号(--sport)、プロトコル(-p)、送信先ポート番号(--dport)、送信先IPアドレス(-d)、である(ほかにもあるかもしれないけどとりあえずこの5つ。発信元ポート番号(source port)と送信先ポート番号(destination port)のを略してsportとdportとなっている、多分。)。要は下の図のIP HeadとTCP Headにあたる部分だ。iptablesが受け取ったパケットの、IPヘッダ中のIPアドレス、TCPヘッダのフォーマットでプロトコル、TCPヘッダ中のポート番号、を区別している。iptablesは各サーバプログラムから独立して動いているので、入ってくるIPパケットに対しては最初の防壁、出て行くIPパケットに対しては最後の防壁として作用する。
+-----------------------------------+ | IP Packet | +---------+-------------------------+ | IP Head | IP Datagram | +---------+----------+--------------+ | IP Head | TCP Head | TCP Datagram | +---------+----------+--------------+
--dportはパケットがどこのポート宛てに送られてきたかをチェックする。例えば下のように書くと、パケットの送り主が、サーバの22番ポート宛てにパケットを送ってきた場合に、そのパケットを許可する。これが意味するところは、サーバに入ってきた(-A INPUT)で、プロトコルがtcp(-p tcp)で、送信先ポートが22番(--dport 22)の、IPパケットをポートをリッスンしているサーバプログラムに渡す(-j ACCEPT)。ほかにもオプションスイッチがある。例えば、発信元のIPアドレスを指定するための-sとか、送信先のIPアドレスを指定する-dとか、発信元ポート番号を指定する--sportとか。これらが指定されないということは、この3つについてはチェックしないということ。
$ su # /sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT # /sbin/iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT # /sbin/iptables -A INPUT -p udp --dport 22 -j DROP # /sbin/iptables -A OUTPUT -p udp --dport 22 -j DROP
上の4行の中にポリシーと重複した設定があるかもしれない。例えば、OUTPUTのIPパケットは全てACCEPTの場合、OUTPUTのIPパケットにプロトコルや送信先ポートを指定してACCEPTの設定をしてもこれはポリシーと重複していることになる。つまり、ポリシーに反する設定以外は無駄だ。しかし、プロトコルがudpのOUTPUTをDROPしていることには意味がある。なぜなら、OUTPUTのポリシーはACCEPTでポリシーに反するからである。