使用 IPTABLES 和 VBox 进行端口转发

使用 IPTABLES 和 VBox 进行端口转发

我在 Ubuntu 下正确配置 iptables 时遇到了一个小问题。但在此之前,让我先描述一下网络配置:

我使用的是 xDSL 线路,该线路以调制解调器+路由器+DHCP 为 192.168.1.0/24 子网提供服务。我的笔记本电脑和 PC 连接到此网络,分别获得地址 192.168.1.6 和 192.168.1.3。在 PC 上,我使用 VBox 和 2 台虚拟机(也都是 Ubuntu)运行 Ubuntu。PC 上的 vboxnet0 接口分配了 IP 10.10.10.1,各个虚拟机获得 10.10.10.10 和 10.10.10.11。VM1 运行 Apache 网络服务器以进行测试。

现在,从我的 PC (192.168.1.3),我可以通过浏览器中输入地址来访问位于 10.10.10.10 的 VM1 Apache 托管网站。没有任何问题。

但是,我希望能够从我的笔记本电脑(192.168.1.6)访问同一个网站,方法是在浏览器的地址栏中输入相同的 10.10.10.10。但是,这不起作用。由于某种原因,我无法通过网络。似乎 192.168.1.x 网络上的 IP 地址是未知的。如果有一种方法可以通过 iptables 以简单的方式配置它,那将是一个很好的开始。

现在,如果这一步可行,我还想配置一个更复杂的设置。使用 192.168.1.3 地址和正确的端口地址,我希望能够将特定的服务请求转发到正确的 VM 实例。例如,192.168.1.3:80 应该转到 VM1 并获取 Apache 托管的网站。192.168.1.3:4000(例如)应该转到 VM2 并在那里获取托管的 SFTP 服务。简而言之,我想在 PC 上执行目标端口特定的路由,以允许连接到 192.168.1.x 网络的计算机与在 10.10.10.x 网络中运行的 VM 之间进行双向通信。有没有使用 iptables 的简单解决方案?

这是我到目前为止编写的一个例子,但无法使转发正常工作。我确信这里有很多错误——这是我在 iptables 上度过的第一天。

clear
# cleaning Firewall Rules , change ACCEPT to DROP if you want to shield
# the server, then you open ports as you need
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Accepts all established inbound connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# opening INPUT ports (22,80,8080)
iptables -A INPUT --protocol tcp --dport 22 -j ACCEPT && echo "rule input 22 ok"
iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT && echo "rule input 80 ok"
iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT && echo "rule input 443 ok"
iptables -A INPUT --protocol tcp --dport 8080 -j ACCEPT && echo "rule input 8080 ok"

#allow Loopback and networks
iptables -A INPUT -i lo -j ACCEPT  && echo "rule 7 ok"
#Accept any input from 10.10.10.0 network in vboxnet0 interface
iptables -A INPUT -s 10.10.10.0/24  -i vboxnet0 -j ACCEPT  && echo "rule 8 ok"

#enable Port forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Opening PREROUTING - Filtering : this make the port forwarding trick.
# Forward as many ports you want to certain machines of the network to provide services such web server, ftp server, etc...
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 192.168.1.0/24 --dport 8080 -j DNAT --to 10.10.10.10:80  && echo "rule 9 ok"
#iptables -t nat -A PREROUTING -p tcp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53  && echo "rule 10 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53  && echo "rule 11 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 21 -j DNAT --to 10.10.10.16:21  && echo "rule 12 ok"

#Opening FORWARD ports for network services on vlan
iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 80 -j ACCEPT && echo "rule 13 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 21 -j ACCEPT  && echo "rule 14 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 68 -j ACCEPT  && echo "rule 15 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 22 -j ACCEPT  && echo "rule 16 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 53 -j ACCEPT && echo "Rule 17 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p udp --dport 53 -j ACCEPT && echo "Rule 18 ok"

# Opening POSTROUTING PROCESSES
# Netmasking is absolutelly necesary to protect vlan from attacks, only it hides their ip....
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE  && echo "rule 19 ok"

# Reject all other inbound - default deny unless explicitly allowed policy
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT

# test and display the rules if runs properly
iptables -L

感谢您的任何帮助

马立克

答案1

首先,您应该考虑在 VirtualBox 中使用桥接网络这种更简单的设置。这实际上会将虚拟机直接放在 LAN 上,因此它们将获得 192.168.1.0/24 地址,并且可以直接从 LAN 上的其他计算机访问它们。

您的 DNAT 规则看起来正确,但我怀疑它在 FORWARD 链中被阻止了。NAT 数据包仍然需要遍历 FORWARD 链,因此需要在那里接受它们,如下所示:

iptables --append FORWARD --in-interface eth1 --out-interface vboxnet0 --destination 10.10.10.10 --protocol tcp --dport 80 --jump ACCEPT

不过,我建议你在 NAT 规则生效期间默认将 FORWARD 链配置为 ACCEPT。一旦 NAT 生效,再开始限制 FORWARD 链。

相关内容