Answers:
尝试以root用户访问权限:
# 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连接之类的内容。仅在您有权访问本地控制台时才使用它。
请参见Miphix的答案,了解如何为SSH添加例外。
请注意,其他答案不包括IPv6!如果您的系统接受IPv6流量,则没有一个iptables规则适用于ipv6流量。
而不是直接使用iptables / ip6tables,我建议使用iptables-restore和save。这些工具允许使用多个规则指定iptables配置,并使用一个命令轻松加载它。
创建一个具有以下内容的文件(我将其命名为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
以节省您的出站流量(它不会发送拒绝信标)