我希望 ufw 阻止我的外部接口(enp6s0)上的所有内容,但允许我的内部接口(br0、tap0)上的所有内容。
我在这方面遇到了很大的问题(尽管我设置了一条规则允许一切进入,但 ufw 还是阻止了 br0 上的东西),所以我将 ufw 设置为默认允许一切,然后开始为我想要阻止的接口添加例外,如下所示:
ufw deny in on enp6s0 to any port 67 proto udp
对于每个我不想被外部访问的端口,我都设置了几个这样的端口。但这个解决方案让我感到不安:基本上我把所有东西都打开了,只是没有监听。迟早我会忘记保护一些东西。
所以我反过来想创建一组规则,允许某些端口但拒绝其他所有端口,如下所示:
ufw insert 1 allow in on enp6s0 from any port ssh proto tcp
ufw insert 2 allow in on enp6s0 from any port http proto tcp
ufw insert 3 deny in on enp6s0 from any port 30:65535 proto tcp
最后一个命令故意保持端口 22 开放,这样我就可以测试规则的有效性,而不必担心丢失与服务器的 ssh 连接。
但是,添加拒绝规则会立即阻止整个服务器。所有内容,而不仅仅是 30:65535。nmap 认为它已关闭。幸运的是,我现有的 ssh 会话仍处于活动状态,因此我可以删除该规则。
现在,我知道我不是某些 ufw 大师或类似的人,但这确实让我(再次)震惊:我似乎不知道它是如何工作的。
有人能告诉我关于拒绝规则的信息吗?我需要如何设置它?
最终编辑: 事实证明,卸载并重新安装 ufw 可以解决问题。似乎我在某个时候弄乱了某些设置,导致了所有无法解释的行为。
编辑:我的网络配置
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
# Our additions start here:
# tap interface (VMs will use this one)
auto tap0
iface tap0 inet manual
pre-up ip tuntap add tap0 mode tap user root
up ip link set dev tap0 up
post-down ip link del dev tap0
# bridge
auto br0
iface br0 inet static
bridge_ports tap0
address 192.168.100.1
netmask 255.255.255.0
broadcast 192.168.100.255
iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N ufw-after-forward
-N ufw-after-input
-N ufw-after-logging-forward
-N ufw-after-logging-input
-N ufw-after-logging-output
-N ufw-after-output
-N ufw-before-forward
-N ufw-before-input
-N ufw-before-logging-forward
-N ufw-before-logging-input
-N ufw-before-logging-output
-N ufw-before-output
-N ufw-logging-allow
-N ufw-logging-deny
-N ufw-not-local
-N ufw-reject-forward
-N ufw-reject-input
-N ufw-reject-output
-N ufw-skip-to-policy-forward
-N ufw-skip-to-policy-input
-N ufw-skip-to-policy-output
-N ufw-track-forward
-N ufw-track-input
-N ufw-track-output
-N ufw-user-forward
-N ufw-user-input
-N ufw-user-limit
-N ufw-user-limit-accept
-N ufw-user-logging-forward
-N ufw-user-logging-input
-N ufw-user-logging-output
-N ufw-user-output
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -j ufw-track-forward
-A FORWARD -i br0 -o enp6s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i enp6s0 -o br0 -j ACCEPT
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
-A ufw-after-input -p udp -m udp --dport 137 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 138 -j ufw-skip-to-policy-input
-A ufw-after-input -p tcp -m tcp --dport 139 -j ufw-skip-to-policy-input
-A ufw-after-input -p tcp -m tcp --dport 445 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 67 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 68 -j ufw-skip-to-policy-input
-A ufw-after-input -m addrtype --dst-type BROADCAST -j ufw-skip-to-policy-input
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw-before-forward -j ufw-user-forward
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
-A ufw-before-input -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw-before-input -p udp -m udp --sport 67 --dport 68 -j ACCEPT
-A ufw-before-input -j ufw-not-local
-A ufw-before-input -d 224.0.0.251/32 -p udp -m udp --dport 5353 -j ACCEPT
-A ufw-before-input -d 239.255.255.250/32 -p udp -m udp --dport 1900 -j ACCEPT
-A ufw-before-input -j ufw-user-input
-A ufw-before-output -o lo -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -j ufw-user-output
-A ufw-logging-allow -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW ALLOW] "
-A ufw-logging-deny -m conntrack --ctstate INVALID -m limit --limit 3/min --limit-burst 10 -j RETURN
-A ufw-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP
-A ufw-skip-to-policy-forward -j ACCEPT
-A ufw-skip-to-policy-input -j ACCEPT
-A ufw-skip-to-policy-output -j ACCEPT
-A ufw-track-forward -p tcp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-track-forward -p udp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-track-input -p tcp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-track-input -p udp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-track-output -p tcp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-track-output -p udp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-user-input -i enp6s0 -p tcp -m tcp --sport 22 -j ACCEPT
-A ufw-user-input -i enp6s0 -p tcp -m tcp --sport 80 -j ACCEPT
-A ufw-user-input -i enp6s0 -p tcp -m tcp --sport 443 -j ACCEPT
-A ufw-user-input -i enp6s0 -p tcp -m multiport --dports 2000:2100 -j DROP
-A ufw-user-input -i enp6s0 -p tcp -m tcp --dport 53 -j DROP
-A ufw-user-input -i enp6s0 -p udp -m udp --dport 53 -j DROP
-A ufw-user-input -i enp6s0 -p udp -m udp --dport 67 -j DROP
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT
答案1
您应该重置ufw
为默认值并重新开始:
sudo ufw 重置
这将禁用ufw
并重置ufw
其安装默认值,这意味着
- deny all incoming and
- allow all outgoing connections.
然后只需添加一些规则以允许您要使用的应用程序的传入连接:
sudo ufw 允许 ssh sudo 允许 http
现在您可以启用ufw
sudo ufw 启用
现在正在运行,并配置为拒绝除和ufw
所需端口的连接之外的所有传入连接。始终允许传出连接,这通常是所需的。ssh
http
您不需要deny
像在配置中那样为传入连接添加规则:
拒绝从任何端口 30:65535 proto tcp 进入 enp6s0`
此规则是不必要的,默认情况下拒绝传入连接。
如果您想要将传出连接配置得更加严格,您可以添加deny
-rules 而不是将传出连接默认为deny
,这样可以使规则更简单,大多数情况下您希望允许传出连接。Deny
传出连接的 -rules 必须经过仔细设计。
sudo ufw 拒绝 6773
例如,拒绝端口 6773 上的所有传出连接,任何需要使用该端口的应用程序将无法再正常工作。
接口
使用多个接口会使事情变得有点复杂。默认值(拒绝进入,允许离开)适用于所有接口,未指定接口的规则也将适用于所有接口。您希望接口的行为有所不同,因此您必须为每个接口添加规则。
上面部分中的规则需要进行调整以匹配您的外部接口(您问题中的规则看起来像那样)。
所有接口默认允许传出连接,但不允许传入连接,因此您只需allow in
为每个内部接口添加一个规则:
sudo 允许任何“接口”进入
规则顺序
另一个重要的事情是规则顺序。当一个包到达接口时,ufw
将逐一检查规则。只要有规则匹配,就会应用该规则,并拒绝、拒绝或允许该包。此时尚未检查的其余规则则不会使用。对于您来说,我认为规则顺序没有太大相关性,但我们始终要提醒您,规则顺序可能很重要。
答案2
如果你不太了解 TCP/IP 的工作原理,但仍想保护你的计算机,请先使用gufw
然后你有一个 GUI 前端来ufw
:
sudo apt install gufw
然后如果使用 Unity 则转到 dash 并输入gufw
或转到System Administration Firewall configuration,将显示以下 UI:
开始时,请放松,仅使用Home和配置文件,当您想在这两者之间执行某些操作时Public使用。Office
在Home配置文件中,将所有内容保持打开状态(=禁用),因为您应该已经在 NAT 防火墙后面(您的路由器就是 NAT 防火墙),因此在家里不需要保护任何东西。
在Public配置文件中,单击滑块启用防火墙Status,然后使用举报规则仅限最初几天:
然后进入终端并查看gufw
为您创建了什么样的规则ufw
:
sudo ufw status
列表Report显示您当前的所有应用程序,单击一个应用程序行并单击其下方,+您将能够轻松地为该应用程序添加规则。基本上,该屏幕是netstat
和ufw
在一个屏幕中的组合。
然后,你会发现,你不需要添加额外的规则来在公共场所阻止传入连接:只需允许你需要启用的应用程序。
您使用的越多gufw
,并且您越关注它ufw
生成的防火墙规则,您就会发现,过一段时间您就会只使用防火墙ufw
而忘记所有gufw
高级设置。