Привет! Я пытаюсь настроить SNAT для своих виртуальных машин, но по какой-то причине у меня это не получается, и я толком не понимаю, почему. Вот как я настроил файл interfaces:
Code:
auto vmbr1
iface vmbr1 inet static
address 10.10.111.1
netmask 255.255.255.0
bridge-ports none
bridge-stp off
bridge-fd 0
post-up iptables -t nat -A POSTROUTING -s '10.10.111.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.111.0/24' -o vmbr0 -j MASQUERADE
На моей Windows-машине у меня выглядит так:
iptables, на мой взгляд, настроен правильно:
Code:
root@pve1:~# iptables -t nat -vnL --line-numbers
Chain PREROUTING (policy ACCEPT 22394 packets, 4195K bytes)
num pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 1138 packets, 70431 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1081 packets, 67494 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 1081 packets, 67494 bytes)
num pkts bytes target prot opt in out source destination
1 230 15281 MASQUERADE all -- * vmbr0 10.10.111.0/24 0.0.0.0/0
И vmbr0 — это основной интерфейс, выходящий в интернет:
Code:
root@pve1:~# ip a show vmbr0
3: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 70:71:bc:83:38:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.16/24 brd 192.168.111.255 scope global dynamic vmbr0
Странно то, что ответный трафик не доходит до виртуальной машины. Когда запускаю tcpdump на vmbr0 и пингую внешний сервер из ВМ, я вижу пакеты ответов, но сама машина их не получает. Я думал, что правило SNAT должно быть stateful, конечно, но что-то блокирует трафик, и я не понимаю, что именно.
Вот как выглядит ping с ВМ:
Code:
root@pve1:~# tcpdump -i vmbr0 icmp -nn -vvv
tcpdump: listening on vmbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:03:55.332153 IP (tos 0x0, ttl 127, id 13584, offset 0, flags [none], proto ICMP (1), length 60)
192.168.111.16 > public_ip: ICMP echo request, id 1, seq 38, length 40
12:03:55.335972 IP (tos 0x0, ttl 58, id 55309, offset 0, flags [none], proto ICMP (1), length 60)
public_ip > 192.168.111.16: ICMP echo reply, id 1, seq 38, length 40
12:04:00.029916 IP (tos 0x0, ttl 127, id 13585, offset 0, flags [none], proto ICMP (1), length 60)
192.168.111.16 > public_ip: ICMP echo request, id 1, seq 39, length 40
12:04:00.033527 IP (tos 0x0, ttl 58, id 55541, offset 0, flags [none], proto ICMP (1), length 60)
public_ip > 192.168.111.16: ICMP echo reply, id 1, seq 39, length 40
12:04:05.029182 IP (tos 0x0, ttl 127, id 13586, offset 0, flags [none], proto ICMP (1), length 60)
Есть идеи, как можно дальше искать причину? Спасибо!
P.S. Забыл сказать, что ipv4 forwarding тоже включён:
Code:
root@pve1:~# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
Code:
auto vmbr1
iface vmbr1 inet static
address 10.10.111.1
netmask 255.255.255.0
bridge-ports none
bridge-stp off
bridge-fd 0
post-up iptables -t nat -A POSTROUTING -s '10.10.111.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.111.0/24' -o vmbr0 -j MASQUERADE
На моей Windows-машине у меня выглядит так:
iptables, на мой взгляд, настроен правильно:
Code:
root@pve1:~# iptables -t nat -vnL --line-numbers
Chain PREROUTING (policy ACCEPT 22394 packets, 4195K bytes)
num pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 1138 packets, 70431 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1081 packets, 67494 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 1081 packets, 67494 bytes)
num pkts bytes target prot opt in out source destination
1 230 15281 MASQUERADE all -- * vmbr0 10.10.111.0/24 0.0.0.0/0
И vmbr0 — это основной интерфейс, выходящий в интернет:
Code:
root@pve1:~# ip a show vmbr0
3: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 70:71:bc:83:38:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.16/24 brd 192.168.111.255 scope global dynamic vmbr0
Странно то, что ответный трафик не доходит до виртуальной машины. Когда запускаю tcpdump на vmbr0 и пингую внешний сервер из ВМ, я вижу пакеты ответов, но сама машина их не получает. Я думал, что правило SNAT должно быть stateful, конечно, но что-то блокирует трафик, и я не понимаю, что именно.
Вот как выглядит ping с ВМ:
Code:
root@pve1:~# tcpdump -i vmbr0 icmp -nn -vvv
tcpdump: listening on vmbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:03:55.332153 IP (tos 0x0, ttl 127, id 13584, offset 0, flags [none], proto ICMP (1), length 60)
192.168.111.16 > public_ip: ICMP echo request, id 1, seq 38, length 40
12:03:55.335972 IP (tos 0x0, ttl 58, id 55309, offset 0, flags [none], proto ICMP (1), length 60)
public_ip > 192.168.111.16: ICMP echo reply, id 1, seq 38, length 40
12:04:00.029916 IP (tos 0x0, ttl 127, id 13585, offset 0, flags [none], proto ICMP (1), length 60)
192.168.111.16 > public_ip: ICMP echo request, id 1, seq 39, length 40
12:04:00.033527 IP (tos 0x0, ttl 58, id 55541, offset 0, flags [none], proto ICMP (1), length 60)
public_ip > 192.168.111.16: ICMP echo reply, id 1, seq 39, length 40
12:04:05.029182 IP (tos 0x0, ttl 127, id 13586, offset 0, flags [none], proto ICMP (1), length 60)
Есть идеи, как можно дальше искать причину? Спасибо!
P.S. Забыл сказать, что ipv4 forwarding тоже включён:
Code:
root@pve1:~# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
