ConohaにVPS立ててみた 第2回 FW設定

今回はFW(ファイアウォール)の設定をしていきたいと思います。

ConohaのVPSだと、サーバーを立てる時どのポートを開放するか設定できると思うんですけど、ぼくはあえて全てのポートを開放しました。

こうすれば「うわぁ〜!ポート閉じなきゃ!」って使命感に駆られて、自分でコマンド叩きながらFWの設定をする勉強できますからね。

UFW

LinuxのFWの設定をするのにiptablesっていうコマンドを使うと思うんでけど、これがなかなか複雑。ufwを使えば直接iptablesを触らずに簡単に設定できるみたいです。

そういえばUFWって「Ubuntu FireWall」の略だと思ってたら、実際は「Uncomplicated FireWall」だったんですね

現状

ufw status、一応iptables -Lも実行してみました。ガバガバだ!!!

$ sudo -s
# ufw status
Status: inactive
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
#

SSHの通信だけできるようにする

現状使ってるサービスはSSHだけですし、他のポートは閉じておきたいですね。設定していきましょう

# ufw default deny incoming
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
# ufw default allow outgoing
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
# ufw allow 22
# ufw enable
# ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                                 
22 (v6)                    ALLOW       Anywhere (v6)                       

#

ふっふっふ。これで設定完了です。簡単ですね!

上のコマンドでどんなことをやっているか説明します。

  • 外からVPSに向かってくる通信を全て拒否
  • VPSから外へ向けての通信は全て許可
  • 22番ポートの通信を許可
  • UFW有効化
  • UFWのステータスの表示

ufw allowのところは送信元IPを制限するとよりセキュアです。

# ufw allow from XXX.XXX.XXX.XXX to any port 22


本当にポートが空いてないかチェックしましょうか。クライアントからVPSに向けてnmapを実行しポートスキャンを行います。

ちなみに管理者権限でnmapを実行しないとNote: Host seems down.となってポートスキャンがうまくいきません。

$ sudo nmap  XXX.XXX.XXX.XXX

Starting Nmap 7.40 ( https://nmap.org ) at 2017-11-04 23:12 JST
Nmap scan report for vXXX-XXX-XXX-XXX.xxxxxxxx (XXX.XXX.XXX.XXX)
Host is up (0.0095s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 4.89 seconds
$

おっけー。。。いや、まだダメ

ICMP拒否

ufw default deny incomingは外から向かってくる通信を遮断しますが、これはTCP/UDPポートを使ったものに対してだけ。ICMPはTCP/UDP上のプロトコルじゃないし、そもそもポートって概念はないです。

つまり現状のVPSはクライアントからping(ICMP Request)が飛んでくると応答しちゃいます。よくない。

ググったらpingを拒否する方法が書いてある記事を見つけました。2012年の古い記事ですがこれを参考にします

www.sakito.com

# vim /etc/ufw/before.rules
before.rules
# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j DROP
-A ufw-before-input -p icmp --icmp-type source-quench -j DROP
-A ufw-before-input -p icmp --icmp-type time-exceeded -j DROP
-A ufw-before-input -p icmp --icmp-type parameter-problem -j DROP
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP

ファイルを保存したらufw reloadをします。クライアントからpingを実行してみましょう。

$ ping XXX.XXX.XXX.XXX
PING XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
^C
--- XXX.XXX.XXX.XXX ping statistics ---
5 packets transmitted, 0 packets received, 100.0% packet loss
$ 

タイムアウトが発生しました!いいですね。ついでにnmapもやってみましょう。

$ sudo nmap XXX.XXX.XXX.XXX

Starting Nmap 7.40 ( https://nmap.org ) at 2017-11-05 02:24 JST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.16 seconds
$

nmapはデフォルトでPingスキャンによってホストを発見しようとするのですが、VPS側はICMPを遮断しているためダウンと判定してしまいます。では、-PnオプションをつけてPingスキャンを行わないようにしましょう。

$ sudo nmap -Pn XXX.XXX.XXX.XXX

Starting Nmap 7.40 ( https://nmap.org ) at 2017-11-05 02:27 JST
Nmap scan report for vXXX-XXX-XXX-XXX.xxxxxxxx (XXX.XXX.XXX.XXX)
Host is up (0.0012s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 4.40 seconds
$ 

はい、22番ポートが空いてることが確認できました。なんかnmapの使い方講座みたいになってしまった。。。

メモ

UFWの設定ファイル群は/etc/ufwの下にあるようですね。たとえばさっきufw allow 22というコマンドを実行しましたが、こうするとuser.rulesというファイルにルールが追記されるようです。こんな感じで。

user.rules
### RULES ###

### tuple ### allow any 22 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 22 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -j ACCEPT

### END RULES ###

今回はこれでおしまいです。