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

У меня есть следующий сценарий:

Компьютер А: 198.51.100.8, сетевая маска 255.255.255.0
Компьютер Б: 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, попробуйте один из других ответов.

4 ответа

Решение

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

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

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

В окнах вы можете добавить маршрут на основе интерфейса, не зная интерфейса, передав 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

Номер интерфейса в десятичном виде отображается с 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 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%.

Другие вопросы по тегам