さくらVPS x Ubuntu のiptables (http, SSL)設定 (Dokkuインストール直後)

さくらVPSでDokkuインストール後、デフォルトだとブラウザでアクセスできないため、iptablesでhttp(80)とhttps(443 SSL)を空ける必要がある。

ただし、永続化するための仕様が一般的なUbuntuとさくらVPSで異なるようなので注意が必要。

【参考】Qiita - netfilter-persistent が動かないよ @ さくら
(↑ありがとうございます。完全にハマっていたので助かりました。)

さくらVPSのUbuntuの場合

以下は、さくらVPS x Ubuntu 16.04 でDokkuインストール直後の状態。
httpとhttpsが許可されていない。

$ sudo iptables -L --line-numbers

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
5    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

さくらVPS用に永続化するために設定ファイルに「http(--dport 80)」と「https(--dport 443)」を「-j REJECT」の上に追記する。

$ sudo vi /etc/iptables/iptables.rules

*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 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

永続化されているか確認するために再起動して、5番にhttp、6番にhttpsが許可されているか確認する。

$ sudo reboot

$ sudo iptables -L --line-numbers

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
5    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:http
6    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:https
7    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

さくらVPSのUbuntuではない場合

現状設定

設定を見るとhttpやhttpsの文字列がなく、ACCEPT行にsshしかアクセス許可されていない。

$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-sshd   tcp  --  anywhere             anywhere             multiport dports ssh
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

iptablesの永続設定

iptablesを設定しても再起動すると消えるので、最初に永続化できるようにしておく。

$ sudo apt install iptables-persistent 

rules.v4 と rules.v6 が生成される。ここに設定を記載していく。

$ ll /etc/iptables/
total 20
drwxr-xr-x  2 root root 4096 Apr 27 23:36 ./
drwxr-xr-x 96 root root 4096 Apr 27 22:42 ../
-rw-r--r--  1 root root  492 Apr 27 23:06 iptables.rules
-rw-r--r--  1 root root 1745 Apr 27 23:17 rules.v4
-rw-r--r--  1 root root  183 Apr 27 23:14 rules.v6

httpとhttpsを許可設定

iptablesにhttp(80)とhttps(443 SSL)を追記する。

$ sudo vi /etc/iptables/rules.v4

*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [198329:10516704]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
:f2b-sshd - [0:0]
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

設定を読み込む

設定ファイルを編集したら読み込んで反映する。

$ sudo /etc/init.d/netfilter-persistent reload

反映されたか設定情報を見る

ACCEPT行にhttpとhttpsが載っていることがわかる。

$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-sshd   tcp  --  anywhere             anywhere             multiport dports ssh
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:https
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

再起動して自動読み込み確認

再起動後に設定情報を確認して、httpとhttpsが載っていれば成功。

$ sudo reboot

参考サイト