Назад | Перейти на главную страницу

Статические маршруты Windows без указания шлюза (следующий переход)

У меня такой сценарий:

Компьютер A: 198.51.100.8, маска сети 255.255.255.0
Компьютер B: 203.0.113.9, маска сети 255.255.255.0
Оба компьютера находятся в одном сегменте ЛВС; в любом случае шлюз по умолчанию не указан.

Чтобы эти два компьютера могли взаимодействовать друг с другом, я добавил два статических маршрута, например:

route add 203.0.113.9 mask 255.255.255.255 198.51.100.8

Однако я бы предпочел добавить статические маршруты, указав сетевой интерфейсвместо того, чтобы указывать IP-адрес шлюза.

В Linux это возможно с помощью такой команды, как:

ip route add 203.0.113.9 dev eth0

и аналогично во FreeBSD:

route add 203.0.113.9/32 -iface fxp0 -cloning

Однако я не понимаю, как это сделать с Windows. В идеале я хочу сделать что-то вроде:

route add 203.0.113.9 mask 255.255.255.255 if 2

но это просто распечатывает использование для route команда, которая говорит мне, что я делаю это неправильно. Я также пробовал использовать netsh, что говорит мне:

> netsh routing ip add persistentroute 203.0.113.9 255.255.255.255 "Local Area Connection"
Specify the next-hop for non point-to-point interfaces.

Есть мысли или предложения?


Обновить: Когда я первоначально разместил этот вопрос, я использовал Windows XP. Но я забыл упомянуть об этом.

Я оставлю исходный ответ Гризли, так как он правильный для моего исходного вопроса. Но если вы используете более новую версию Windows, чем XP / 2003, попробуйте один из других ответов.

В Windows вы можете добавить маршрут на основе интерфейса, не зная шлюза, передав 0.0.0.0 как шлюз

это дает что-то вроде этого:

route add <IPtoRoute> mask <MaskOfTheIp> 0.0.0.0 IF <InterfaceNumber>

route add 203.0.113.9 mask 255.255.255.255 0.0.0.0 IF 2

Это может быть невозможно с окнами

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/route.mspx

Цитата: для локально подключенных маршрутов подсети адрес шлюза - это IP-адрес, назначенный интерфейсу, который подключен к подсети.

Номер интерфейса в десятичном формате отображается с route print. Посмотрите на верхнюю часть вывода под Interface List.

Другой способ - использовать arp -a и запишите шестнадцатеричное число, например:

C:\>arp -a

Interface: 192.168.1.28 --- 0xc  
  Internet Address      Physical Address      Type
<snip>

Оба принимаются после if аргумент в route.exe, например:

route ADD <NET-ID> MASK <mask> <GW-address or 0.0.0.0 for on-link> IF 0xc -P

я предпочитаю arp -a, так как NIC легче идентифицировать.

Много других способов, но это самый простой.

Я получил то же самое в Windows 7 Enterprise с клиентом Juniper Junos Pulse VPN.
У меня была проблема с этим, поскольку он захватил все возможные адреса IPv4 и направил их на коммутируемое соединение:

Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          1.0.0.0        255.0.0.0         On-link       XX.XX.XX.XX     11
          2.0.0.0        254.0.0.0         On-link       XX.XX.XX.XX     11
          4.0.0.0        252.0.0.0         On-link       XX.XX.XX.XX     11
          8.0.0.0        248.0.0.0         On-link       XX.XX.XX.XX     11
         16.0.0.0        240.0.0.0         On-link       XX.XX.XX.XX     11
         32.0.0.0        224.0.0.0         On-link       XX.XX.XX.XX     11
         64.0.0.0        192.0.0.0         On-link       XX.XX.XX.XX     11
        128.0.0.0        128.0.0.0         On-link       XX.XX.XX.XX     11

Я не хотел, чтобы весь мой трафик проходил через VPN, поэтому на случай, если это кому-то понадобится, я написал небольшой cmd-файл, чтобы удалить эти маршруты, а затем установить единственный, который мне нужен (10.0.0.0), не имея возможности указать шлюз. , указав правильный интерфейс.
Вы можете использовать это для динамического получения номера интерфейса.

@rem Get the interface number
set IF=
for /f "tokens=1,8 delims=. " %%A in ('route print') do @if /i "%%B" equ "Juniper" set IF=%%A
@rem If interface is not found, terminate quietly
if not defined IF exit /b
for %%A in (1 2 4 8 16 32 64 128) do @route delete %%A.0.0.0
route add 10.0.0.0 mask 255.0.0.0 0.0.0.0 IF %IF%

Вы не можете пропустить шлюз в постоянной таблице. Некоторые предлагают поместить туда IP-адрес интерфейсной карты (на стороне пользователя), что было приемлемо в Windows XP. Но это уже не действительно. ОС в этом случае продолжит стучать по каждому сетевому интерфейсу, по крайней мере, пока не заполнится кеш; это плохое поведение и не имеет значения для пустой таблицы маршрутизации.

Я обнаружил, что установка IP-адреса назначения в качестве шлюза решает проблему, по крайней мере, в Windows 10. Но на данный момент у меня мало статистических данных, подтверждающих, что это 100,1% истина.