我想制定一些简单的 iptables 规则来拒绝所有传入连接并允许传出连接。我该怎么做?
答案1
使用 root 权限尝试此操作:
请注意,这将残忍地切断所有正在运行的连接- 这包括您可能用来管理服务器的 SSH 连接等内容。仅当您有权访问本地控制台时才使用此功能。
请参阅 Miphix 的回答,了解如何为 SSH 添加例外。
# 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
答案2
如果您通过 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
以更新持久规则。
答案4
拒绝特定网站:
# iptables -A OUTPUT -p tcp -d www.twitter.com --dport 443 -j DROP
# iptables -A OUTPUT -p tcp -d twitter.com --dport 443 -j DROP
# service iptables save
# service iptables restart
# iptables -L