これは私の /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で接続できなくなった場合の見落としや懸念事項は無視してください。
私が正しい方法で質問を受け取った場合、ポート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
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を再度セットアップできます。
他の回答では、例で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にバンプされています。