安全 iptables 配置以防御攻击的提示。(客户端!)

信息安全 网络 linux 防火墙 iptables
2021-08-16 00:52:51

自己的例子:

###############
# KERNEL PARAMETER CONFIGURATION

# PREVENT YOU SYSTEM FROM ANSWERING ICMP ECHO REQUESTS
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

# DROP ICMP ECHO-REQUEST MESSAGES SENT TO BROADCAST OR MULTICAST ADDRESSES
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# DONT ACCEPT ICMP REDIRECT MESSAGES
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# DONT SEND ICMP REDIRECT MESSAGES
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# DROP SOURCE ROUTED PACKETS
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# ENABLE TCP SYN COOKIE PROTECTION FROM SYN FLOODS
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# ENABLE SOURCE ADDRESS SPOOFING PROTECTION
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# LOG PACKETS WITH IMPOSSIBLE ADDRESSES (DUE TO WRONG ROUTES) ON YOUR NETWORK
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

# DISABLE IPV4 FORWARDING
echo 0 > /proc/sys/net/ipv4/ip_forward

###############
# INPUT

# DROP INVALID
$IPTABLES -A INPUT -m state --state INVALID -j DROP

# ALLOW ONLY ESTABLISHED, RELATED
$IPTABLES -A INPUT -p tcp -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p udp -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT

# DROP INVALID SYN PACKETS
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

# MAKE SURE NEW INCOMING TCP CONNECTIONS ARE SYN PACKETS; OTHERWISE WE NEED TO DROP THEM 
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# DROP PACKETS WITH INCOMING FRAGMENTS. THIS ATTACK RESULT INTO LINUX SERVER PANIC SUCH DATA LOSS
$IPTABLES -A INPUT -f -j DROP

# DROP INCOMING MALFORMED XMAS PACKETS
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# DROP INCOMING MALFORMED NULL PACKETS
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

###############
# OUTPUT

# DROP INVALID
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP

# DROP INVALID SYN PACKETS
$IPTABLES -A OUTPUT -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP
$IPTABLES -A OUTPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPTABLES -A OUTPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

# MAKE SURE NEW OUTGOING TCP CONNECTIONS ARE SYN PACKETS; OTHERWISE WE NEED TO DROP THEM 
$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

# DROP PACKETS WITH OUTGOING FRAGMENTS. THIS ATTACK RESULT INTO LINUX SERVER PANIC SUCH DATA LOSS
$IPTABLES -A OUTPUT -f -j DROP

# DROP OUTGOING MALFORMED XMAS PACKETS
$IPTABLES -A OUTPUT -p tcp --tcp-flags ALL ALL -j DROP

# DROP OUTGOING MALFORMED NULL PACKETS
$IPTABLES -A OUTPUT -p tcp --tcp-flags ALL NONE -j DROP

我们能否收集更多与 iptables 相关的优秀想法来保护客户端免受攻击?例如:Ubuntu 11.04 台式电脑的“防御攻击”~kind 规则。

谢谢!

ps:当然:

$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP

ps2:在 IPv4 和 IPv6 上!

ps3:我不需要这样的规则:只允许 UDP 和 TCP 在端口 53 出站,我只想要“防御”规则,例如:端口扫描、攻击等。

ps4:PC 位于路由器/NAT 后面或“直接连接到互联网”。

4个回答

