-1

Подумайте о следующем:

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. Как мне это сделать?

2 ответа2

2

Это немного запутанный вопрос, потому что команды, которые вы дали, не делают этого, ... Я хочу направить bbb.bbb.bbb.bbb на мой маршрутизатор 10.3.0.2 через tap0. Если я вас правильно понял, вы хотите, чтобы маршрутизатор проходил через сервер Linux для выхода в Интернет. Если это правильно, то это как его получить, начиная с конфигурации на первом рисунке, т.е. пренебрегая следующими командами.

  1. На сервере Linux включите пересылку IPv4, а затем выполните команду:

      iptables -t -nat -A POSTROUTING -o eth0 -j MASQUERADE
      ip route add 172.16.0.0/24 via 10.3.0.2 dev tap0
    
  2. На маршрутизаторе, где я предполагаю, пересылка IPv4 включена по умолчанию:

    ip route del default
    ip route add default via 10.3.0.1 dev tap0 
    iptables -A INPUT -s 10.8.3.0.1 -j ACCEPT
    

Преимущество этого состоит в том, что он выполняет один уровень NATting на сервере Linux, а затем все заботится о маршрутизации. Если вы хотите, чтобы клиенты локальной сети находили сервер Linux по имени (скажем, он называется LS), добавьте следующую строку:

10.3.0.2    LS

к файлу /etc/hosts маршрутизатора: нет необходимости настраивать DNS-сервер для такой маленькой необходимости.

Тем не менее, это не составляет ... Так что мой маршрутизатор будет иметь публичный IP-адрес, потому что публичный IP-адрес принадлежит серверу Linux. Если кто-то попытается связаться с aaa.aaa.aaa.aaa, это будет сервер Linux, который должен будет ответить. Единственное исключение, которое вы можете предоставить, - это переадресация портов, что означает, что все сообщения на данном порту будут передаваться на маршрутизатор, но вы не можете передать все сообщения на всех портах на маршрутизатор (что на самом деле означает ... Так что мой роутер будет иметь публичный IP-адрес). Если, конечно, ваш сервер Linux не имеет 2 IP-адресов, в этом случае вы можете зарезервировать один для маршрутизатора, а другой - для сервера Linux.

0

Просто понял - это так просто, и я не знаю, почему я не заметил этого раньше.

Так как мой шлюз по умолчанию на маршрутизаторе НЕ является сервером туннеля - маршрутизатор пытается ответить на пакет, поступающий от tun0 через шлюз eth0. При использовании SNAT адрес источника становится 10.3.0.1 - Маршрутизатор знает, куда отправить их обратно, и поэтому он работает с MASQUERADE.

Итак, на маршрутизаторе создайте новую таблицу маршрутизации и установите для ее шлюза по умолчанию значение tun0. Затем найдите исходный IP-адрес bbb.bbb.bbb.bbb в этой таблице.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .