iptablesとのすべての着信接続を拒否しますか?


回答:


24

ルートアクセスでこれを試してください:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

これにより、実行中のすべての接続残酷に切断されること注意してください。これには、サーバーの管理に使用できるSSH接続などが含まれます。ローカルコンソールにアクセスできる場合にのみ、これを使用します。

SSHの例外を追加する方法については、Miphixの回答を参照してください。


2
ルールの最初の行を実行すると、SSHから切断されました
ホルム14年

7
問題は、「SSHを除くすべての着信接続を拒否する」ではなく、「すべての着信接続を拒否する」ことです:)
ヨハン14

私は...遅すぎる最初のルールについて@holmsの警告を読んで
デニス・コロディン

これは、ipv6トラフィックには影響しないことに注意してください。ipv6を有効にしている場合は、以下の回答をお読みください。
18

13

SSH経由でリモートで作業している場合、これを追加することができます(-I内の他のすべてのルールの前に挿入しますINPUT)。

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

SSHサービスが別のポートでリッスンしている場合、の代わりにそのポートを使用する必要があり22ます。

そうしないと、誤ってアクセスできなくなる可能性があります。


2

他の答えはIPv6をカバーしていないことに注意してください!システムがIPv6トラフィックを受け入れる場合、単一のiptablesルールはipv6トラフィックに適用されません。

iptables / ip6tablesを直接使用する代わりに、iptables-restoreを使用して保存することをお勧めします。これらのツールを使用すると、複数のルールでiptables構成を指定し、1つのコマンドで簡単にロードできます。

次の内容のファイル(iptables.rulesという名前)を作成します。

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

特定のポートへのICMPおよびトラフィックを許可する場合、いくつかの追加の例を追加しました。

次のコマンドでロードできます:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

これで、ルールはipv6もカバーし、管理が容易になりました。

Debianユーザーへの追加の注意:ルールに満足したら、apt install iptables-persistent再起動後にルールを復元することができます。ルールはシャットダウン時に自動保存されないため、実行netfilter-persistent saveして永続的なルールを更新します。


1

上記の両方の回答は何らかの形で正しいが、回答を生成するのに十分なほど正確ではない。(コメントを追加するには評判が足りないので、完全な回答を書いてください)。

私の場合、過負荷のApacheサーバーに遭遇し、cronジョブであふれ、CPUを過剰に利用しました。スレッドの制限はSQLデータベースに保存されていましたが、接続の制限に達しました。ローカルホストからの着信Apache接続を制限したい(この部分はオプションです)が、他のすべての接続は可能な限り維持します。実際に確立されたものを含む。

コマンドでやった

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

つまり、ポート80の着信tcpパッケージごとに、stateモジュールをロードし、これが最初のパッケージ(着信接続)である場合は拒否します。ローカルホストの場合は、使用するだけです-s 127.0.0.0/8

実際の使用ではNEW,INVALID、ルールにバイパスして「悪意のある」パッケージを送信できるため、状態に「無効」を追加する場合があります。に置き換えて-j DROP、アウトバウンドトラフィックを保存します(拒否ビーコンを送信しません)

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