我知道有不同的意见,但真正了解网络和安全的人的一个主要态度是,这些 iptables/sysctl 规则中的大多数都是多余的,即使不会对您和网络造成损害。有些人会无缘无故地批评你违反标准行为。一些例子:

  • 标准的 TCP/IP 行为是拒绝,以便对等方得到一些关于正在发生的事情的提示。也许有人只是输入了错误的 URL,或者您的管理员正在计算主机数,或者有人想连接到您的游戏服务器但输入了错误的端口。使用 DROP,它们只会变得晦涩难懂且令人讨厌的超时。

  • 无需丢弃无效或格式错误的数据包,所有这些攻击都已有十年之久。Linux 内核开发人员在哪些类型的数据包是有效的和哪些不是有效的方面比你更新的多。“那未来的缺陷呢”,有些人可能会争辩。那么,你怎么知道未来的缺陷将在 TCP 处理程序中,而不是在 iptables TCP 解析器中?

  • 大多数 sysctl 设置都是默认设置。如果不是,通常是有原因的。例如,为什么禁用发送重定向?我发现由对等方通知我的路由不好是非常有用的,即使我永远不会自动做出反应(“accept_redirects”,默认=0)。

  • 使用您的 log_martians 和其他日志记录规则,我希望您在 /var/log 上也有配额,否则远程填充磁盘会很有趣,通常会杀死您的服务/应用程序。此外,您应该对日志记录使用速率限制,否则有人可能会填写配额,以防止您在 auth.log 或其他内容中看到 SSH 密码暴力破解尝试。您实际上是在桌面上阅读这些日志吗?我推荐日志检查。

  • 您似乎阻止了 ICMP。除了提到的 DHCP 问题外,这还会阻止 PMTU 发现。如果没有 PMTUD,当您在有 DSL 连接或其他网络设置的地方使用系统时,您会出现奇怪的行为。一些数据包将被丢弃,没有人告诉你原因。

  • 过滤出站数据包有点模糊。你不相信自己吗?您通常不应运行任何您不能信任的程序。商品操作系统大多无法将这些程序与窃听甚至操纵其他程序的数据(例如缓存定时攻击)隔离开来

  • 您需要新数据包才能具有 SYN。如果在 iptables 中的相应状态已经超时后继续 TCP 连接,这将中断。不确定默认超时是什么,但一些 netfilter 人警告过它。

那么,桌面什么时候应该有防火墙呢?

  • 如果您当前的操作系统或服务器容易受到新闻中的特定攻击,那么推荐的快速修复之一是防火墙规则。

  • 您必须运行某些不允许安全配置的服务。大多数都这样做,其余的最好用安全的替代品代替。

  • 您有更复杂的网络,桌面上有多个虚拟机和/或接口。

网络安全的首要工具是系统更新。其次,还有 netstat 和 nmap,您应该使用它们来查找和确认您正在运行的服务。然后只需禁用那些你不需要的或将它们限制在 127.0.0.1。

如果你读到这里,会有额外的收获:数据包要么是已建立的,要么是相关的,要么是新的,其他的都是你丢弃的。除非只设置了 SYN,否则您也会删除 NEW。由于 ESTABLISHED,RELATED 似乎检查标志,这使得所有 --tcp-flags 规则和 -f 规则都是多余的。OUTPUT 也一样,但由于无论如何都没有为 OUTPUT 接受数据包,所以这可能无关紧要。

我会小心地为受信任网络内的设备和 DMZ 中的设备创建相同规则集的这些部分。通过使用您在那里定义的规则,您将不会响应 DHCP 服务器询问(ICMP 回显)您的 IP 是否正在使用中。这可能会导致地址重复的情况。

我会创建两组不同的规则来应用于每个场景,就像上面列出的那样,对于 DMZ 机器来说是一个很好的基准,但在典型的 LAN 上会带来一些挑战。

此外,我肯定会建议向 martians、出站丢弃、入站丢弃连接等添加日志记录。这对于故障排除至关重要,并且对于您的 SIEM 来说可能是更有用的数据。

对于通过 ppp 直接连接到 Internet 的客户端 PC,以下规则集是一个好的开始:

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -j REJECT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
ip6tables -A INPUT -j REJECT
  1. 它允许内部本地接口上的所有内容。
  2. 它允许任何作为您发送的数据包的答案的数据包。这包括 TCP 连接中的数据包、对 UDP 数据包(例如小型 DNS 查询)的回答。对于旧式未加密的 FTP 协议,这包括数据连接,假设加载了 ip_conntrack_ftp
  3. 拒绝所有从外部打开 tcp 连接的尝试
  4. 拒绝所有初始(无应答)udp 数据包。

或者,您可以在最后两条规则中使用 -j DROP。有关此主题的讨论,请参阅Reject IP packet with an ICMP error, or just drop them?

因此,为了详细说明您的问题,这是我一直在运行的问题(我将使用您的示例和注释,因为自从 IPCHAINS 多年前去世以来,我的几乎没有对网络过滤器进行的评论。)

