web-dev-qa-db-ja.com

SSHポートが特定のIPアドレスに対してのみ開かれていることを確認するにはどうすればよいですか?

これは私の /etc/sysconfig/iptables

2つのポートがあり、80個のApacheと22個のsshが開いています。

# 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 80 -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

ポート22(SSH)の場合、特定のIPアドレスを除いて誰もこのポートに接続できないようにしたいと思います。

iPの例:

1.2.3.4

IPが変更され、サーバーにSSHで接続できなくなった場合の見落としや懸念事項は無視してください。

42
user78337

私が正しい方法で質問を受け取った場合、ポート22の特定のIPアドレスからのみサーバーに到達可能にしたい場合は、Iptablesを更新できます。

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

その場合、内部ネットワークのDNSを開く必要がある場合は、YourIPに対してのみsshポートを開いています。

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

それらを追加し、それらのIP用に開いたら、残りのIPのドアを閉じる必要があります。

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(ルールセットの正しい位置にルールを設定してください。iptables -A INPUTは、現在のようにINPUTの末尾にルールを追加します。)

または joel のように、代わりに1つのルールを追加できます。

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

またはファイアウォールでデフォルトのポリシーを設定するだけで

iptables -P INPUT DROP

簡単に言えば、 SOに関するこの質問

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
49
Nidal

SSH鍵の使用をお勧めしますが、説明します。

達成しようとしていることのためにIPtablesを使用する必要はありません。複数の方法があります。これはIPtablesの方法です:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] =ホームIP(かなり簡単)

[SSH_PORT] = SSHを実行するポート(デフォルトでは22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

これにより、IP以外のユーザーがSSHにログインできないようになります。

別の方法があります。それは、sshd_configに何かを追加することです。

以下を追加します。

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

これにより、パスワードを要求せずに、IPからrootユーザーとしてSSHにログインできます。

Cronジョブは

iptables -X
iptables -F

sSHを使用してサーバーからロックアウトされないように賢いかもしれません(cronjobはIPtablesをリセットするため、再度アクセスできます)。それでもアクセスできる場合は、cronjobを削除して、IPtablesを再度セットアップできます。

7
William Edwards

他の回答では、例でiptables -Iを使用していますが、これは多くの場合、使用すべきではありません。

iptablesは一致する最初のルールを実行するため、ルールの順序は非常に重要です。 -Iは「挿入」コマンドであり、インデックスパラメータと共に使用して、リスト内の特定のルールが属する場所を指定する必要があります。 -Aは「追加」コマンドで、リストの最後にルールを追加します。

一部の配布では(おそらくすべて)、インデックスパラメータなしで-Iを使用すると、ルールがインデックス1に追加され、最初のルールがチェックされます。このシナリオでは、最後に実行するコマンドがiptables -I INPUT -s tcp 0.0.0.0/0 -j DROPの場合、チェーンの後半にACCEPTルールがあるかどうかに関係なく、iptablesはすべてのトラフィックをドロップします。

次に、単一のIPからのSSHのみを許可するルールの設定例を示します。

ルールなしで開始:

#> iptables -nL
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

新しい「1.2.3.4からのSSHを許可する」ルールを追加します。

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

他のすべてのIPからのSSHをブロックします。

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

これで、INPUTチェーンは次のようになります。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

後で、2番目のIPをホワイトリストに登録する必要がある場合は、-Iパラメータを使用して、ブラックリストルールの前に配置できます。

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

-I INPUT 2を使用すると、新しいルールがルール番号2として追加され、DROPルールが番号3にバンプされています。

6
STW