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.

View details »