我在云端,我有一个虚拟机(主虚拟机),我将它转为其他虚拟机(从虚拟机)的路由器,以便它们可以访问互联网。为了回答这个问题,我们将主脚本称为 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来解决我的问题。