契約して環境整備して、ようやくVPSが安定稼働に入りました。
備忘録として、いろいろやった設定周りのことをメモしていきます。
今日はiptablesの設定について。
「さくらのVPS」「iptables」とかで検索するといろいろなケースがヒットしますが、不必要とも思える設定がさもデフォルトのように語り継がれていたりするので、ここではその辺についても軽く突っ込んでみたいと思います。
:RH-Firewall-1-INPUT – [0:0]
たいていの方がこの名前でチェーンを定義していますが、これははっきり言っていりません。よほど複雑なことをしない限りチェーンは1本で済みますから、わざわざ定義する必要はないと考えます。
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
50番、51番ともIPsecのプロトコルで用いられるポートです。VPSでIPsecを使わない限り、この定義はいりません。
-A RH-Firewall-1-INPUT -p udp –dport 5353 -d 224.0.0.251 -j ACCEPT
マルチキャストDNSを通す場合の設定ですが、グローバルIPアドレスを1つしか持たない1台の仮想サーバに対してマルチキャストする必要があるのかどうか。正直、ないと思います。
-A RH-Firewall-1-INPUT -p udp -m udp –dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp –dport 631 -j ACCEPT
631番はInternet Printing Protocol、つまりインターネット越しにプリンタを使うためのポートです。VPSにプリンタは……ついてないですよね? これもいりません。
とまあ、まずは不要な設定から説明してみました。
続いては、これは設定しといた方がいいんじゃないか、という設定について。
-A INPUT -i eth0 -p all -s 127.0.0.1 -j DROP
-A INPUT -i eth0 -p all -s 10.0.0.0/8 -j DROP
-A INPUT -i eth0 -p all -d 10.0.0.0/8 -j DROP
-A INPUT -i eth0 -p all -s 172.16.0.0/12 -j DROP
-A INPUT -i eth0 -p all -d 172.16.0.0/12 -j DROP
-A INPUT -i eth0 -p all -s 192.168.0.0/16 -j DROP
-A INPUT -i eth0 -p all -d 192.168.0.0/16 -j DROP
普通なら外部の送信元からローカルアドレスを名乗るパケットがやってくるなんてことはないのですが、きちんと閉じておかないとIP Spoofingなどによって思わぬ穴が開いてしまうこともあり得ます。なので、閉じます。
-A INPUT -d 255.255.255.255 -j DROP
-A INPUT -d 224.0.0.1 -j DROP
ブロードキャストアドレス、マルチキャストアドレス向けのパケットを拒否します。仮想サーバにそんなものを送りつけられても困りますので。
-A INPUT -p tcp –dport 113 -j REJECT –reject-with tcp-reset
113番(IDENT)へのリクエストに対して即座にお断りを出します。これを明確に拒否しておかないと、一部のメールサーバ等がIDENTを要求してきた時に相手を待たせてしまう→サーバのレスポンス低下に繋がります。
-A INPUT -i eth0 -f -j DROP
フラグメントパケットを拒否します。この辺はお好みかもしれませんが、何となく気持ち悪いので。
-A INPUT -i eth0 -p tcp ! –syn -m state –state NEW -j DROP
ログに残らないポートスキャン、いわゆる「ステルススキャン」を拒否します。そんなこと仕掛けてくる輩はあからさまに怪しいですから。
-A INPUT -i eth0 -p tcp –dport (SSHのポート) -m state –state NEW -m recent –set –name SSH
-A INPUT -i eth0 -p tcp –dport (SSHのポート) -m state –state NEW -m recent –update –seconds 60 –hitcount 8 –rttl –name SSH -j DROP
ちょっと複雑なんですが、ざっくり説明すると60秒間に8回SSHのポートに接続してきたら拒否する、というものです。要するに、SSHに対して総当たり攻撃されるのを防ぐわけです。最近総当たりは流行ってますから、ここはひとつ用心のために。
というわけで、まとめると以下のとおりです。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p all -s 127.0.0.1 -j DROP
-A INPUT -i eth0 -p all -s 10.0.0.0/8 -j DROP
-A INPUT -i eth0 -p all -d 10.0.0.0/8 -j DROP
-A INPUT -i eth0 -p all -s 172.16.0.0/12 -j DROP
-A INPUT -i eth0 -p all -d 172.16.0.0/12 -j DROP
-A INPUT -i eth0 -p all -s 192.168.0.0/16 -j DROP
-A INPUT -i eth0 -p all -d 192.168.0.0/16 -j DROP
-A INPUT -d 255.255.255.255 -j DROP
-A INPUT -d 224.0.0.1 -j DROP
-A INPUT -p tcp –dport 113 -j REJECT –reject-with tcp-reset
-A INPUT -i eth0 -f -j DROP
-A INPUT -i eth0 -p tcp ! –syn -m state –state NEW -j DROP
-A INPUT -i eth0 -p tcp –dport (SSHのポート) -m state –state NEW -m recent –set –name SSH
-A INPUT -i eth0 -p tcp –dport (SSHのポート) -m state –state NEW -m recent –update –seconds 60 –hitcount 8 –rttl –name SSH -j DROP
-A INPUT -m state –state NEW -m tcp -p tcp –dport (SSHのポート) -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 110 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 143 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 587 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
COMMIT
開けてあるポートについてはお好みで増やすなり減らすなりして下さい。とりあえず、メールとWebをやるのであればこれで充分かと思います。
iptablesについては、こんなところで。