我想知道这个防火墙设置中是否存在漏洞/缺陷。我想尽可能地锁定服务器,这样就不可能被黑客入侵。唯一运行的服务是 openvpn 和 ssh。
/bin/sh #!/bin/sh 复制代码 # # iptables 示例配置脚本 # # 清除 iptables 中的所有当前规则 # iptables -F # # 设置 INPUT、FORWARD 和 OUTPUT 链的默认策略 # iptables -P 输入删除 iptables -P 转发删除 iptables -P 输出删除 # # 允许 TCP 端口 8888 上的 SSH 连接 # iptables -A 输入 -i venet0 -p tcp --dport 8888 -m state --state NEW,ESTABLISHED -j 接受 iptables -A OUTPUT -o venet0 -p tcp --sport 8888 -m state --state ESTABLISHED -j ACCEPT # # 设置本地主机的访问权限 # iptables -A 输入 -i lo -j 接受 # # 接受 1194 上的连接,以便客户端进行 VPN 访问 # iptables -A 输入 -i venet0 -p udp --dport 1194 -m state --state NEW,ESTABLISHED -j 接受 iptables -A OUTPUT -o venet0 -p udp --sport 1194 -m state --state ESTABLISHED -j ACCEPT # # 为 OpenVPN 隧道应用转发 # iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A 转发 -s 10.8.0.0/24 -j 接受 iptables -t nat -A POSTROUTING -o venet0 -j SNAT --to-source 69.147.244.199 iptables -A 转发 -j 拒绝 # # 启用转发 # echo 1 > /proc/sys/net/ipv4/ip_forward # # 列出规则 # iptables -L -v
答案1
不。没有防火墙完全地安全。只要有一个端口开放,您就容易受到攻击。
然而,在目前的情况下,这已经是尽可能安全了。
很高兴看到您在不同于标准端口上运行 SSH。
如果计算机连接到互联网,那么它就不可能 100% 不会被黑客入侵。如果 OpenVPN 或 SSH 存在漏洞,那么攻击者仍然可以通过这些方式获得访问权限。而且,防火墙的强度取决于通过防火墙的协议所使用的密码。
确保你的密码非常强。更好的办法是 - 不要只依赖密码,而要依赖密码和密钥的组合,这样如果有人真的得到了你的密码,这对他们也没什么用。也许可以限制你允许连接到 SSH 和 OpenVPN 的地方 - 阻止来自中国、朝鲜等地的任何连接。
答案2
您可能希望限制可以访问 ssh(可能还有 openvpn)的 IP 范围。确保至少添加一个范围,即使提供商切换了您的 IP 来源子网,您也知道可以访问该范围。如果您有另一台服务器,请添加其 IP。您甚至可以考虑仅允许从这样的跳转主机进行 ssh。
答案3
关键是,您没有完美的安全性,因为系统的安全性取决于其最薄弱的组件。如果 ssh 和/或 openvpn 可以被破解,那么有人可以通过这些方式侵入您的服务器,如果 netfilter 代码有问题,您的数据包可能会漏掉。此外,如果 openSSH 和/或 openVPN 使用的加密太弱(已知各种密码和哈希算法都很弱),连接也可能受到攻击。
另外,您的防火墙设置不完整,需要改进。首先,您不必将 OUTPUT 设置为 DROP,因为这可以为您省去很多额外的工作(您不必为出站数据包添加策略)。
然后,我还将对防火墙规则进行彻底检查:
- 放弃
-m state --state xxx
处理 SSH 的规则中的匹配,因为它们是不必要的(这与规则直接接受任何相关数据包是一样的,尽管由于匹配产生的开销而速度会稍微慢一些)。 - 放弃
-m state --state xxx
处理 openVPN 的规则中的匹配。由于使用了 UDP(无连接协议),匹配甚至不起作用。 - 如果要保留 OUTPUT 的默认 DROP 策略,请确保在 OUTPUT 链上免除环回设备,以便内部服务能够发送数据包。否则它们的传输也会被阻止。
- 您的 FORWARD 部分需要改进:您可能已经为通过 openVPN 隧道到达的数据包打开了出路,但返回的路仍然被阻止。此外,由于匹配,只允许 tcp 流量返回
-m state --state ESTABLISHED,RELATED
,但 UDP 不会通过隧道发送回来。 - 如果您想通过 openVPN 访问您的服务器,您需要添加适当的规则来处理该流量。
此外,如果您想要进一步提高安全性,请重新安装 openSSH 以使用公钥身份验证(确保禁用任何需要用户名/密码的身份验证方案)并使用自动黑名单设置 iptables:
iptables -N SSH
iptables -N SSH_ABL
iptables -A SSH -m recent --name SSH_ABL --update --seconds 7200 -j DROP
iptables -A SSH -m recent --name SSH --rcheck --seconds 600 --hitcount 3 -j SSH_ABL
iptables -A SSH_ABL -m recent --name SSH_ABL --set -j LOG --log-level warning --log-prefix "ABL: +SSH: "
iptables -A SSH_ABL -j DROP
iptables -A SSH -m recent --name SSH --rcheck --seconds 10 -j LOG --log-level warning --log-prefix "SSH-RATE: "
iptables -A SSH -m recent --name SSH --update --seconds 10 -j REJECT --reject-with icmp-admin-prohibited
iptables -A SSH -m recent --name SSH_ABL --remove -j LOG --log-level warning --log-prefix "ABL: -SSH: "
iptables -A SSH -m recent --name SSH --set -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport <ssh-port> -m conntrack --ctstate NEW -j SSH
–– 来源不明
然后确保不要直接接受任何用于 SSH 的新数据包,而是将它们引导至 SSH 链。这可以防止对 SSH 进行暴力攻击。
最好将接受 ESTABLISHED TCP 连接数据包的规则提前放入规则集中,这样可以快速到达,并且您不会在处理这些数据包上浪费太多时间。然后,您只需插入处理 NEW TCP 连接的规则(它们可以放在链的后面,因为它们不会对您造成太大的惩罚,因为它们只会在 TCP 连接的 SYN 数据包上命中)。还要确保摆脱 OUTPUT 链的默认 DROP 策略。这样,您的服务器就可以与 Internet 建立 TCP 连接,例如用于更新其系统。
您还需要做的是设置规则来接受由服务器发起的 UDP 流量的回复(通用或仅限于特定端口):
iptables -A INPUT -p udp -m conntrack --ctdir REPLY -j ACCEPT
或者
iptables -A INPUT -p udp --sport <portnum> -m conntrack --ctdir REPLY -j ACCEPT
这对于网络时间协议(UDP 端口 123)和 DNS(UDP 端口 53)可能是必要的。
您的防火墙规则应如下所示:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -N SSH
iptables -N SSH_ABL
iptables -A SSH -m recent --name SSH_ABL --update --seconds 7200 -j DROP
iptables -A SSH -m recent --name SSH --rcheck --seconds 600 --hitcount 3 -j SSH_ABL
iptables -A SSH_ABL -m recent --name SSH_ABL --set -j LOG --log-level warning --log-prefix "ABL: +SSH: "
iptables -A SSH_ABL -j DROP
iptables -A SSH -m recent --name SSH --rcheck --seconds 10 -j LOG --log-level warning --log-prefix "SSH-RATE: "
iptables -A SSH -m recent --name SSH --update --seconds 10 -j REJECT --reject-with icmp-admin-prohibited
iptables -A SSH -m recent --name SSH_ABL --remove -j LOG --log-level warning --log-prefix "ABL: -SSH: "
iptables -A SSH -m recent --name SSH --set -j ACCEPT
iptables -t raw -A PREROUTING -i lo -j CT --notrack
iptables -t raw -A OUTPUT -o lo -j CT --notrack
iptables -A INPUT -p tcp -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -p tcp -m tcp ! --tcp-flags SYN,ACK,FIN,RST SYN -m conntrack --ctstate NEW -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 8888 -m conntrack --ctstate NEW -j SSH
iptables -A INPUT -p udp -m multiport --sports 53,123 -m conntrack --ctdir REPLY -j ACCEPT
iptables -A INPUT -i venet0 -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i venet0 -p icmp --icmp-type 3/4 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -i venet0 -p tcp -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -i venet0 -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i venet0 -p icmp -m conntrack --ctdir REPLY -j ACCEPT
iptables -A FORWARD -i venet0 -p udp -m conntrack --ctdir REPLY -j ACCEPT
# Replace the tun device identifier with the tun device set up by your openVPN.
iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT --reject-with icmp-net-unreachable
iptables -t nat -A POSTROUTING -o venet0 -s 69.147.244.199 -j ACCEPT
iptables -t nat -A POSTROUTING -o venet0 -j SNAT --to-source 69.147.244.199