这可能适用于内部系统,但您通常会花时间为未考虑的新应用程序配置 iptables。我还删除了我的 SSH 规则,但这是您会看到的非常标准的规则(在许多配置中,您会看到唯一允许输入的规则。)

###############
# VARIABLE DEFINITIONS
IPTABLES=/sbin/iptables

#Your DHCP Server for input of ICMP packets
DHCPSERVER=127.0.0.1
PUBIF=eth0

# KERNEL PARAMETER CONFIGURATION
#
# DROP ICMP ECHO-REQUEST MESSAGES SENT TO BROADCAST OR MULTICAST ADDRESSES
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#
# DONT ACCEPT ICMP REDIRECT MESSAGES
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
#
# DONT SEND ICMP REDIRECT MESSAGES
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
#
# DROP SOURCE ROUTED PACKETS
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
#
# ENABLE TCP SYN COOKIE PROTECTION FROM SYN FLOODS
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
#
# ENABLE SOURCE ADDRESS SPOOFING PROTECTION
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# LOG PACKETS WITH IMPOSSIBLE ADDRESSES (DUE TO WRONG ROUTES) ON YOUR NETWORK
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

# DISABLE IPV4 FORWARDING
echo 0 > /proc/sys/net/ipv4/ip_forward
###############
$IPTABLES -F
###############
# LOGDROPPER
$IPTABLES -N LOGNDROP > /dev/null 2> /dev/null 
$IPTABLES -F LOGNDROP 
$IPTABLES -A LOGNDROP -j LOG --log-prefix "LOGNDROP: " 
$IPTABLES -A LOGNDROP -j DROP

###############
# LO allowance
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

###############
# Only bring what you need to survive
$IPTABLES -A INPUT -p icmp -s $DHCPSERVER -j ACCEPT
$IPTABLES -A INPUT -i $PUBIF -s $DHCPSERVER -p tcp --sport 68 --dport 67 -j ACCEPT
$IPTABLES -A INPUT -i $PUBIF -s $DHCPSERVER -p udp --sport 68 --dport 67 -j ACCEPT
###############
# INPUT
#
# DROP INVALID
$IPTABLES -A INPUT -m state --state INVALID -j LOGNDROP

# ALLOW ONLY ESTABLISHED, RELATED
$IPTABLES -A INPUT -p tcp -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p udp -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT

# DROP INVALID SYN PACKETS
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j LOGNDROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOGNDROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOGNDROP

# MAKE SURE NEW INCOMING TCP CONNECTIONS ARE SYN PACKETS; OTHERWISE WE NEED TO DROP THEM
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOGNDROP

# DROP PACKETS WITH INCOMING FRAGMENTS. THIS ATTACK RESULT INTO LINUX SERVER PANIC SUCH DATA LOSS
$IPTABLES -A INPUT -f -j LOGNDROP

# DROP INCOMING MALFORMED XMAS PACKETS
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j LOGNDROP

# DROP INCOMING MALFORMED NULL PACKETS
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j LOGNDROP

###############
# OUTPUT

# DROP INVALID
$IPTABLES -A OUTPUT -m state --state INVALID -j LOGNDROP

# DROP INVALID SYN PACKETS
$IPTABLES -A OUTPUT -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j LOGNDROP
$IPTABLES -A OUTPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOGNDROP
$IPTABLES -A OUTPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOGNDROP

# DROP PACKETS WITH OUTGOING FRAGMENTS. THIS ATTACK RESULT INTO LINUX SERVER PANIC SUCH DATA LOSS
$IPTABLES -A OUTPUT -f -j LOGNDROP

# DROP OUTGOING MALFORMED XMAS PACKETS
$IPTABLES -A OUTPUT -p tcp --tcp-flags ALL ALL -j LOGNDROP

# DROP OUTGOING MALFORMED NULL PACKETS
$IPTABLES -A OUTPUT -p tcp --tcp-flags ALL NONE -j LOGNDROP

$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -A INPUT -j LOGNDROP
$IPTABLES -A FORWARD -j LOGNDROP

如果您的网络嘈杂,或者您有很多事情要做,这将很快填满您的日志量。但是我很偏执,如果他们创建了不必要的嘈杂配置,也会破坏人们的排骨。