iptablesはパケットフィルタリング型のファイアウォールで、サーバー接続時の通信ルールを設定できます。

簡単に説明すると「使用する入り口は開けて」「使用しない入り口は閉じる」ということです。

それでは簡易的な設定を紹介します。

iptablesの確認

iptables -Lで現在のルールを確認します。以下の表示は何も設定されていない状態です。

[hoge@wwwXXXXXX ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

ルールの設定

サーバー攻撃対策のルール

sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

上から順に以下の設定をしています。

  • データを持たないパケットの接続を破棄する
  • SYNflood攻撃と思われる接続を破棄する
  • ステルススキャンと思われる接続を破棄する

各種プロトコルごとにポート番号の設定

sudo iptables -A INPUT -p tcp -m tcp --dport (ポート番号) -j ACCEPT

主なポート番号(使わないポートは開けないようにしましょう)

プロトコル ポート番号
HTTP 80
HTTPS(SSL) 443
SMTP 25
SMTP(SSL) 465
POP3 110
POPS(SSL) 995
IMAP 143
IMAP(SSL) 993
SSH 22
FTP 20,21

通信の許可

sudo iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

通信の拒否

許可した通信以外のサーバーに受信するパケットを拒否、サーバーから送信するパケットを許可します。

sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT

設定の保存

sudo service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[   OK  ]

設定ファイルの確認

sudo cat /etc/sysconfig/iptablessudo iptables -Lで、設定内容が反映されている確認します。

sudo cat /etc/sysconfig/iptables
[sudo] password for XXX:
# Generated by iptables-save v1.4.7 on Fri Sep  2 17:52:56 2016
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:464]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
COMMIT
# Completed on Fri Sep  2 17:52:56 2016
$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
DROP       tcp  --  anywhere             anywhere            tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:urd
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pop3
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pop3s
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imap
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imaps
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

以上で設定完了です。

Sponsor link
わからないときに便利なサイト

サーバーを設定していざWordPressを設定もしくはコーディングしてみたらよくわからないけど動かない(泣)そんな経験ありませんか?

「時は金なり」わからないことは詳しい人に聞くのが手っ取り早いんです。そんなときに便利なのが teratailです。無料で使用できるのでオススメですよ!

teratail 無料登録