プロが教える店舗&オフィスのセキュリティ対策術

Linuxのiptablesについて教えてください、初心者です。
VPSを試しに使ってiptablesを勉強しています。
sshから下記を実行しました

iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
/etc/init.d/iptables save
service iptables restart

結果、(1)では22、(2)では22 80、(3)では22 25 80が開いているように表示されてます

ブラウザからサーバーにあるホームページは閲覧できません(設定通りで正しいと思います)

(1)(2)(3)の違いはなんなのでしょうか?別モノなのでしょうか?


(1)iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

(2)nmap (ホスト名)
Starting Nmap 5.51 ( http://nmap.org ) at 2014-05-15 08:04 JST
Nmap scan report for ホスト名 (IPアドレス)
Host is up (0.000013s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds

(3)nmap localhost
Starting Nmap 5.51 ( http://nmap.org ) at 2014-05-15 08:01 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000070s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds

A 回答 (4件)

>【A】


>下記のようにした場合、
>「(1)で受信はすべて破棄、(2)で22を許可、(3)で受信はすべて破棄」となると思いますが、
>(2)の後に(3)が実行されているのに、結果として「22番のみ許可される」というのが理解できません

(1)と(3)は同じモノでしょう。
どちらもINPUTに対する設定ですから、後から実行した(3)の設定だけ有効になりますけどね。
で…
-P INPUT DROP
という設定で、INPUTのパケットは基本的に全部DROPする。
という状態にして、
-A INPUT ~
という設定で、「例外のルール」を作り込んでいきます。
例外のルールは記述した順に評価してヒットすればそこのルールに従い、
ヒットしなければ次のルールを…
全て評価してヒットしなければ、基本として設定した内容に従います。
# OUTPUTを基本ACCEPTにして、特定のポートだけREJECTとかやることも可能なわけで。

>【B】
>記載いただいた下記は具体的にどのような事でしょうか

よく書かれる定型パターンなんですが…。
http://techmemoin.blogspot.jp/2012/03/arch-linux …
http://www.atmarkit.co.jp/ait/articles/1001/06/n …
http://www3.big.or.jp/~sian/linux/tips/iptables. …

>【C】
>記載いただいた下記は具体的にどのような事でしょうか
同じく定型パターンです。
http://centossrv.com/iptables.shtml
こういうところからの設定つまみ食いですね。
今回のパターンはどこから取ってきたのか忘れましたが…。
# ちょっと…正しいのか不安になってきたな…。まぁ外から接続可能なポートはルータで制限されていますが。

>【D】
>記載いただいた下記はついて
>(4)は「OUTPUT」で「--sport 22」ではないのですか?

#2にも書きましたが、--sportは基本的に使用しません。
まぁ、OUTPUTの--sport 22なら確かに意味はありそうですが。
OUTPUTは基本ACCEPTなので、個別に設定する必要はありません。

>また(5)は「--dport 22」 ではないのですか?

外向けのssh(外部からのSSH接続)は非標準ポートを使っている。
というだけの話です。
ルータで22番への接続要求は弾いていますからね。
なんでそんなコトしているのかは、sshのログでも眺めてみてください。
VPSで22番開けているならおそらく納得できるだけの材料が既に揃っているでしょうし。
# まぁ、既に乗っ取り完了していてログが消されている。という可能性も否定できなくはないんですが…。

>【E】
>下記のように書いてる例をよく見かけますが、
>(7)を書く意味はなんなのですか、(6)だけで問題ないように思うのですが。

う~ん??
どこの例で書かれているんですかね??
http://www.rapidsite.jp/support/manual/rv_custom …
http://kjirou.sakura.ne.jp/wiki_mirror/index.php …
とかでしょうか?
2番目はともかく、最初のページの方だと「-m state」の設定が無いみたいですから、接続先からのパケット受け取るためにソースポートの指定が必要なんでしょう。
# ってことでソースポート80番に指定した攻撃パケットの接続は許可できますね。


ちなみに…あんまり関係ありませんが自宅のネットワークは192.168.1.0/24なので「-s 192.168.0.0/16」というのは微妙に正しくはなかったりします。
192.168.0.0/16なら192.168.1.0/24も含まれますし、192.168.1.0/24から変更したときに設定触る箇所が減る。というのもあります。
# モバイルWiMAXルータが192.168.1.0/24固定なので、そっちからVPN張ろうと思ったら自宅ネットワークの方を変更するしかない。

この回答への補足

Wr5さん、ありがとうございます

大きな勘違いをしていたようです。
『【A】で(1)で全てのポートが閉じられ、次に22番のみ解放され、さら直後に全てのポートが閉じられるので、結果としてすべてのポートが閉じた状態になり、22番も許可されない』という固定した設定になるものと考えていました。
『考え方が違うんですね、その都度上から順にチェックし、該当のポートに設定されたルールがあればそれに従い、無ければ基本として設定したルールに従う』ということなんですね。
従って『基本ルールは(1)の位置でも(3)の位置でも、どちらか1つにあれば全く同じ』ということなんですね。

【B】【C】については、何となく解かりそうです。

【D】については質問内容自体間違ってました、納得できました

【E】については、(7)は書く必要はない、書くと危険だということですよね。(--sportを書くのは必要ないし危険だと)

補足日時:2014/05/17 13:30
    • good
    • 0

>22番ポートのみ開けたいのです(特別な意味はありません、勉強です)


>下記だけでいいと言うことですか

基本的にはOKでしょう。

>iptables -P INPUT DROP
は -A より先にやってしまって問題ありません。

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
も入れておいた方がいいでしょう。

ウチのサーバの/etc/sysconfig/iptablesは下記の通りです。(一部のみですが)
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
## START
# ループバックは許可
-A INPUT -i lo -j ACCEPT
# icmpは許可
-A INPUT -p icmp --icmp-type any -j ACCEPT
# 自サーバが送信したコネクション開設要求に関連するパケット受信と、接続完了後のパケット受信を許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 新規セッションなのにSYNフラグの立っていないパケットは拒否
-A INPUT -p tcp -m state --state NEW ! --syn -j DROP
# ssh
# 内からのssh許可
-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/16 --dport 22 -j ACCEPT
# 外からのssh許可
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10649 -j ACCEPT
# ftp
-A INPUT -s 192.168.0.0/16 -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -s 192.168.0.0/16 -m state --state NEW -m tcp -p tcp --dport 50020 -j ACCEPT
# telnet
-A INPUT -s 192.168.0.0/16 -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
# http & https
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT


>25 80が開いてるように表示されるのは何故なのですか???

>iptables -A INPUT -i lo -j ACCEPT
で、ループバックアドレスを許可しているから…でしょう。

(2)の
>Nmap scan report for ホスト名 (IPアドレス)
で表示されるIPアドレスがローカルループバックではなかった…とすると、ちょっと疑問ではありますが。

あとは…
netstatでどのポートで待ち受けがあるか?
というのを確認じゃないでしょうかね。

この回答への補足

Wr5さん、ありがとうございます。
ちょっと解かってきたように思いますが・・・・
また教えて下さい。

【A】
下記のようにした場合、
「(1)で受信はすべて破棄、(2)で22を許可、(3)で受信はすべて破棄」となると思いますが、
(2)の後に(3)が実行されているのに、結果として「22番のみ許可される」というのが理解できません
iptables -F
iptables -X
iptables -P INPUT DROP ----- (1)
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT ----- (2)
iptables -P INPUT DROP ----- (3)
/etc/init.d/iptables save
service iptables restart

【B】
記載いただいた下記は具体的にどのような事でしょうか
# 自サーバが送信したコネクション開設要求に関連するパケット受信と、接続完了後のパケット受信を許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

【C】
記載いただいた下記は具体的にどのような事でしょうか
# 新規セッションなのにSYNフラグの立っていないパケットは拒否
-A INPUT -p tcp -m state --state NEW ! --syn -j DROP

【D】
記載いただいた下記はついて
(4)は「OUTPUT」で「--sport 22」ではないのですか?、また(5)は「--dport 22」 ではないのですか?
# ssh
# 内からのssh許可
-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/16 --dport 22 -j ACCEPT ----- (4)
# 外からのssh許可
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10649 -j ACCEPT ----- (5)

【E】
下記のように書いてる例をよく見かけますが、
(7)を書く意味はなんなのですか、(6)だけで問題ないように思うのですが。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT ----- (6)
iptables -A INPUT -p tcp --sport 80 -j ACCEPT ----- (7)

補足日時:2014/05/17 08:14
    • good
    • 0

面倒なのでTCPだけで。



>iptables -F
>iptables -X

iptablesの設定を初期化するっす。

>iptables -P INPUT DROP

INPUTパケットの基本ポリシーはDROPっす。
ルールに沿わないと全部捨てるっすよ!
ちょー安全っす!!

>iptables -A INPUT -p tcp -j ACCEPT

TCPパケット受け入れのルールとして全部受け入れるっすよ!
この時点でTCP全てのパケット受け入れろって言われたんで「ちょー安全っす!!」っは無効にしろ。と親分から指示されたっす。
任してくだせぇ。

>iptables -A INPUT -i lo -j ACCEPT

へぇ。ウチの組のモンは顔パスっすね。
了解しやした!!

>iptables -A INPUT -p tcp --dport 22 -j ACCEPT

姐さんの客人は通せばいいんですね。
わっかりやしたぁ。
でも全員通れるンすけど…。

>iptables -A INPUT -p tcp --sport 22 -j ACCEPT

よその組の姐さんからの手土産持っている人は全員通すんですね。
了解っす。ヒットマンでも通しますよ。
# かなり例えが苦しいなぁ…
# INPUTでソースポート指定する意味はあまりありませんが…
# 普通は送信側が空いている適当なポート番号を指定するのでソースポートでフィルタすることはあまりありません。


という設定をしてみました。
(1)で表示される
>ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
は接続済みのパケットは通す。というヤツです。

>結果、(1)では22、(2)では22 80、(3)では22 25 80が開いているように表示されてます

1ではフルオープンです。
どんなパケットだって受け入れちゃうよ~状態ですね。
つまり「フィルタなしと同じ」です。

(2)のホスト名がどこを挿しているのか不明ですが……
自ホストのIPアドレス(非ループバック)が引けるのなら、
そこから規定のポートをスキャンしているのでしょう。
# nmapはポート範囲指定しない場合にいくつかのポートしかスキャンしなかったと記憶していますが…

(3)で25番ポートが開いているように見えるのはSMTPサーバが「localhostからの接続は受け入れる」という設定になっているからでしょう。

netstat -lpn -A inet
とかやると
tcp 0 127 0.0.0.1:25 0.0.0.0:* LISTEN 2726/master
とか表示させるんじゃないでしょうか。




というワケで…
>iptables -A INPUT -p icmp -j ACCEPT
>iptables -A INPUT -p tcp -j ACCEPT
>iptables -A INPUT -p udp -j ACCEPT
があったら、フィルタの意味がありません。

この回答への補足

Wr5さん、ありがとうございます
22番ポートのみ開けたいのです(特別な意味はありません、勉強です)
下記だけでいいと言うことですか
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
/etc/init.d/iptables save
service iptables restart

25 80が開いてるように表示されるのは何故なのですか???

補足日時:2014/05/15 11:04
    • good
    • 0

(1),(2)について



>(1)iptables -nL
>ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

-v オプションを付けていないので詳しくわかりませんが、全ての通信が許可になっていませんか?

>22/tcp open ssh
>80/tcp open http

3wayハンドシェークは出来ているということを示しているので、
こうなるのは、iptablesでは通過しているけれど、実際にこの2つしかListenしていないだけというこうはありませんか?
netstatで確認できると思います。

>ブラウザからサーバーにあるホームページは閲覧できません(設定通りで正しいと思います)

httpサービス側(Apacheですかね)で拒否しているということはありませんか?

(3)について

>iptables -A INPUT -i lo -j ACCEPT

この設定があるのですから、ローカルループバックは全て許可になっているはずです。

>25/tcp open smtp

これがあるのは、smtpサービスはローカルループバックでのみListenしているからでは。


見当違いでしたら申し訳ありません。

この回答への補足

maesen、ありがとうございます
おっしゃられている事を理解できません、すみません

補足日時:2014/05/15 11:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!