路由器虚拟机重启后,从属虚拟机无法 ping 8.8.8.8

路由器虚拟机重启后,从属虚拟机无法 ping 8.8.8.8

我在云端,我有一个虚拟机(主虚拟机),我将它转为其他虚拟机(从虚拟机)的路由器,以便它们可以访问互联网。为了回答这个问题,我们将主脚本称为 mr.sh,将在从虚拟机上运行的脚本称为 sr.sh。第一次运行这两个脚本后,我可以从从虚拟机 ping 通 8.8.8.8。但是当我重新启动主虚拟机,然后重新运行脚本时,我无法从从虚拟机 ping 通 8.8.8.8。我对从虚拟机使用了 traceroute 命令,这是输出:

 1  master (192.168.0.1)  0.521 ms  0.388 ms  0.364 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *

我尝试过:重新启动所有机器上的网络、刷新 IP 表并重新运行脚本、重新启动虚拟机并重试,但都无济于事。知道为什么会发生这种情况吗?如何解决这个问题?

sh先生:

#!/bin/bash
echo "Enabling ipv4 forwarding (cleaning old rules)"
# flushing old rules -- USE WITH CARE
iptables --flush
iptables --table nat --flush
# MASQUERADE each request form the inside to the outer world
iptables -t nat -A POSTROUTING -j MASQUERADE
# enable IPv4 packet forwarding in the kernel
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "Master is now operating as router" 

和sr.sh:

#!/bin/bash  
ENDPOINT_INTERFACE=$(cat /etc/hosts | grep master | awk '{print $1}')
route add default gw $ENDPOINT_INTERFACE
echo "Gateway now points to $ENDPOINT_INTERFACE"

答案1

您的 MASQUERADE 规则错误。它需要指定出站接口,否则它将尝试对两个方向的所有流量进行 NAT,从而导致连接完全失败。您需要指定出站接口:

iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE

答案2

似乎你错过了允许 FORWARD 规则

iptable我建议你不要运行单独的命令,而是使用类似 的命令iptables-restore /etc/firewall.conf。它会刷新你指定的表并一次加载所有规则。

内容为firewall.conf

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

-A POSTROUTING -o eth0 -j MASQUERADE

# Port forward
-A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination 1.2.3.5:80

COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state INVALID -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Local server filter rule
-A INPUT -p tcp -m tcp -s 1.2.3.4 --dport 22 -m state --state NEW -j ACCEPT

# Allow traffic forwarding
-A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -j ACCEPT

-A INPUT -p icmp -j ACCEPT
-A OUTPUT -j ACCEPT

COMMIT

答案3

首先,我要感谢 Michael Hampton 和 Marco 花时间回答我的问题。问题与我预想的完全不同,Docker 阻止了我的路由器 PC 上的软件包转发。所以我按照这篇文章https://docs.docker.com/network/iptables/#docker-on-a-router和这篇文章https://discuss.linuxcontainers.org/t/lxd-and-docker-firewall-redux-how-to-deal-with-forward-policy-set-to-drop/9953/3来解决我的问题。

相关内容