Linux(CentOS 6) - iptablesの設定を変更し、http、httpsでのアクセスを許可する
minimal install(ミニマルインストール)したCentOS 6.4は、iptables(ファイアウォール)の設定が自動的に有効になっているため、この設定を変更しない限り、httpdプロセスが実行中であっても、CentOSの外のネットワークからhttp、httpsでのアクセスができない。
つまり、CentOSでApacheによるWebサービスを提供していても、CentOSの外のネットワーク上にあるPCのブラウザからは、CentOSのWebサービスが提供するサイトを閲覧できない。
この問題を解決するには、(1)iptablesを無効にするか、(2)iptablesにhttp(80番ポート)、https(443番ポート)でのアクセスを許可する設定を追加すればよい。
以下に、それぞれの設定メモを記載する。
(0)共通作業
[root@test ~]# /etc/rc.d/init.d/iptables status ←iptablesの稼働状況を確認する。(以下のメッセージであれば稼働していることが分かる。)
テーブル: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
(1)iptablesを無効にする場合の作業
[root@test ~]# /etc/rc.d/init.d/iptables stop ←iptablesをコマンドで停止する。
iptables: ファイアウォールルールを消去中: [ OK ]
iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
iptables: モジュールを取り外し中: [ OK ]
[root@test ~]# /etc/rc.d/init.d/iptables status ←iptablesの稼働状況を確認する。(以下のメッセージであれば稼働していないことが分かる。)
iptables: ファイアウォールが稼働していません。
[root@test ~]# chkconfig --list iptables ←iptablesの自動起動設定を確認する。
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@test ~]# chkconfig iptables off ←iptablesの自動起動設定を無効化する。
[root@test ~]# chkconfig --list iptables ←iptablesの自動起動設定が無効化されたことを確認する。
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
(2)iptablesにhttp(80番ポート)、https(443番ポート)でのアクセスを許可する設定を追加する場合の作業
[root@test ~]# iptables -L ←iptablesの設定を一覧表示する。
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@test ~]# cat /etc/sysconfig/iptables ←iptablesの設定ファイル(テキスト)の中身を確認する。
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended. ←「このファイルを手動で修正することは推奨しない」と記載されていたので、手動での修正は見送ることとする。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@test ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT ←HTTP(80番ポート)へのアクセスは許可する。
[root@test ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT ←HTTPS(443番ポート)へのアクセスは許可する。
しかし、これでは誤った設定をしたことになり、依然として、CentOSの外のネットワークからはhttp、httpsでのアクセスができない。
[root@test ~]# iptables -L -n --line-numbers ←iptablesの設定をnum(ファイアウォールのルール番号)およびポート番号付で一覧表示する。
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
上記のiptablesの設定では、ルール番号6と7でhttpとhttpsを許可する前に、ルール番号5で全てのアクセスを拒否している設定になっている。
番号が若いルールの方がルールは優先されるため、これではhttpとhttpsでのアクセス許可を設定した意味がない。
そこで、http、httpsのルールは、ルール番号5に挿入して追加することとする。
[root@test ~]# iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT ←HTTP(80番ポート)へのアクセスは許可する。
[root@test ~]# iptables -I INPUT 5 -p tcp --dport 443 -j ACCEPT ←HTTPS(443番ポート)へのアクセスは許可する。
[root@test ~]# iptables -L -n --line-numbers ←iptablesの設定をnum(ファイアウォールのルール番号)およびポート番号付で一覧表示する。
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
7 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
9 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@test ~]# iptables -D INPUT 9 ←最初に設定したhttpとhttpsの誤ったルール9が残っていたので削除する。
[root@test ~]# iptables -D INPUT 8 ←最初に設定したhttpとhttpsの誤ったルール8が残っていたので削除する。
[root@test ~]# iptables -L -n --line-numbers ←iptablesの設定をnum(ファイアウォールのルール番号)およびポート番号付で一覧表示する。
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
7 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
以上の作業で、CentOSの外のネットワークからhttp、httpsでのアクセスができるようになっているはずなので、接続できていることを確認する。
なお、以上の作業では設定が「保存されていない」ので、設定を保存するために、以下の作業も必要。
[root@test ~]# /etc/rc.d/init.d/iptables save ←設定したiptablesの情報を保存する。この作業をしないと、iptables再起動時またはOS再起動時に、今回設定したiptablesの内容が消えてしまう。
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[ OK ]中:
[root@test ~]# /etc/rc.d/init.d/iptables restart ←iptablesを再起動する。
iptables: ファイアウォールルールを消去中: [ OK ]
iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
iptables: モジュールを取り外し中: [ OK ]
iptables: ファイアウォールルールを適用中: [ OK ]
[root@test ~]# iptables -L -n --line-numbers ←iptablesを再起動しても、設定が失われていないことを確認する。
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
7 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@test ~]# cat /etc/sysconfig/iptables ←iptablesの設定ファイル(テキスト)に、設定が追記されていることを確認する。
# Generated by iptables-save v1.4.7 on Mon May 6 01:23:59 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [157:40257]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon May 6 01:23:59 2013
[root@test ~]# chkconfig --list iptables ←iptablesの自動起動設定を確認する。
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off