回答:
ルートアクセスでこれを試してください:
# 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の回答を参照してください。
他の答えは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
して永続的なルールを更新します。
上記の両方の回答は何らかの形で正しいが、回答を生成するのに十分なほど正確ではない。(コメントを追加するには評判が足りないので、完全な回答を書いてください)。
私の場合、過負荷の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
、アウトバウンドトラフィックを保存します(拒否ビーコンを送信しません)