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


42

これは私の/etc/sysconfig/iptablesです:

80個のApacheと22個のsshを開く2つのポートがあります。

# 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で接続できなくなった場合の見落としや懸念を無視してください。

回答:


47

質問を正しい方法で受け取った場合、ポート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 INPUTINPUTようにルールを最後に追加します。)

またはジョエルが言ったように、代わりに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

2
またiptables、targetを実行する場合に備えて、bang演算子を使用した反転をサポートしていることにも注意してくださいDROP。例:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
ブラッチリー14

1
また、無条件のDROP'sは本当に必要ありませんiptables -P INPUT DROP。ファイアウォールでデフォルトのポリシーを設定し、それをそのままにしておくことができます。この方法でそれらを行う場合、おそらく追加としてもそれらを行うことをお勧めしDROPますACCEPT
ブラッチリー14

1
-I(挿入)のデフォルトはルール#1として挿入するため、これはうまくいきませんでした。したがって、DROPはルール#1として挿入され、最初に評価され、したがってACCEPTルールを評価せずにすべてのsshパケットをドロップします。あなたは、実行する必要があるiptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPiptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROPINPUTルール#3のように、インサート入力手段の後に「3」(一つだけがINPUTのための「2」を使用し、その後ACCEPTそうでない場合は、次の2つが受け入れる挿入されていると仮定。
ケビントリプレット

@Networker Usingを使用-Iすると、新しいiptablesルールが上部に挿入されます。そのため、許可する前にドロップを挿入することになります。-A代わりに使用することをお勧めします
-BlueCacti

1
まあ私は自分自身を締め出した、gj
ngwdaniel

6

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

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

cronjobが

iptables -X
iptables -F

賢いので、SSHでサーバーからロックアウトされないようにします(cronjobはIPtablesをリセットして、再びアクセスできるようにします)。まだアクセスできる場合は、cronjobを削除してIPtablesを再度セットアップできます。


ただし、cronjobはファイアウォールを削除するだけです。なぜiptables最初にセットアップするのですか?何らかの形の帯域外アクセスが一般的な方法です。knockd別です。
マット14

@mtmはい。ロックアウトされると、cronjobはIPtablesのセットアップをリセットし、SSHに再びアクセスできるようにします。人々がIPtablesを使用する理由は異なります。私の意見では、IPtablesは効果的でシンプルで柔軟なファイアウォールです。
ウィリアムエドワーズ14

2
oic。定期的にではなく、セットアップ時に一度フラッシュを実行することを意味します。atそれをします。
マット14

4
IPのみをホワイトリストに登録してから、パスワードなしでルートログインを許可するのは、ひどい考えのようです。
アレックスW

1
@AlexWしばらく経っていることは知っていますが、私はまだコメントしたかったWithout-Passwordです:パスワード認証は許可されていないので、代わりにSSHキー認証を使用する必要があります。実際、この認証方法の名前は少し不明確です。ただし、これは、rootとしてログインするためにパスワードが必要ないという意味ではありません。それでも、より安全な方法はPermitRootLogin no、rootが一般的なターゲットであるため、別のsudoアカウントを設定してログインすることです
-BlueCacti

5

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

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

一部のディストリビューション(おそらくすべて)で-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にバンプされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.