Điểm:0

Windows 10 bỏ qua bảng định tuyến

lá cờ pk

Tôi có PC chạy Windows 10 có 2 giao diện mạng. Một trong những giao diện đó đi vào mạng LAN chính nơi đặt máy chủ tệp, dns và bộ định tuyến cho internet. Giao diện thứ hai là một mạng LAN nhỏ có PLC và HMI. Cả hai đều ở trong cùng một mạng LAN nhưng trên các mạng con khác nhau (xin lỗi, không thể thay đổi điều đó, ngoài tầm kiểm soát của tôi).

Vì vậy, tôi có hai giao diện vật lý và một giao diện logic: eth0: DHCP, 172.16.x.y, MASK 255.255.255.0, mặc định gw 172.16.x.z eth1: tĩnh 192.168.1.158, MẶT NẠ 255.255.255.0 tĩnh 192.168.19.158, MẶT NẠ 255.255.255.0

Có thể truy cập HMI theo 192.168.19.135

Bây giờ khi tôi khởi động lại HMI, tôi bắt đầu ping để xem khi nào có thể truy cập lại được. Điều này sẽ xảy ra sau khoảng 30 giây.Nhưng tôi chỉ nhận được phản hồi ping tích cực sau 80-90 giây.

Ping wird ausgeführt für 192.168.19.135 mit 32 Byte Daten:
Antwort von 192.168.19.158: Zielhost nicht erreichbar.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.

(xin lỗi vì văn bản tiếng Đức, nhưng tôi nghĩ vẫn nên rõ ràng những gì chúng ta thấy ở đây) Tôi nhận được phản hồi khác cho lần ping đầu tiên so với lần thứ hai.

Có vẻ như Windows sau XP đã bắt đầu thực hiện một số "phép thuật định tuyến" và chỉ gửi dữ liệu ra ngoài tuyến đường mặc định nếu nó không thể đến được mục tiêu trên một tuyến đường cụ thể hơn. Có vẻ như những người khác cũng đã có vấn đề này

Tôi đã tìm thấy một số "giải pháp" không phải là giải pháp thực sự đối với tôi (thêm về điều đó bên dưới)

  1. Vì vậy, ping có tham số "-S" đẹp để xác định địa chỉ nguồn. Và vâng, điều này "giải quyết" vấn đề. Tôi nhận được trả lời ngay lập tức nếu HMI hoạt động. Nhưng tôi đang sử dụng lệnh đó trong tập lệnh powershell và tham số nguồn cho "kết nối thử nghiệm" có một ý nghĩa hoàn toàn khác. Và vì tôi sử dụng điều này trong một tập lệnh nên điều này không thành công ngay khi IP cục bộ thay đổi.
  2. Tôi đã định cấu hình tĩnh eth0 thay vì bằng DHCP và không xác định tuyến đường mặc định. Điều này cũng "giải quyết" vấn đề (tôi nghĩ bạn có thể tưởng tượng tại sao đây không thực sự là một giải pháp)
  3. Tôi mới chỉ khám phá điều này về mặt lý thuyết nhưng tôi có thể cài đặt bộ định tuyến dựa trên linux với 3 giao diện giữa PC, mạng LAN và mạng LAN bị cô lập với PLC và HMI và để nó thực hiện tất cả việc định tuyến (điều này chắc chắn sẽ giải quyết được vấn đề! Nhưng thành thật mà nói, tôi có cần thêm một máy tính chỉ để xử lý việc định tuyến các cửa sổ bị hỏng không?)
  4. ´arp -d *´ dường như cũng hữu ích, nhưng cần các đặc quyền nâng cao

Tôi đã thử thêm các tuyến tĩnh với các tham số và chỉ số khác nhau. Không thay đổi! Việc thêm MAC của HMI tĩnh không giúp được gì vì MAC này có thể thay đổi.

Vì vậy, câu hỏi của tôi là:

  1. có tài liệu nào về sự thay đổi hành vi này trong windows không?
  2. có cách nào để buộc các cửa sổ sử dụng giao diện đã xác định không
Điểm:0
lá cờ pk

Vì vậy, sau khi không tìm được giải pháp dễ dàng, tôi quyết định lập trình theo cách của mình để giải quyết vấn đề mà microsoft đã tạo ra do định tuyến trên windows bị rối loạn nghiêm trọng.

Tôi đang sử dụng ping cổ điển với tham số -S thay vì cmdlet test-connection trong powershell

phần ping của mã của tôi bây giờ trông như thế này:

$localIPs = (Get-NetIPConfiguration -InterfaceAlias ​​"PLC").IPv4Address.IPAddress

# vì lệnh này trả về một chuỗi, khi giao diện có một địa chỉ IP duy nhất nhưng một chuỗi các chuỗi nếu giao diện có nhiều hơn một địa chỉ, chúng ta cần kiểm tra điều này
if ($localIPs.GetType().Name -eq "string") { # chỉ một IP duy nhất
  $localIP = $localIPs
}
khác { # nhiều hơn một IP
  $localIP = $localIPs[0] # vì có vẻ như các cửa sổ sử dụng địa chỉ ip làm từ đồng nghĩa với giao diện, nên việc chúng ta sử dụng địa chỉ nào của giao diện đó không quan trọng. Vì vậy, chúng tôi chỉ chọn cái đầu tiên
}

$pingcount = 180

làm {
  ping $HMI4IP -n 1 -w 1000 -S $localIP | Out-Null # chuyển hướng đầu ra của ping tới /dev/null
  $pingreply = $?
  $pingcount = $pingcount - 1
}
cho đến khi ($pingcount -eq '0' -hoặc $pingreply)
nếu ($pingreply) {
  # mã ở đây
}
khác {
  thoát 1337 # quay lại với mã lỗi, chúng tôi chưa đạt được mục tiêu của mình
}

Đối với điều này, tôi chỉ cần đảm bảo rằng giao diện mà PLC và HMI được kết nối có tên là "PLC". Hơn nữa, tôi nhận được địa chỉ dưới dạng một chuỗi hoặc một mảng địa chỉ (tùy thuộc vào việc giao diện có một hay nhiều địa chỉ) mà tôi phải xử lý (chào mừng bạn đến với kiểu gõ động...). Nó dễ dàng như việc cung cấp dữ liệu này cho ping (vì Test-Connection cố gắng trở nên quá thông minh vì lợi ích của chính nó). Bằng $? Tôi hiểu đúng về lệnh cuối cùng trả về thành công và sai nếu thất bại. Vì vậy, thật dễ dàng để xử lý từ đó trở đi.

Theo như tôi thấy thì không có tài liệu nào của Microsoft về hành vi này và cách xử lý nó, điều mà tôi nghĩ là khá buồn.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.