我正在尝试将 ubuntu server 22.04(虚拟化)设置为具有一个 wan 接口(ens18)和多个 lan 接口 ens19:ens23 和 ens1 的路由器。
以下是我想要实现的目标:
- 允许 ens19:ens21 访问互联网
- 允许 ens23 访问互联网
- 允许 ens22 访问互联网,但仅限于工作日的工作时间
- 拒绝 ens1 访问互联网。
- 允许所有 lan 接口,包括 ens1 访问 ens19
- 阻止除 ens19 访问之外的局域网之间的访问
这是我面临的问题。出于某种原因,当我将默认转发规则设置为 DROP 时,客户端网络根本无法访问互联网,也无法访问 ens19。我尝试将默认转发规则设置为接受,然后我就可以从每个网络完全访问互联网。
我认为我在前向链中遗漏了一些规则,或者使用了不正确的规则。任何建设性的意见都非常感谢。
以下是我用于设置 iptables 的命令:
#flush existing config
sudo iptables -F
sudo iptables -X
#temporary rules for configuration purposes
sudo iptables -A INPUT -i ens18 -p tcp --dport 22 -j ACCEPT
sudo iptables -A FORWARD -i ens18 -o ens19 -p tcp --dport 3306 -j ACCEPT
sudo iptables -A FORWARD -i ens18 -o ens19 -p tcp --dport 33060 -j ACCEPT
sudo iptables -A FORWARD -i ens18 -o ens19 -p tcp --dport 80 -j ACCEPT
##set default policies
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
#allow loopback
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
#allowe established and related incoming traffic
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#Allow access to WAN
sudo iptables -A FORWARD -i ens19 -o ens18 -j ACCEPT
sudo iptables -A FORWARD -i ens20:ens21 -o ens18 -j ACCEPT
sudo iptables -A FORWARD -i ens22 -o ens18 -m time --timestart $(date -u -d @$(date "+%s" -d "07:00") +%H:%M) --timestop $(date -u -d @$(date "+%s" -d "20:00") +%H:%M) --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
sudo iptables -A FORWARD -i ens23 -o ens18 -j ACCEPT
#Allow Access from LAN to DMZ
sudo iptables -A FORWARD -i ens20:ens23 -o ens19 -j ACCEPT
sudo iptables -A FORWARD -i ens1 -o ens19 -j ACCEPT
#deny access to WAN from the lan connected to ens1
sudo iptables -A FORWARD -i ens1 -o ens18 -j DROP
#deny communication between interfaces ens20:ens23, ens1
sudo iptables -A FORWARD -i ens20 -o ens21 -j DROP
sudo iptables -A FORWARD -i ens20 -o ens22 -j DROP
sudo iptables -A FORWARD -i ens20 -o ens23 -j DROP
sudo iptables -A FORWARD -i ens21 -o ens20 -j DROP
sudo iptables -A FORWARD -i ens21 -o ens22 -j DROP
sudo iptables -A FORWARD -i ens21 -o ens23 -j DROP
sudo iptables -A FORWARD -i ens22 -o ens20 -j DROP
sudo iptables -A FORWARD -i ens22 -o ens21 -j DROP
sudo iptables -A FORWARD -i ens22 -o ens23 -j DROP
sudo iptables -A FORWARD -i ens23 -o ens20 -j DROP
sudo iptables -A FORWARD -i ens23 -o ens21 -j DROP
sudo iptables -A FORWARD -i ens23 -o ens22 -j DROP
sudo iptables -A FORWARD -i ens1 -o ens20 -j DROP
sudo iptables -A FORWARD -i ens1 -o ens21 -j DROP
sudo iptables -A FORWARD -i ens1 -o ens22 -j DROP
sudo iptables -A FORWARD -i ens1 -o ens23 -j DROP
#enable masquerading on port ens18
sudo iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
##save and reload
sudo netfilter-persistent save
sudo netfilter-persistent reload
以下是 iptables -nvL 的输出:
henrik@server0router:~$ sudo iptables -nvL
Chain INPUT (policy DROP 3 packets, 939 bytes)
pkts bytes target prot opt in out source destination
104 7488 ACCEPT tcp -- ens18 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
Chain FORWARD (policy DROP 58 packets, 4640 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- ens18 ens19 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
0 0 ACCEPT tcp -- ens18 ens19 0.0.0.0/0 0.0.0.0/0 tcp dpt:33060
0 0 ACCEPT tcp -- ens18 ens19 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- ens19 ens18 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ens20:ens21 ens18 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ens22 ens18 0.0.0.0/0 0.0.0.0/0 TIME from 05:00:00 to 18:00:00 on Mon,Tue,Wed,Thu,Fri UTC
0 0 ACCEPT all -- ens23 ens18 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ens20:ens23 ens19 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ens1 ens19 0.0.0.0/0 0.0.0.0/0
6 450 DROP all -- ens1 ens18 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens20 ens21 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens20 ens22 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens20 ens23 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens21 ens20 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens21 ens22 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens21 ens23 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens22 ens20 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens22 ens21 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens22 ens23 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens23 ens20 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens23 ens21 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens23 ens22 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens1 ens20 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens1 ens21 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens1 ens22 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- ens1 ens23 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 3 packets, 984 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
54 5744 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate ESTABLISHED
henrik@server0router:~$ ^C
答案1
好的,我想我找到了解决方案。
需要澄清的是,我的设置是几个在 Proxmox VE 上作为 Qemu/KVM 运行的 ubuntu 服务器,另外还有几个桌面虚拟机来模拟不同的网络客户端。
这些机器使用在 proxmox 中设置的网络桥接器将每个客户端和“server1”连接到“server0router”。这里的问题是,当在 proxmox 中向 VM 添加网络接口时,默认情况下会启用虚拟机管理程序中的防火墙功能,以允许在 Web 界面中为 VM 创建防火墙规则。
在 proxmox 中 server0router vm 的网络接口中取消选中“防火墙”复选框后,一切似乎都按照 VM 内设置的规则进行工作。
编辑:还必须切换到每个端口的单独规则,而不是使用 ens20:ens23,因为即使输入命令时没有出现错误,范围似乎也不起作用。