カテゴリー
Linux

ウェブサイトへのアクセスのみを許可する iptables 設定方法♪

あ、そういえばですね、すっごい昔に sendmail を本ブログを置いているサーバで使えるようにしたことがありました。設定、その時のままでした。。。

iptables です。この設定を見直しましたのでメモいたします。

ポイント

次のように iptables の設定を変更します。

  • WordPress(本ブログ、要するにウェブサイトです)へ、世界中からのアクセスを受け入れる。
  • でも ssh へも条件付きでアクセスを受け入れる(最終的に条件をつけることができませんでした><)。
  • 他はすべて拒否する。

以前からの変更点

  • メール転送SMTP(25)、メール受信POP(110)を拒否します。
  • といっても、すべての接続を拒否し必要な物のみ受け入れる設定方法をいたしますので、上記2つを拒否するためのコマンドは現れません

以前というのは、こちらの投稿です。懐かしいです。

実際にやってみたら意外と苦労いたしました><

まず、備忘録として各ポートと、サービスの対応をメモしておきます。

No ポート番号 説明
1 80 http
2 443 https
3 3333 ssh(一般的には 22 )

では、本ブログを設置しているサーバに ssh アクセスいたしまして、まず /etc/sysconfig/iptables のバックアップを取ります。次のコマンドを順に実行しようといたしました。

××× これはダメな iptables コマンド実行の順番 ×××

# ルールをクリアします。
iptables -F

# ポリシーを決めます。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 接続済み(ESTABLISHED)とその関連(RELATED)パケットを許可します。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# icmp(ping)と自端末からの入力を許可します。
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# 公開サービスへの接続を許可します。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# パスワード付きサービスへの接続を時間あたりの回数制限付きで許可します。
# 3/m:1分間3回まで、つまり20秒ごとに1アクセス受け入れます。
# --hashlimit-burst 3:連続3回は --hashlimit を無視してアクセスを受け入れます。
# --hashlimit-htable-expire 60000:管理テーブル中のレコードの有効期間(単位:ms)で、最後のアクセスの60秒後に接続元に対する hashlimit の制限を破棄します。
iptables -A INPUT -p tcp --dport 3333 -m hashlimit --hashlimit-name ssh --hashlimit 3/m --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-htable-expire 60000 -j ACCEPT

結果、大変なことになりました。

ルールのクリア、iptables -F を実行した時点で、ssh から強制的に切断されました。そして、ウェブサイトにもアクセスできなくなりました。

なんということでしょう。

どうしようもありませんので、VPS のウェブ管理画面から CentOS をリブートいたしました。これで、ssh もウェブアクセスも復活しましたので一安心です。それからいろいろいじって、これでありましょうという原因に突き当たりました。

  • iptables -F を実行した時点で、それ以前に設定したルール以外をクリアします。
  • つまり、いきなり iptables -F を実行するとすべてのルールがなくなり、結果どこからの接続も拒否するようになるのでしょう。
  • よって、iptables -F を実行する前に ssh や ウェブアクセスを許可するように設定する必要があります。

こういうことですので、最終的に次の順番でコマンドを実行しましたら無事思い通りの設定をすることが出来ました♪

◎◎◎ 今度は OK な IPTABLES コマンド実行の順番 ◎◎◎

ちょっとしたコツですが、コマンドを実行していくとリアルタイムにファイアウォール設定が変更されていきます。ですので「iptables -L」や「iptables -L -nv」で状態を確かめながら進めていくと便利です。

# ポリシーを決めます。
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# ルールをクリアします。
iptables -F

# 接続済み(ESTABLISHED)とその関連(RELATED)パケットを許可します。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# icmp(ping)と自端末からの入力を許可します。
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# 接続を許可します。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 3333 -j ACCEPT

# 上記以外の INPUT を拒否
iptables -P INPUT DROP

ポイントは、次の点です。わかってしまえば、なあんてことはありません。

  • 最初に iptables -P INPUT ACCEPT ですべてを受け入れるポリシーを設定することで、次に iptables -F というルールのクリアを行なっても ssh とウェブへのアクセスを維持する。
  • 最後は iptables -P INPUT DROP を設定してそれまでに許可したもの以外を拒否する。

さらに次のコマンドで設定を保存し、サーバを再起動した時に今回設定した内容が自動的に適用されるようにします。そして、iptables を再起動します。

# 設定をセーブします。
iptables-save > /etc/sysconfig/iptables

# iptables を再起動します。
/etc/rc.d/init.d/iptables restart

最後に、新しくターミナルを開きまして、新しく ssh 接続が確立できることを確認しまして完了です!

課題

以上なのですが、、、実は、課題があります。

# パスワード付きサービスへの接続を時間あたりの回数制限付きで許可します。
# 3/m:1分間3回まで、つまり20秒ごとに1アクセス受け入れます。
# --hashlimit-burst 3:連続3回は --hashlimit を無視してアクセスを受け入れます。
# --hashlimit-htable-expire 60000:管理テーブル中のレコードの有効期間(単位:ms)で、最後のアクセスの60秒後に接続元に対する hashlimit の制限を破棄します。
iptables -A INPUT -p tcp --dport 3843 -m hashlimit --hashlimit-name ssh --hashlimit 3/m --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-htable-expire 60000 -j ACCEPT

上記の設定ができませんでした。がんばったんですよ?でもダメでしたねー♪コマンドを実行すると、なんかエラーになりました。こんなエラーです。

  • iptables: Unknown error 4294967295

きっと出来るはずと思いますので、これからの課題ですがこのページが参考になると思いますので控えておきます。

おわりに

次のページが参考になりました。ありがとうございます。iptables はとても奥が深いです。難しいですけれど、面白いです♪

以上です。

「ウェブサイトへのアクセスのみを許可する iptables 設定方法♪」への1件の返信

コメントを残す