Коллеги, добрый день.
Есть задача по предоставлению отдельного внешнего ip адреса для каждой отдельной виртуальной машины в локальной сети через NAT.
Т.е. конкретно:
192.168.77.40 -> NAT -> 29.15.19.178
192.168.77.41 -> NAT -> 29.15.19.179
192.168.77.42 -> NAT -> 29.15.19.180
.......
192.168.77.49 -> NAT -> 115.64.12.142
Машина которая раздает интернет: ubuntu 20.04 LTS Клиенты: виртуальные машины c Windows 10
Решили делать именно так, потому что прописывать внешние IP адреса на Windows совсем не вариант, поддерживать брандмаузер на Windows хлопотнее намного, она не для этого.
На самой машине gateway с ubuntu интернет настроен корректно, проверял вот так:
curl --interface 29.15.19.179 https://ifconfig.me
29.15.19.179
Если с каждого IP делать запросы curl-ом, то IP адрес отображается верно. И с интернета каждый из IP адресов пингуется.
IP адреса 2 провайдера выдают как Static IP с маской 29.
IP адреса настроены через netplan. Конфиг под катом. ens18 - локальная сеть ens19 - Провайдер 1 ens20 - провайдер 2
# This is the network config written by 'subiquity'
network:
version: 2
ethernets:
ens18:
dhcp4: no
addresses:
- 192.168.77.28/24
routes:
- to: default
via: 192.168.77.1
metric: 150
nameservers:
addresses: [192.168.77.1,192.168.77.251,192.168.77.252]
ens19:
dhcp4: no
addresses:
- 29.15.19.178/29
- 29.15.19.179/29
- 29.15.19.181/29
- 29.15.19.182/29
nameservers:
addresses: [77.88.8.8,77.88.8.1,1.1.1.1]
routes:
- to: default
via: 29.15.19.177
metric: 100
ens20:
dhcp4: no
addresses:
- 115.64.12.138/29
- 115.64.12.139/29
- 115.64.12.140/29
- 115.64.12.141/29
- 115.64.12.142/29
nameservers:
addresses: [77.88.8.8,77.88.8.1,1.1.1.1]
routes:
- to: default
via: 115.64.12.137
metric: 110
Вывод ip a под катом.
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether d6:56:70:4c:c5:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.77.28/24 brd 192.168.77.255 scope global ens18
valid_lft forever preferred_lft forever
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether c6:f5:ee:cb:c6:f3 brd ff:ff:ff:ff:ff:ff
inet 29.15.19.178/29 brd 29.15.19.183 scope global ens19
valid_lft forever preferred_lft forever
inet 29.15.19.179/29 brd 29.15.19.183 scope global secondary ens19
valid_lft forever preferred_lft forever
inet 29.15.19.181/29 brd 29.15.19.183 scope global secondary ens19
valid_lft forever preferred_lft forever
inet 29.15.19.182/29 brd 29.15.19.183 scope global secondary ens19
valid_lft forever preferred_lft forever
4: ens20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 06:e1:2a:b1:84:ab brd ff:ff:ff:ff:ff:ff
inet 115.64.12.138/29 brd 115.64.12.143 scope global ens20
valid_lft forever preferred_lft forever
inet 115.64.12.139/29 brd 115.64.12.143 scope global secondary ens20
valid_lft forever preferred_lft forever
inet 115.64.12.140/29 brd 115.64.12.143 scope global secondary ens20
valid_lft forever preferred_lft forever
inet 115.64.12.141/29 brd 115.64.12.143 scope global secondary ens20
valid_lft forever preferred_lft forever
inet 115.64.12.142/29 brd 115.64.12.143 scope global secondary ens20
valid_lft forever preferred_lft forever
Вывод sysctl под катом. net.ipv4.ip_forward = 1 включен.
sysctl -p
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Вывод iptables -L -n -v
root@socks5:~# iptables -L -n -v
Chain INPUT (policy DROP 290K packets, 16M bytes)
pkts bytes target prot opt in out source destination
21969 2383K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2687K 3426M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
145K 5436K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 ctstate NEW
195K 56M ACCEPT all -- ens18 * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 43937 packets, 2312K bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3064K packets, 3410M bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER-USER (0 references)
pkts bytes target prot opt in out source destination
Вывод iptables -t nat -L -n -v
root@socks5:~# iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 696K packets, 86M bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 167K packets, 8641K bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 45411 packets, 2962K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 54303 packets, 3430K bytes)
pkts bytes target prot opt in out source destination
1 52 SNAT all -- * ens20 0.0.0.0/0 0.0.0.0/0 to:115.64.12.138
Собственно проблема заключается в следующем, правило SNAT почему-то не работает.
iptables -t nat -A POSTROUTING -o ens20 -j SNAT --to-source 115.64.12.138