さくらVPS CentOSインスタンス用のiptables設定(接続元IPアドレスによるssh等の接続制限)

はじめに
===

さくらVPSに立てたCentOS 6.6インスタンス用のiptables設定について記載致します。

さくらVPSインスタンスは作成直後、ファイアウォールによる通信制限はかかっていません。

```
[root@tk2-XXX-XXXX ~]# 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
[root@tk2-XXX-XXXX ~]#
```

さくらVPSのインスタンスは、インターネット上からアクセス可能なグローバルIPアドレスが付与された状態で起動しますので、最低限の通信制限はかけておいた方が良いかと思います。

以下の例では、さくらVPSインスタンスに対して、特定のIPアドレス(例えば自分のPC)からのみssh,MySQL通信を許可するようiptablesで設定する例を記載致します。

実行環境
===

実行環境のさくらVPSインスタンスは以下になります。

・さくらVPS (サービスプラン名 = さくらのVPS(v4) SSD 512 TK02)
・CentOS release 6.6 (2.6.32-504.16.2.el6.x86_64)

例示用IPアドレスについて
===

さくらVPSインスタンス等のIPアドレスは、例示用として以下のIPアドレスで記載しております。

・さくらVPSインスタンス(tk2-XXX-XXXX)のIPアドレス　192.0.2.200
・自分のPC(さくらVPSインスタンスへのssh,MySQL接続を許可したいマシン)のIPアドレス　192.0.2.100

さくらVPSインスタンスに設定するiptablesサンプル
===

(1) さくらVPSインスタンスを起動します。
---

さくらVPSコントロールパネルコンソールからさくらVPSインスタンスを起動します。

https://secure.sakura.ad.jp/vps/

インスタンスの起動操作等は以下をご参照下さい。
https://help.sakura.ad.jp/app/answers/detail/a_id/2429

(2) さくらVPSインスタンスにrootユーザでログインします。 
---

さくらVPSインスタンスが起動したら、TeraTermを起動してrootユーザでログインします。

(3) さくらVPSインスタンスに/etc/sysconfig/iptablesを作成します。
--- 

さくらVPSインスタンスにrootユーザでログインしたら、以下の/etc/sysconfig/iptablesファイルを作成します。

以下の/etc/sysconfig/iptablesでは、例として自分のクライアントPCからさくらVPSインスタンス(tk2-XXX-XXXX)に対して、ssh(22番ポート)やMySQL(3306番ポート)への通信を許可しています。自分のクライアントPC以外のIPアドレスからのsshやMySQLポートへの通信は禁止しております。

```
[root@tk2-XXX-XXXX ~]# export LANG=ja_JP.UTF-8
[root@tk2-XXX-XXXX ~]#
```

```
[root@tk2-XXX-XXXX ~]# vi /etc/sysconfig/iptables
```

```sh:/etc/sysconfig/iptables
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]

##### DNS #####
## さくらVPSサーバから外部DNSサーバに対するDNS(53番ポート)名前解決許可
-A OUTPUT -p tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT

##### HTTP #####
## さくらVPSサーバのhttpdに対するhttp(80番ポート)通信許可
## さくらVPSサーバのhttpdに対するhttps(443番ポート)通信許可
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

##### ssh #####
## さくらVPSサーバのsshdに対するssh(22番ポート)通信許可

# 自分のクライアントPC(192.0.2.100)からのssh通信は許可
-A INPUT -s 192.0.2.100 -p tcp --dport 22 -j ACCEPT

# 上記以外のマシンからのssh通信は禁止
-A INPUT -p tcp --dport 22 -j REJECT

##### MySQL #####
## さくらVPSサーバのMySQLに対するMySQL(3306番ポート)通信許可

# 自分のクライアントPC(192.0.2.100)からのMySQL通信は許可
-A INPUT -s 192.0.2.100 -p tcp --dport 3306 -j ACCEPT

# 上記以外のマシンからのMySQL通信は禁止
-A INPUT -p tcp --dport 3306 -j REJECT

##### 接続許可ポート以外のポートに対する通信禁止 #####
## 前述までに通信許可したポート以外のポートに対する通信を禁止する
-A INPUT -j REJECT --reject-with icmp-host-prohibited

#####
COMMIT
```

(4) さくらVPSインスタンスのiptables有効化前の状態を確認します。
---

さくらVPSインスタンスのiptablesを有効化する前に、自分のクライアントPC(192.0.2.100)以外のマシンから、さくらVPSインスタンス(tk2-XXX-XXXX 192.0.2.200)に自由にssh接続出来る状態である事を確認します。

```
[ec2-user@not-sakura-server ~]$ ssh root@192.0.2.200
root@192.0.2.200's password:
Last login: Sun May 10 23:12:23 2015 from XXXXX.XXXX.XXXX.XXXX

SAKURA Internet [Virtual Private Server SERVICE]

[root@tk2-XXX-XXXXX ~]#

[root@tk2-XXX-XXXXX ~]# hostname
tk2-XXX-XXXXX.vs.sakura.ne.jp
[root@tk2-XXX-XXXXX ~]#
```

(5) さくらVPSインスタンスでiptablesを有効化し、ssh等のポートに対する通信制限をかけます。
---

さくらVPSインスタンスで/etc/init.d/iptables startを実行し、さくらVPSインスタンスのiptablesを有効化します。

```
[root@tk2-XXX-XXXX ~]# /etc/init.d/iptables start
iptables: ファイアウォールルールを適用中:                  [  OK  ]
[root@tk2-XXX-XXXX ~]#
```

iptablesが有効になった事を確認します。

```
[root@tk2-XXX-XXXX ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  XXXX.XXXX.XXXX.XXXX  anywhere            tcp dpt:ssh
REJECT     tcp  --  anywhere             anywhere            tcp dpt:ssh reject-with icmp-port-unreachable
ACCEPT     tcp  --  XXXX.XXXX.XXXX.XXXX  anywhere            tcp dpt:mysql
REJECT     tcp  --  anywhere             anywhere            tcp dpt:mysql reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
[root@tk2-XXX-XXXX ~]#
```

iptablesを自動起動するよう設定します。

```
[root@tk2-XXX-XXXX ~]# chkconfig iptables on
[root@tk2-XXX-XXXX ~]# chkconfig --list | grep iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@tk2-XXX-XXXX ~]#
```

(6) さくらVPSインスタンスに設定したiptablesが有効になっているか確認します。
---

先のiptablesでssh接続を許可した自分のクライアントPC(192.0.2.100)から、さくらVPSインスタンス(tk2-XXX-XXXX 192.0.2.200)に対して、ssh接続できる事を確認します。

ssh root@192.0.2.200

```
[root@tk2-XXX-XXXXX ~]# hostname
tk2-XXX-XXXXX.vs.sakura.ne.jp
[root@tk2-XXX-XXXXX ~]#
```

念の為、自分のクライアントPC(192.0.2.100)以外のマシンからは、さくらVPSインスタンス(tk2-XXX-XXXX 192.0.2.200)に対して、ssh接続出来ないよう制限がかかった事を確認します。

```
[ec2-user@not-sakura-server ~]$ ssh root@192.0.2.200
ssh: connect to host 192.0.2.200 port 22: Connection refused
[ec2-user@not-sakura-server ~]$
```

---

以上になります。