web-dev-qa-db-ja.com

iptables-OK、**今**私はそれを正しくやっていますか?

これは 前の質問 のフォローアップです。ここで、iptablesの構成が正しいかどうかを尋ねました。

CentOS5.3システム。

意図した結果:ping、ssh、Apache、SSL以外のすべてをブロックします。

xenoterracideのアドバイス と質問に対する他の回答(みんなに感謝)に基づいて、私はこのスクリプトを作成しました:

# Establish a clean slate
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F # Flush all rules
iptables -X # Delete all chains

# Disable routing. Drop packets if they reach the end of the chain.
iptables -P FORWARD DROP

# Drop all packets with a bad state
iptables -A INPUT -m state --state INVALID -j DROP
# Accept any packets that have something to do with ones we've sent on outbound
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Accept any packets coming or going on localhost (this can be very important)
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp -j ACCEPT

# Allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow httpd
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow SSL
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Block all other traffic 
iptables -A INPUT -j DROP

今、私が得るルールをリストすると...

# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  any    any     anywhere             anywhere            state INVALID 
    9   612 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh 
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:http 
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:https 
    0     0 DROP       all  --  any    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 5 packets, 644 bytes)
 pkts bytes target     prot opt in     out     source               destination

私はそれを実行しましたが、まだログインできるので、それは良いことです。誰かが奇抜なものに気づきましたか?

5
Agvorth

ほとんどの部分でよさそうだ。重要なことは、iptablesを繰り返し実行するのではなく、おそらくiptables-saveとiptables-restoreを使用する必要があるということです。 iptables-save/restoreメソッドは、(データベーストランザクションのような)アトミックバルク更新を提供します。したがって、ネットワークパケットが到着したときに、iptablesの変更が途中で終了したため、何も入力できない(または入力できない)ことがわかります。この変更を行うと、最初のACCEPTポリシーをダンプできるため、優先ポリシー(できれば、DENY)を設定してから、個々のルール(ACCEPTされる例外)を設定するだけです。

それとは別に、(すべてを許可するだけでなく)ICMPをもう少しロックダウンすることを検討することをお勧めします。最近、ICMPのいくつかの側面がかなり危険だと聞いています。個人的には、診断やトラフィック管理の多くがICMPに依存しているため、それだけの価値はないと思います。

Wombleの「iptablesを使用しない」コメントについて:iptables(またはiptables-save/restore)を直接使用するべきではないとまでは言いませんが、代わりにFERMを確認することをお勧めします。それは本質的に単なるiptablesであり、より表現力があり反復性の少ない言語に加えて、変数のサポートがあります。たとえば、iptablesコマンドは次のとおりです。

iptables -P INPUT ACCEPT
...
# Allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow httpd
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow SSL
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Fermでは次のようになります。

# allow some incoming TCP
chain INPUT {
    policy ACCEPT;
    proto tcp dport (ssh httpd https) ACCEPT;
}

ずっといいですね;)

最後に、デフォルトのポート22でSSHを実行しないでください。別のアドレスに移動します(構成ファイルを編集して、sshdをリロードします)。 ssh経由で接続している場合でもこれを行うことができますが、sshまたはファイアウォールルール(仮想専用ホストによって提供されるコンソールベース)をいじる場合は、別のアクセス方法を使用することをお勧めします。また、最終的にはfail2banのようなものを設定することを検討してください。しかし、fail2banがブロックする前に、固定IP(私の側)と特定のファイアウォールルールがないと、何があってもアクセスできるようにするために使用しません。

3
Lee B

よさそうだ、私の個人的な好みは追加することだろう

-m state --state NEW

これらのルールに

# Allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow httpd
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow SSL
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

そして、INPUT、FORWARDのデフォルトポリシーをDROPに変更し、

# Block all other traffic 
iptables -A INPUT -j DROP

冗長

1
Khb