iptables

(作成:2006/03)

ネットワークを介してマルチに接続出来るのは、各サービス毎に使うポートが違うから、バッティングしない限り複数のサービスを受けられる。これはつまりクライアント側で1つのネットワーク越しアクセス毎に1024以下の適当なポートを使って遣り取りすることで、情報が錯綜せず上手く遣り繰りできる、と。

しかしサーバ側ではどんなポートでもって訳にはいかず、クライアントが問い合わせ先を固定できるよう、各サービス毎RFCなんかで定められたポートを専有してデータを遣り取りする。 基本的にゃサービス立ち上げなきゃ外部から特定ポート叩かれてもシカトするけど、一応接続要求は受け取るし、ログには残るし、鯖管が把握している以外の預かり知らぬソフトウェアが特定ポートを専有したりする事も有り得る。 不要なポートで接続要求を受け付けたりログを残したりするのは、DoS攻撃なんかの良い標的になるって事。預かり知らぬソフトウェアが特定ポートを専有するのはバックドアだのトロイだので言語道断。
てなわけで、より安全なサーバを立てるなら、必要最低限のポート以外へのアクセスを完全に締め出す必要がある。

てなわけでIPフィルタリングを行なうためにiptables。明示的に必要/不要なポートを制御して、よりセキュアなサーバを組みませう。
iptables 自体は、殆どの場合標準で入っているハズ。

設定

初回設定時

初めて設定する際は、もしiptablesが立ち上がっていたら必ず停止すること。さもないとリアルタイムで更新が反映されちゃう。ssh越しで設定してたりすると目も当てられない。

# /etc/init.d/iptables stop

基本的に、最初は以下のように送信以外を遮断し、設定を初期化してから取り掛かるのが良いと思う。

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -F

ここでは設定例として、ssh接続のみ許可されたサーバ設定をしてみる。 sshを許可するには以下のコマンドを実行。

# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

すると以下のような設定になる筈。

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

設定が良いと思ったら保存し、iptablesを起動する。

# /etc/init.d/iptables save
# /etc/init.d/iptables start

保存した設定は /etc/sysconfig/iptables にて確認することができる。

よく使うポート許可

  • http/https許可
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • smtp/pop3許可
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
  • dns許可
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
  • Proxy許可
# iptables -A INPUT -p tcp --dport 3128 -j ACCEPT

nmapによるポートチェック

ポートチェックには nmap を用いると判り易い。標準で導入されてないんで apt でインストール。

# apt-get install nmap

ライブラリとか色々入ってないと追加パッケージ多いけど、あまり気にせず。

  • 追加パッケージ
    libblas-common libblas3 liblinear3 liblua5.2-0 libpython-stdlib libpython2.7-minimal libpython2.7-stdlib libxslt1.1 lua-lpeg ndiff python python-bs4 python-chardet python-html5lib python-lxml python-minimal python-pkg-resources python-six python2.7 python2.7-minimal

以下のオプションで簡単なポートスキャンをしてみる。

# nmap -P0 -sS -F oni.hyakki.local

Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
Interesting ports on oni.hyakki.local (192.168.1.1):
(The 1149 ports scanned but not shown below are in state: filtered)
Port       State       Service
22/tcp     open        ssh

Nmap run completed -- 1 IP address (1 host up) scanned in 651 seconds

オプションの意味は以下の通り。

  • -P0
    ping によるサーバ動作チェックをしない。
  • -sS
    通信を確立しない(ステルス)ポートスキャン。
  • -F
    openポートのみリストアップする。