Маршрутизация с использованием iproute2 после NAT

Маршрутизация с использованием iproute2 после NAT

В системе Linux, которая действует как шлюз в моей локальной сети, я попытался маршрутизировать трафик с помощью iproute2. Более того, перед маршрутизацией необходимо выполнить NAT, поскольку машина Linux подключена к устройству, которое позволяет подключение к Интернету, и имеет 2 IP-адреса 172.16.61.1и172.16.62.100

У меня есть 2 сетевые карты со следующей конфигурацией:

DEVICE=eth3
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.1.150
USERCTL=no
IPV6INIT=no
PEERDNS=yes  

DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes
GATEWAY=172.16.61.1

и я использую следующую инструкцию для трансляции IP через iptables

/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 172.16.61.2  

Используя вышеупомянутую конфигурацию, все компьютеры, принадлежащие сети 192.168.1.0/24, имеющие шлюз 192.168.1.150, могут подключаться к Интернету.

Если я попытаюсь использовать iproute2 для настройки шлюза, то я удалю шлюз по умолчанию из eth4, что предполагает следующую конфигурацию:

DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes

И я выполнил следующие шаги:

1. In /etc/iproute2/rt_tables I have added the line1 маршрут61
2. /sbin/ip route add 172.16.61.0/24 via 172.16.61.1 table route61 proto static
3. /sbin/ip route add default via 172.16.61.1 table route61 proto static
4. /sbin/ip rule add from 172.16.61.0/24 pref 15000 table route61

Выходной сигнал — /sbin/ip route show table route61это

172.16.61.0/24 via 172.16.61.1 dev eth4  proto static  
default via 172.16.61.1 dev eth4  proto static   

Выходной сигнал — /sbin/ip rule showэто

0:      from all lookup local 
15000:  from 172.16.61.0/24 lookup route61 
32766:  from all lookup main 
32767:  from all lookup default

но в этом случае это не работает, в чем я не прав?

Я также пытался использовать, /etc/sysconfig/network-scripts/ifup-routes eth4но безуспешно

Мне нужно понять, почему я не могу заставить работать «маршрутизацию на основе таблиц», поскольку мне придется использовать ее в контексте с несколькими шлюзами.

Обновлять

Чтобы попробовать то, что предлагает dirkt, я удалил шлюз по умолчанию.

route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4

и я использовал:

ip rule add from 192.168.1.0/24 pref 15000 table route61

что происходит, это

  1. ПК, который использует 192.168.1.150 как GW, то есть ПК-объект этого поста, может подключаться к Интернету
  2. Я больше не смогу подключиться к GW, пока не удалю инструкцию.ip rule add from 192.168.1.0/24 pref 15000 table route61

При постмаршрутизации пакеты, поступающие с 192.168.1.0/24, не должны предполагать 172.16.61.2 в качестве адреса источника?

Если я использую или удаляю GW по умолчанию с помощью route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4OR route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4и делаю:

ip route get 216.58.205.78 from 192.168.1.5

У меня естьRTNETLINK answers: Invalid argument

если я использую, ip route get 216.58.205.78 from 172.16.61.2у меня есть216.58.205.78 from 172.16.61.2 via 172.16.61.1 dev eth4

После route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4того, как я сделаю:

nc -v 216.58.205.78 443

У меня есть

Connection to 216.58.205.78 443 port [tcp/https] succeeded!

Если я удалю GW route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4nc по умолчанию, то подключение будет происходить только в том случае, если я укажу исходный IP:

nc -v 216.58.205.78 443 -s 172.16.61.2

решение1

Если я правильно вас понял, у вас есть 192.168.1.0/24, eth3и вы хотите маршрутизировать и транслировать NAT на что-то за eth4, где не указано, что именно за ним находится eth4, использует ли он DHCP и нужны ли ему статические адреса или нет.

(Обычно у вас есть какой-то маршрутизатор eth4, который запускает DHCP и раздает адреса).

Итак, во-первых, обычный способ добиться этого — включить пересылку и сделать

iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

где $EXTIFваш внешний интерфейс ( eth4). Это MASQUERADEс SNATлюбым адресом, который случайно находится на eth4, поэтому это устойчиво к переназначению адресов. И если вы не упоминаете протоколы, просто все будет преобразовано в NAT, что обычно и нужно.

Во-вторых, нет никаких причин делать маршрутизацию на основе таблиц (если только нет дополнительных деталей, которые вы не объяснили). Так что забудьте о таблицах, и если нет DHCP, eth4который бы распространял информацию о шлюзе для маршрута по умолчанию, просто сделайте

ip route default via 172.16.61.1

Предполагая, что eth4адрес уже есть 172.16.61.*/24, этого достаточно ( 172.16.61.0/24маршрут устанавливается при установке IP-адреса).

Но лучше всего просто предоставить это DHCP, если он включен на вашем маршрутизаторе (я думаю, это будет BOOTPROTO=dhcp, если это Red Hat).


Если проблема в маршрутизации политики: вы хотите направить исходящие пакеты, поступающие из 192.168.1.0/24через маршрут по умолчанию в таблице route61, поэтому вам нужно сделать следующее:

ip rule add from 192.168.1.0/24 pref 15000 table route61

и не from 172.16.61.0/24.

Тем не менее, я на самом деле не уверен, как NAT взаимодействует с политикой маршрутизации. Я быпредполагатьвозвращаемые пакеты сначала деНАТируются, а затем правила в основной таблице маршрутизируют их правильно, но я сам никогда этого не пробовал.

Для отладки ip route get X.X.X.X from Y.Y.Y.Yэто может быть полезно, как и tcpdumpна обоих интерфейсах, как вы уже сделали в другом вопросе, который упомянули.

Также будет проще сначала попробовать это без таблиц. Как только это сработает, вы будете знать, что больше ничего не мешает, и вы можете попробовать с таблицами.

решение2

Используя новую таблицу маршрутизации, вам придется добавить даже подключенные маршруты: вместо этого 172.16.61.0/24 via 172.16.61.1 dev eth4 proto staticследует proto scope linkуказать исходный IP-адрес, и вы пропустите маршрут 192.168.1.0/24. Решение о маршрутизации принимается до вывода / пост-маршрутизации NAT, поэтому ip rule add fromследует использовать исходный исходный IP-адрес. изображение

# Configure tables
echo '2 table61' >> /etc/iproute2/rt_tables 
echo '3 table62' >> /etc/iproute2/rt_tables 

# routing decision is performed before output / post routing nat
ip rule add from 192.168.1.5 lookup table62
ip rule add from 192.168.1.0/24 lookup table61

ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table61
ip route add 172.16.61.0/24 dev eth4 proto kernel scope link src 172.16.61.2 table table61
ip route add default via 172.16.61.1 table table61

ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table62
ip route add 172.16.62.0/24 dev eth4 proto kernel scope link src 172.16.62.100 table table62
ip route add default via 172.16.62.254 table table62

Кроме того, возможно, я перепутал ваши вопросы в голове. Если это не сработает сразу, не могли бы вы добавить следующее к вашему вопросу?

ip a
ip r show table table61
ip r show table table62
ip rule show
iptables -L -n -v
iptables -t nat -L -n -v

Связанный контент