みなさま、こんにちは。GMOインターネット株式会社の斉藤です。前回の記事ではmoshというベンチなOSSツールと、VPSのポート制限のお話しが登場しました。このポート制限は、ConoHaのネットワーク機能に備わっているパケットフィルタを使って実現しています。今回はそれらを簡単に操作できるツールconoha-netをご紹介したいと思います。
ConoHaのパケットフィルタ機能
ConoHaには基盤側にパケットフィルタが備わっており、TCPポートやソースIPアドレスによるフィルタリングが行えます。仮想サーバーが接続されている仮想スイッチでフィルタリングされるので、OSやVPSの設定に依存しないのも特徴です。
なので簡易的なファイアーウォールのように使えますし、フィルタリングルールを「セキュリティグループ」という形でまとめて、複数サーバーにまとめて適用したりもできるので台数が増えたときの管理も楽です。
ただ、設定するにはConoHaのAPIを叩く必要があります。以下の記事が参考になります。
https://impov.hatenablog.com/entry/2016/05/30/210105
これからわかるとおり、複数のAPIを叩く必要があります。これは仕組みとして以下の3構造になっています。
仮想サーバーは複数のポート(=仮想NIC)を持つポートには複数のセキュリティグループを割り当てられるセキュリティグループには複数のセキュリティグループルールを割り当てられる
最初にお話ししたとおりConoHaのパケットフィルタは非常に柔軟な設定が可能です。ただ仮想サーバーや仮想ポートなどのレイヤーが多く、単純な設定をするにも多くのAPIを叩く必要があったりと少し煩雑な面もあります。
これらの手間を解決するためにconoha-netと言うツールを開発しました。開発はだいぶ前なのですが、私も業務で使いますし十分枯れていて使いやすいツールだと思います。
conoha-net
conoha-netはセキュリティグループをコマンドラインから操作するツールです。インストール方法や使い方などはGitHubに書いてあります。
hironobu-s/conoha-net: A security group management tool for ConoHahttps://github.com/hironobu-s/conoha-net
はじめに、以下を実行してみましょう。
list-group -a
gncs-ipv4-sshのように末尾にが付いたものが見えます。
-all, -ssh, -web
これらは実はコントロールパネルから設定できる「許可ポート」のことなんです。現状でコントロールパネルから設定可能なセキュリティグループが一覧で出ている状態なんですね。
hiro@personal$ conoha-net list-group -a UUID SecurityGroup Direction EtherType Proto IP Range Port
01c8f7d2-9a61-4158-bec9-882d9ea82c4e gncs-ipv4-ssh egress IPv4 ALL ALL
a80a3376-5fff-41f1-b4de-6f975968e5a7 gncs-ipv4-ssh egress IPv6 ALL ALL
ee75d97a-fe30-4974-944d-850da19356d9 gncs-ipv4-ssh ingress IPv4 tcp 22 - 22
0c905231-5ac8-4627-89d0-c8bb96b185f7 gncs-ipv6-all egress IPv6 ALL ALL
15962089-aaae-498f-86a9-7df572ce01fb gncs-ipv6-all ingress IPv6 ALL ALL
f375fc43-bfab-48cc-a66d-418b6d709a60 gncs-ipv6-all egress IPv4 ALL ALL
1d1b7066-7da5-4694-9e8b-445b01d7df64 gncs-ipv4-all ingress IPv4 ALL ALL
771f3074-4fe8-4051-804e-6f5f7f4860b1 gncs-ipv4-all egress IPv6 ALL ALL
b8d81897-4229-4ddf-8325-11a7d0b42efd gncs-ipv4-all egress IPv4 ALL ALL
448761e1-4943-453e-9edb-51d4bf81364c default egress IPv4 ALL ALL
4f505718-d378-4f24-991a-02d20b8285e4 default ingress IPv6 ALL ALL
66619594-8dea-4fc6-8815-5db7ef623930 default ingress IPv4 ALL ALL
b950e586-53d5-4944-bdbd-fbba045c2d3d default egress IPv6 ALL ALL
12d97dca-94a2-4b99-938e-ff8be875d8a9 gncs-ipv4-web ingress IPv4 tcp 20 - 20
286a0a55-2c25-4810-9274-021d474126f6 gncs-ipv4-web ingress IPv4 tcp 443 - 443
85421073-7b49-41bf-9da1-d6e48b0f6c88 gncs-ipv4-web egress IPv4 ALL ALL
ab501cfa-e67a-4255-9291-382400a45b2b gncs-ipv4-web ingress IPv4 tcp 21 - 21
b73d7eca-06b9-4252-ae9c-adad891dbb88 gncs-ipv4-web egress IPv6 ALL ALL
daf58069-fd85-4281-a86e-3a8d23fd389b gncs-ipv4-web ingress IPv4 tcp 80 - 80
05bb817c-5179-4156-99ec-f088ff5c5d8e my-group egress IPv6 ALL ALL
5ecc4a23-0b92-4394-bca6-2466f08ef45e my-group egress IPv4 ALL ALL
↓コントロールパネル
コントロールパネルからは特定のポート(22, 80, 443とか)しか設定できませんが、conoha-netを使うと自由に設定できますし、ソースIPアドレスの指定もできるようになります。たとえば、SSHへの接続を133.130.0.0/16からのみにしたい場合はこんな感じです。
hiro@personal$ conoha-net create-rule -d ingress -e IPv4 -p 22 -P tcp -i 133.130.0.0/16 my-group
5697eb75-3517-44a9-bc40-d532a4aedd89
hiro@personal$ conoha-net list-group UUID SecurityGroup Direction EtherType Proto IP Range Port
05bb817c-5179-4156-99ec-f088ff5c5d8e my-group egress IPv6 ALL ALL
5697eb75-3517-44a9-bc40-d532a4aedd89 my-group ingress IPv4 tcp 133.130.0.0/16 22 - 22
5ecc4a23-0b92-4394-bca6-2466f08ef45e my-group egress IPv4 ALL ALL
JSON出力もできるので、スクリプトやプロビジョニングツールからも扱いやすいです。
hiro@personal$ conoha-net -o json list-group | jq . [
{
"direction": "egress",
"ether-type": "IPv6",
"ip-range": "",
"port": "ALL",
"proto": "ALL",
"security-group": "my-group",
"uuid": "05bb817c-5179-4156-99ec-f088ff5c5d8e"
},
{
"direction": "ingress",
"ether-type": "IPv4",
"ip-range": "133.130.0.0/16",
"port": {
"max": 22,
"min": 22
},
"proto": "tcp",
"security-group": "my-group",
"uuid": "5697eb75-3517-44a9-bc40-d532a4aedd89"
},
{
"direction": "egress",
"ether-type": "IPv4",
"ip-range": "",
"port": "ALL",
"proto": "ALL",
"security-group": "my-group",
"uuid": "5ecc4a23-0b92-4394-bca6-2466f08ef45e"
}
]
conoha-netを使うと、セキュリティグループの設定をより簡単に行えるはずです。良かったら使ってみて下さい。
それはまた次回お目にかかりましょう。