綾小路龍之介の素人思考

sshのパケットについてiptablsを設定する

sshのパケットを区別するためにまず、次のようなコマンドを打ってsshと関連付けられたプロトコルとポート番号を調べた。すると、22/tcp、22/udp、だとわかった。つまり、22番ポートをtcpプロトコルで、22番ポートをudpプロトコルで使う、ということである。udpはtcpに比べて信頼性に欠け、リアルタイム性に富む。そんなわけで、udpプロトコルを使ったsshパケットは不許可、tcpプロトコルを使ったsshパケットは許可、することに決めた。TCPデータグラムの中身を解析していないので、本当にsshパケットかどうかわわからない。でも家のサーバで22番をリッスンしているのはsshdなので。

$ 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でポリシーに反するからである。

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2008-07-25T08:45:38+09:00
  2. Modified: 2008-07-25T06:43:15+09:00
  3. Generated: 2017-04-03T23:09:17+09:00