В системе 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 line
1 маршрут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
что происходит, это
- ПК, который использует 192.168.1.150 как GW, то есть ПК-объект этого поста, может подключаться к Интернету
- Я больше не смогу подключиться к 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 eth4
OR 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 eth4
nc по умолчанию, то подключение будет происходить только в том случае, если я укажу исходный 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