拒绝所有与iptables的传入连接?


17

我想制定一些简单的iptables规则来拒绝所有传入连接并允许传出。我怎样才能做到这一点?

Answers:


27

尝试以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添加例外。


2
当您执行规则的第一行时,我已断开与SSH的连接
holms 2014年

7
问题是“拒绝所有传入连接”,而不是“拒绝除SSH之外的所有传入连接:”
Yohann 2014年

我读到有关第一条规则的@holms警告,为时已晚...
DenisKolodin '16

请注意,这对ipv6流量没有影响。如果您启用了ipv6,请在下面阅读我的答案。
bhelm '18

13

如果您通过SSH进行远程工作,则可能需要添加此内容(-I将其插入之前的所有其他规则之前INPUT):

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

如果您的SSH服务正在侦听另一个端口,则必须使用该端口而不是22

否则,您可能会意外失去访问权限。


3

请注意,其他答案不包括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以更新持久性规则。


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以节省您的出站流量(它不会发送拒绝信标)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.