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

15

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

Компьютер 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, попробуйте один из других ответов.

расщепление
источник

Ответы:

7

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

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

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

Grizly
источник
Эй, Гризли - спасибо за ответ! Я попробовал обе предложенные вами команды, но получил: «Не удалось добавить маршрут. Либо неверный индекс интерфейса, либо шлюз не находится в той же сети, что и интерфейс. Проверьте таблицу IP-адресов для устройства». У меня только два интерфейса на машине: 0x1 (интерфейс MS TCP Loopback) и 0x2 (сетевое подключение Intel (R) PRO / 1000 MT), поэтому я уверен, что «если 2» - это то, что я хочу использовать. Есть еще мысли?
деление
Просто проигнорируйте часть "метрика 1, если 2" .. она должна понять это. Лучше всего тестировать и без -p. (это делает его постоянным)
Grizly
Я получаю тот же результат без "метрики 1, если 2" часть.
деление
Ох, мой плохой, кажется, шлюз - это ip интерфейса .. ответ обновлен.
Grizly
Да, это то, что я уже делаю, и что я надеялся избежать. В любом случае, спасибо.
деление
21

В окнах вы можете добавить маршрут на основе интерфейса, не зная интерфейс, передавая в 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
domi.vds
источник
2
Я пробовал это на Windows 7 x64. Оно работает! Моя команда: route ADD 176.31.111.111 0.0.0.0 IF 25она вернулась OK!и новая запись появилась в таблице маршрутизации, как и ожидалось
Дмитрий
6

Я получил то же самое в 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%
Eelco L.
источник
1
Вы можете просто отключить принудительное туннелирование в разделе свойств ip вашего vpn-соединения.
странный ходок
5

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

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

Eggie
источник
0

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

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

Asdf
источник