外部IPアドレスひとつのVPSで複数の Jail を起動して SSH アクセス等々
By takagiwa on Tuesday, January 15 2019, 20:13 - FreeBSD - Permalink
Qiita の @furandon_pig さんの記事、さくらVPSでFreeBSD+Jailを動かして仮想的にVPSが複数使えているような環境を作ってみる について、もう少しいじってみたもの。
個人的には qjail でお手軽 Jail 派のため、それも絡めた結果。
あとは一応 pf の内容も無知ながらもう少し手を入れてみた。
環境は同じく さくらのVPS 。OS は VIMAGE を待っていたので FreeBSD 12.0-RELEASE 。ただし VIMAGE は使わない。
% su # pkg # pkg install qjail # rehash # qjail install
でとりあえず qjail の準備。
/etc/rc.conf は
hostname="(ホスト名)" keymap="jp.kbd" ifconfig_vtnet0="(グローバルな IPv4 アドレス)" defaultrouter="(IPv4 デフォルトゲートウェイ)" ifconfig_vtnet0_ipv6="(IPv6 アドレス)" ipv6_defaultrouter="(IPv6 デフォルトゲートウェイ)" sshd_enable="YES" # Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable dumpdev="AUTO" # (1) ifconfig_lo0="inet 127.0.0.1" ifconfig_lo0_alias0="inet 192.168.0.254 192.168.0.255 netmask 255.255.255.0" ifconfig_lo0_alias1="inet 192.168.0.10" # (2) pf_enable="YES" pf_rules="/etc/pf.conf" pflog_enable="YES" pflog_logfile="/var/log/pflog"
とりあえず Jail 一個だけの設定で (1) 。(2) では flags を指定していないけれど必要に応じて。
最初の方でポート番号をリストアップしているけれど、必要なサービスがあればそのポート番号を追加していく。
/etc/pf.conf は
# SSH Others
tcp_pass = "{ 22 1024:65535}"
udp_pass = "{ 22 1024:65535}"
ext_if = "vtnet0"
int_if = "lo0"
table <private> const { 192.168.0.0/24 }
set block-policy drop
set loginterface $ext_if
scrub in all
# (3) nat to jail
nat on $ext_if inet from ($int_if) to ! <private> -> ($ext_if)
rdr pass on $ext_if proto tcp from any to ($ext_if) port 2210 -> 192.168.0.10 port 22
block all
pass quick on lo0 all
antispoof log quick for $ext_if inet
pass in quick on $ext_if inet proto icmp from any icmp-type echoreq keep state
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_pass flags S/SA keep state
pass in on $ext_if inet proto udp from any to ($ext_if) port $udp_pass keep state
pass out quick on $ext_if proto tcp all modulate state flags S/SA
pass out quick on $ext_if proto { udp icmp } all keep state
(3) で、NAT と、あとは外のポート 2210 から Jail のポート 22 にアクセスできるよう設定。
この状態で Jail を作る。
# qjail create -4 192.168.0.10 -n lo0 (Jail 名) # qjail start # qjail console (Jail 名) >adduser >echo sshd_enable="YES" >> /etc/rc.conf >service sshd start
qjail create で最初インタフェース指定しないときうまくいかなかったように思う。
とりあえず adduser で SSH するユーザーを追加する。
sshd_enable を加えるコマンドがどこかにあったと思う。
そして sshd を起動。
この状態で、外部の IPv4 アドレスのポート 2210 に SSH すると Jail に直接入れる。
あとは HTTP を通したいときは Nginx のリバースプロキシを通すなどする。HTTPS の証明書はリバースプロキシのところで行い、Jail に対するアクセスは HTTP のまま。