我有一个根服务器,它有 2 个静态 IP 地址,都连接到一个接口(eth0 和 eth0:1)。现在我需要将所有传入流量从一个 IP 地址重定向到同一台 PC 上的 VM。VM 在虚拟交换机内有自己的本地 IP 地址。(可以从“根计算机”访问它)。我已经与提供商谈过了,他承认使用 NATing 可以做到这一点,但是不允许给我更详细的说明。我已经尝试过:
iptables -t nat -A PREROUTING -p tcp -d 85.214.XXX.XXX -j DNAT --to-destination 192.168.122.58
iptables -t nat -A PREROUTING -i eth0:1 -j DNAT --to-destination 192.168.122.58
两种方法都行不通。虚拟机本身可以通过一个 IP 地址访问互联网。(虚拟机的 Ping 成功)。问题是,传入流量(例如 85.214.XXX.XXX:80)仍由“根计算机”处理,因此需要将其重定向到虚拟机。通过另一个 IP 地址(85.12.XXX.XXX:80)的请求不得重定向。端口 80 只是一个示例端口。http 需要更多端口。
编辑1:使用第一个命令后,流量不会被“根服务器”处理,但也无法到达虚拟机。
编辑2:
ip -br 链接:
lo UNKNOWN 00:00:00:00:00:00 eth0 UP ac:1f:6b:21:ea:14 eth1 DOWN ac:1f:6b:21:ea:15 virbr0 UP 52:54:00:07:80:05 virbr0-nic DOWN 52:54:00:07:80:05 vnet0 UNKNOWN fe:00:a3:b0:56:10
Ip-br地址:
lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 81.169.XXX.XXX/32 85.214.XXX.XXX/32 fe80::ae1f:6bff:fe21:XXXX/64 eth1 DOWN virbr0 UP 192.168.122.1/24 virbr0-nic DOWN vnet0 UNKNOWN fe80::fc00:a3ff:feb0:5610/64
IP 路由:
default via 81.169.192.1 dev eth0 81.169.192.1 dev eth0 scope link 169.254.0.0/16 dev eth0 scope link metric 1000 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
IP 地址 -c:iptables-save -c
# Generated by iptables-save v1.6.0 on Tue Jun 26 21:12:21 2018 *nat :PREROUTING ACCEPT [77:5491] :INPUT ACCEPT [57:4459] :OUTPUT ACCEPT [26:1644] :POSTROUTING ACCEPT [26:1644] [36:1868] -A PREROUTING -d 85.214.XXX.XXX/32 -p tcp -j DNAT --to-destination 192.168.122.58 [326:23798] -A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN [0:0] -A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN [70:4104] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 [2384:181184] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 [1:84] -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE [4:240] -A POSTROUTING -d 192.168.122.58/32 -j SNAT --to-source 85.214.XXX.XXX COMMIT # Completed on Tue Jun 26 21:12:21 2018 # Generated by iptables-save v1.6.0 on Tue Jun 26 21:12:21 2018 *mangle :PREROUTING ACCEPT [8612376:1647699647] :INPUT ACCEPT [7968616:1098054721] :FORWARD ACCEPT [642923:549577951] :OUTPUT ACCEPT [7286018:1062313751] :POSTROUTING ACCEPT [7752855:1602990616] [363:121944] -A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill COMMIT # Completed on Tue Jun 26 21:12:21 2018 # Generated by iptables-save v1.6.0 on Tue Jun 26 21:12:21 2018 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] :f2b-plesk-modsecurity - [0:0] [82390:7025055] -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT [18:720] -A INPUT -p tcp -m tcp --dport 106 -j DROP [2488:104592] -A INPUT -p tcp -m tcp --dport 3306 -j DROP [153:6168] -A INPUT -p tcp -m tcp --dport 5432 -j DROP [9:360] -A INPUT -p tcp -m tcp --dport 9008 -j DROP [41:1784] -A INPUT -p tcp -m tcp --dport 9080 -j DROP [252:20165] -A INPUT -p udp -m udp --dport 137 -j DROP [10772:2676517] -A INPUT -p udp -m udp --dport 138 -j DROP [488:21600] -A INPUT -p tcp -m tcp --dport 139 -j DROP [849142:43736264] -A INPUT -p tcp -m tcp --dport 445 -j DROP [68:2856] -A INPUT -p udp -m udp --dport 1194 -j DROP [39259:2663130] -A INPUT -p udp -m udp --dport 53 -j DROP [15817:947524] -A INPUT -p tcp -m tcp --dport 53 -j DROP [974:36333] -A INPUT -p icmp -m icmp --icmp-type 8/0 -j ACCEPT [5763490:719804706] -A INPUT -j ACCEPT [327455:532369669] -A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT [145660:7917349] -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT [0:0] -A FORWARD -i virbr0 -o virbr0 -j ACCEPT [29309:1533140] -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable [0:0] -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable [0:0] -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT [249:11394] -A FORWARD -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset [3875:171296] -A FORWARD -m state --state INVALID -j DROP [0:0] -A FORWARD -i lo -o lo -j ACCEPT [582365:31456904] -A FORWARD -j DROP [363:121944] -A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT [12150865:2418557344] -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT [24:5299] -A OUTPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset [12746:706295] -A OUTPUT -m state --state INVALID -j DROP [494443:29667994] -A OUTPUT -o lo -j ACCEPT [408707:30248531] -A OUTPUT -j ACCEPT [68:6175] -A f2b-plesk-modsecurity -j RETURN COMMIT # Completed on Tue Jun 26 21:12:21 2018
在虚拟机上:
IP路由:
default via 192.168.122.1 dev ens3 169.254.0.0/16 dev ens3 scope link metric 1000 192.168.122.0/24 dev ens3 proto kernel scope link src 192.168.122.58
答案1
您的FORWARD
规则允许虚拟机发起的流量、传出和回复,规则如下:
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #reply traffic to the VM
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT #VM initiated
它们不允许的是传入流量,正如计数器的高值在下一条FORWARD
规则中暗示的那样:
[29309:1533140] -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
这对于安全性来说很好,但是您必须添加例外情况。
更新:重定向所有流量,而不仅仅是几个端口。
重定向本身:
iptables -t nat -I PREROUTING -d 85.214.XXX.XXX -j DNAT --to-destination 192.168.122.58
这将重定向所有协议(icmp,tcp,udp(可能还有其他)),您可以像最初写的那样添加-p tcp
以将其限制为 tcp。
您必须在FORWARD
链中启用重定向流量,因为一旦流量被DNAT
重定向,它就会被路由,因此将受FORWARD
链的约束(并且不再受INPUT
链的约束)。同时,为了防止任何本地路由滥用(例如由默认网关滥用),您可以DNAT
通过查询 conntrack 将其限制为仅重定向流量(在 mangle 表中标记数据包并在此处检查它们也可以):
iptables -I FORWARD -d 192.168.122.58 -m conntrack --ctstate DNAT -j ACCEPT
注意-I
。由于您正在与 VM 的提供商规则(可能是 virt-manager)竞争,因此您必须注意例外规则位于DROP
/REJECT
规则之前。理想情况下,它可以位于... RELATED,ESTABLISHED ...
规则之后,但您可以稍后处理。
还要注意,出于同样的原因(规则来得太晚),您的虚拟机的传出流量未使用其专用 IP,而是使用主机的 IP:规则SNAT
来得太晚,落后于通用MASQUERADE
规则。您必须将其插入为-I
and 而不是-A
too,直到您弄清楚如何将其与(可能?)virt-manager 集成。
而且,这条规则中也有一个错误,它应该使用-s
not -d
,如下所示:
iptables -t nat -I POSTROUTING -s 192.168.122.58/32 ! -d 192.168.122.0/24 -j SNAT --to-source 85.214.XXX.XXX
每当(可能?)virt-manager 重新插入其规则(重新启动等)时,您应该再次查看您的规则,看看一切是否仍然按照您想要的顺序进行。
解决 virt-manager 集成问题超出了本问答的范围。例如,请看这里: