编辑:使用 iptables 阻止除 ssh(端口 22)和 RDP(端口 3389)之外的所有传入/传出流量的工作脚本:
#!/bin/sh
# Block all incoming/outgoing traffic except for ssh and rdp
iptables -Z # zero counters
iptables -F # flush (delete) rules
iptables -X # delete all extra chains
# Set default filter policy to DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Allow DNS
iptables -A INPUT --proto udp --sport 53 --jump ACCEPT
iptables -A OUTPUT --proto udp --dport 53 --jump ACCEPT
iptables -A OUTPUT --proto tcp --dport 53 --jump ACCEPT
# Allow unlimited traffic on loopback (localhost)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow ssh (22) and rdp (3389)
iptables -A INPUT -p tcp -m multiport --dports 22,3389 -j ACCEPT
# Continue accepting packets after connection is established (and moved to some random >1024 port)
iptables -A INPUT --match state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT --match state --state ESTABLISHED,RELATED -j ACCEPT
撤消:
#!/bin/sh
# Set default filter policy to ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -Z # zero counters
iptables -F # flush (delete) rules
iptables -X # delete all extra chains
答案1
你错过了类似这样的内容:
iptables -A INPUT --match state --state ESTABLISHED,RELATED --jump ACCEPT
iptables -A OUTPUT --match state --state ESTABLISHED,RELATED --jump ACCEPT
在建立连接后继续接受数据包。当发生这种情况时,服务器端的连接会移动到某个随机的 >1024 端口,这就是为什么在端口 22 和 3389 上接受数据包是不够的。
允许 DNS 查找:
iptables -A INPUT --proto udp --sport 53 --jump ACCEPT
iptables -A OUTPUT --proto udp --dport 53 --jump ACCEPT
iptables -A OUTPUT --proto tcp --dport 53 --jump ACCEPT
要同时为多个端口设置规则(so--sports
或--dports
),您必须启用multiport
模块。否则 iptables 会抱怨未知选项“--dports”。因此,要在一行中允许 SSH 和 RDP 传入连接:
iptables -A INPUT --proto tcp -m multiport --dports 22,3389 --jump ACCEPT
此外,由于您将默认策略设置为 DROP,因此您不需要在最后两行中为输入/输出连接额外设置 DROP。我确实知道它们会让您感觉更安全,但这就像设置主机名,并且还要每分钟设置一次 cron 作业以防万一。事实上,这可能会在将来导致问题,当您忘记这两行并附加一些其他规则时,您会困惑为什么它们不起作用。