Подумайте о следующем:
WAN IP1: aaa.aaa.aaa.aaa/23
WAN IP2: bbb.bbb.bbb.bbb/25
LAN Subnet: 10.3.0.0/24
ОБА WAN-адреса были направлены на сервер Linux, и сервер Linux доступен по обоим адресам. Я хочу направить bbb.bbb.bbb.bbb на другой хост через интерфейс локальной сети (10.3.0.2).
INTERNET -- Linux Server
(aaa.aaa.aaa.aaa/23, bbb.bbb.bbb.bbb/25 ens3)
(10.3.0.1/24 tap0) -------- Router
(10.3.0.2/24 tap0)
INTERNET -- ISP NAT -- (xxx.xxx.xxx.xxx/xx eth0)
(172.16.1.0/24 br-lan)
Теперь я хочу направить bbb.bbb.bbb.bbb на мой маршрутизатор 10.3.0.2 через tap0 (bbb.bbb.bbb.bbb был адресом ens3). Так что мой маршрутизатор будет иметь публичный IP-адрес. Вот что я сделал:
ip addr del bbb.bbb.bbb.bbb/25 dev ens3 # remove from ens3
ip route add bbb.bbb.bbb.bbb dev tap0 # route it to tap0
График будет выглядеть так:
INTERNET -- Linux Server
(aaa.aaa.aaa.aaa/23 ens3)
(10.3.0.1/24 tap0) -------- Router
(10.3.0.2/24, bbb.bbb.bbb.bbb tap0)
INTERNET -- ISP NAT -- (xxx.xxx.xxx.xxx/xx eth0)
(172.16.1.0/24 br-lan)
И, таблица маршрутизации на Linux Server:
% ip -4 route
default via aaa.aaa.aaa.1 dev ens3 onlink
10.3.0.0/24 via 10.3.0.1 dev tap0
10.3.0.1 dev ens3 scope link
aaa.aaa.aaa.0/23 dev ens3 proto kernel scope link src aaa.aaa.aaa.aaa
bbb.bbb.bbb.bbb dev tap0 scope link
169.254.0.0/16 dev ens3 scope link
И на своем маршрутизаторе я добавил адрес bbb.bbb.bbb.bbb
, и теперь я могу bbb.bbb.bbb.bbb
на сервере Linux.
Однако я не могу bbb.bbb.bbb.bbb
на других хостах. Итак, я попробовал:
iptables -t nat -A POSTROUTING -j MASQUERADE
С этим правилом я мог пинговать bbb.bbb.bbb.bbb
в интернете. И если я сделаю трассировку, я вижу, что bbb.bbb.bbb.bbb находится позади aaa.aaa.aaa.aaa, то есть:
...
10. ???
11. aaa.aaa.aaa.aaa 0.0% 16 45.3 43.6 43.1 45.5 0.8
12. bbb.bbb.bbb.bbb 0.0% 16 53.7 54.8 51.2 79.4 7.1
Однако мне нужен реальный исходный IP-адрес в конечной точке туннеля (10.3.0.2) - теперь я получаю весь трафик 10.3.0.1 на моем маршрутизаторе, потому что сервер Linux выполняет SNAT. Как мне это сделать?