nftables vps aws CentOS8 linux
nftablesでストレスフリーなサーバ運用
2021-01-25まだまだCnetOS 8でサーバを立てる案件がる昨今。予算の関係でhttps、DB、FTP、Mailサーバなどを一台で運用なんて仕事はざらにある。最近の気の利いたVPSとかだとパケットフィルタがついてたりするんだけど、どうしても大味な設定しかできない。
そこで、やっぱりiptablesやfirewalldのお世話になるのだがCentOS8からnftablesになったので、先人の知恵を借りて日本国内IPアドレス+パケットフィルタを手軽に運用しようぜ!って話です。
なぜパケットフィルタとかめんどくさいことしなきゃいけないのか?
デフォルトのまま公開サーバを立ち上げておくと、いわゆる不正アクセスされる。サーバに侵入されなくても、どんどんポートスキャンされてアタックがやってくる。
そりゃもうえげつない世界。サーバ管理者として、夜も眠れない日々を過ごすことになる。精神衛生上、かなり心を削らる。
ちょっとだけ頑張ってパケットフィルタ設定するだけで安心して眠る事ができるのだ。
そもそも、nftablesってナニ?っていうのはこちらを参照すると把握できると思う。
Linuxにおける新たなパケットフィルタリングツール「nftables」入門大雑把に言ってしまうと、最近のディストリビューションではnftablesの採用が多くなってきているのだ。
比較的新しいLinuxカーネルに依存するので、例えばCentOS6とかにはインストールするのは難しいだろう。
新しくサーバを立てる場合、余程の制約がない限り、最新のOSを選択できると思うのでCentOS 8を選んでおけば大丈夫だ。
細かいことは置いておいて、サクッと設定してしまおう。
前提条件など
- サーバは一台、イーサネットポートは一つ
- webサーバを443ポートで公開
- メンテナンスにftp、sshを使う
- メール送受信は外部サーバを使う
OS、ハードウエア、nftablesの確認
CentOS 8が普通にインストールされている環境であれば、まず問題ないと思う。OSのバージョンを調べる
$ cat /etc/redhat-release
イーサネットポートを調べる
$ ip addr show
nftablesがインストールされているか調べる
$ dnf search nftables
インストールされていなければインストールする
$ dnf -y install nftables
IPアドレスのリストをゲットして設定ファイルを生成する
ここを参考に、日本国内のIPアドレスリストを取得するスクリプトを作成する。稲葉サーバーデザインさん、ありがとう!
nftablesでSSHを日本国内からの接続に限定する (CentOS 8)
シェエルスクリプトを新規作成する
# vi /root/bin/mk_country_whitelist.sh
#!/bin/bash
#
WORKDIR=/root/bin
WHITELISTSET_FILE=/etc/nftables/country_whitelist
WHITELIST_COUNTRY='JP'
cd ${WORKDIR}/
if [ -s cidr.txt ]; then
mv cidr.txt cidr.txt.bak
fi
wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip cidr.txt.gz
echo "define country_whitelist = {" > ${WHITELISTSET_FILE}
for COUNTRY in ${WHITELIST_COUNTRY}
do
sed -n "s/^${COUNTRY}\t//p" cidr.txt | while read ADDRESS
do
echo " ${ADDRESS}," >> ${WHITELISTSET_FILE}
done
done
echo "}" >> ${WHITELISTSET_FILE}
# EOF
実行権限をつけておく
# chmod 700 /root/bin/mk_country_whitelist.sh
実行してリスト取得→ファイル生成する
# /root/bin/mk_country_whitelist.sh
nftables のポリシー・ルールを決めてconfigファイルを作る
webサーバの運用に際して、ごくシンプルなルールで問題ないはずだ。
・外向きのパケットは許可
・loは許可
・アクセス制限しない:port 80 / 443 → eth0
・ホワイトリスト経由で許可:port 21 / 22 → eth0
・pingは通したいかな → eth0
・その他のポートはリジェクト
設定を間違えてしまうとアクセスできなくなってしまい詰んでしまう。
シリアルコンソールのあるサーバだと安心だ。
気をつけよう!
設定ファイルを新規作成する
# vim /etc/sysconfig/nftables.conf
flush ruleset
include "/etc/nftables/country_whitelist"
table ip myhelpers {
ct helper ftp-standard {
type "ftp" protocol tcp
}
chain prerouting {
type filter hook prerouting priority 0;
tcp dport 21 ct helper set "ftp-standard"
}
}
table ip filter {
set country_accept {
type ipv4_addr; flags interval;
elements = $country_whitelist
}
chain INPUT {
type filter hook input priority 0; policy drop;
iifname "lo" counter accept
iif "eth0" jump input_eth0
ct state established,related counter accept
icmp type echo-reply counter accept
icmp type destination-unreachable counter accept
icmp type time-exceeded counter accept
drop
}
chain input_eth0 {
ct state new tcp dport 80 counter accept
ct state new tcp dport 443 counter accept
ct state new tcp dport 21 ip saddr @country_accept counter accept
ct state new tcp dport 22 ip saddr @country_accept counter accept
}
chain FORWARD {
type filter hook forward priority 0; policy drop;
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
}
}
firewallldを停止、nftalbesを起動する
# systemctl disable --now firewalld
# systemctl enable --now nftables
イラスト:Loose Drawing
イラスト:Loose Drawing
Heading
Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.