Điểm:0

Thiết bị hai chạm không thể giao tiếp qua cầu nối

lá cờ cn

Tôi muốn trao đổi Gói Ethernet giữa hai thiết bị nhấn (để triển khai ngăn xếp giao thức TCP/IP trong chế độ người dùng).

Vấn đề tôi gặp phải là tap1 và tap2 chỉ có thể nhận gói quảng bá qua cầu chứ không thể nhận gói điểm tới điểm!

Ví dụ: khi tôi gửi gói từ tap1 đến tap2, tcmpdump có thể chụp gói trên tap1, nhưng tap2 không thể nhận gói. Tuy nhiên, khi tôi đặt địa chỉ đích là "ff:ff:ff:ff:ff:ff" hoặc bất kỳ địa chỉ mac không xác định (điều này sẽ được kích hoạt phát sóng), tap2 sẽ nhận được gói.

Cấu hình của tôi:

  1. tạo thiết bị hai vòi
ip tuntap thêm chế độ tap tun1
ip tuntap thêm chế độ tap tun2
# gán địa chỉ ip để triển khai giao thức arp
địa chỉ ip thêm 172.19.16.1 dev tun1
địa chỉ ip thêm 172.19.16.2 dev tun2

thiết lập liên kết ip tun1
liên kết ip thiết lập tun2 lên
  1. tạo ra một cây cầu
brctl addbr br0
brctl addif br0 tun1
brctl addif br0 tun2

thiết lập liên kết ip br0 lên

Sau đây là trạng thái của giao diện bridge and tap: mac:

cổng không mac addr là địa phương? hẹn giờ lão hóa
  2 46:44:6e:55:9b:c5 có 0,00
  2 46:44:6e:55:9b:c5 có 0,00
  1 f2:6b:68:c9:60:6b có 0,00
  1 f2:6b:68:c9:60:6b có 0,00

tiểu bang:

anh trai
 id cầu 8000.46446e559bc5
 gốc được chỉ định 8000.46446e559bc5
 cổng gốc 0 chi phí đường dẫn 0
 tuổi tối đa 20,00 cầu tuổi tối đa 20,00
 xin chào thời gian 2,00 cầu xin chào thời gian 2,00
 độ trễ chuyển tiếp 15,00 độ trễ chuyển tiếp cầu 15,00
 thời gian lão hóa 300,00
 xin chào hẹn giờ 0,00 hẹn giờ tcn 0,00
 hẹn giờ thay đổi cấu trúc liên kết 0,00 gc hẹn giờ 89,77
 cờ


điều chỉnh1 (1)
 chuyển tiếp trạng thái port id 8001
 đường dẫn gốc được chỉ định 8000.46446e559bc5 có giá 100
 cầu được chỉ định 8000.46446e559bc5 bộ đếm thời gian tuổi tin nhắn 0,00
 cổng được chỉ định 8001 bộ đếm thời gian trễ chuyển tiếp 0,00
 chi phí được chỉ định 0 giữ hẹn giờ 0,00
 cờ

điều chỉnh2 (2)
 chuyển tiếp trạng thái port id 8002
 đường dẫn gốc được chỉ định 8000.46446e559bc5 có giá 100
 cầu được chỉ định 8000.46446e559bc5 bộ đếm thời gian tuổi tin nhắn 0,00
 cổng được chỉ định 8002 bộ đếm thời gian trễ chuyển tiếp 0,00
 chi phí được chỉ định 0 giữ hẹn giờ 0,00
 cờ

Sau đây là mã thử nghiệm của tôi:

nhập fcntl
nhập hệ điều hành
nhập if_tun
nhập ctypes

cấu trúc nhập khẩu
từ scapy.all nhập *


từ if_tun nhập IfReq, TUNSETIFF, IFF_TUN


def register_tun(tên: str):
    fd = os.open("/dev/net/tun",os.O_RDWR)
    nếu fd < 0:
        trả lại fd

    r = IfReq()

    ctypes.memset(ctypes.byref(r), 0, ctypes.sizeof(r))
    r.ifr_ifru.ifru_flags = 0x0002 | 0x1000
    r.ifr_ifrn.ifrn_name = name.encode("utf-8")
    
    fcntl.ioctl(fd, TUNSETIFF,r)
    trả lại fd


nếu __name__ == "__main__":
    name = input("tên thiết bị đầu vào")
    fd = register_tun(tên)
    nếu fd < 0:
        in("lỗi")
    nếu tên == "tun2":
        trong khi Đúng:
            buf = os.read(fd,1024)
            in(f"nhận dữ liệu {len(buf)}")
            Ether(raw(buf)).show()
    mac1 = "f2:6b:68:c9:60:6b"
    mac2 = "46:44:6e:55:9b:c5"
    trong khi Đúng:
        loại = đầu vào ()
        a = Ether(dst=mac2,src=mac1)/ARP(pdst="172.19.16.1",psrc="172.19.16.2")
        một chương trình()
        in ("viết:")
        in(os.write(fd, raw(a)))

Ghi chú:

  1. Mặc dù tên thiết bị được gọi là tun, nhưng kiểu của nó là tap
  2. Tôi chạy đồng thời hai mã kiểm tra, một kết nối tun1 và kết nối tun2 khác. Vì vậy, hai thiết bị ở trạng thái LOWWER_UP
A.B avatar
lá cờ cl
A.B
Xem Q/A này của tôi: https://serverfault.com/questions/994721/ping-does-not-work-on-tap-interfaces-with-bridge/996479#996479 (Như bạn biết, bạn cần một ứng dụng userland , chỉ một phần của nó được quan tâm)
Miracle avatar
lá cờ cn
@ A.B Cảm ơn nhận xét của bạn, tôi biết rằng tôi cần tự mình xử lý giao thức arp. Nhưng hiện tại, tôi không thể gửi Gói Ethernet từ tap1 sang tap2. Vì vậy, tôi không thể tự mình triển khai giao thức arp.
Miracle avatar
lá cờ cn
@ A.B Lựa chọn nào tốt hơn trong số,tap,tun(point-to-point),veth(sử dụng raw socket) nếu tôi muốn triển khai ngăn xếp tcp/ip ở chế độ người dùng. Theo ý tưởng của tôi, tôi chỉ cần một cách để ghi trực tiếp Gói Ether vào giao diện mạng, việc triển khai trình điều khiển mạng rõ ràng là rất phức tạp và khó khăn. Sử dụng tun cũng phải giải quyết chính sách tuyến đường cục bộ. Làm thế nào về cặp veth (không gian mạng khác nhau, sử dụng ổ cắm thô)? Tôi không biết nên thử phương pháp nào.
Miracle avatar
lá cờ cn
@A.B Động lực của tôi là tìm hiểu sâu về tcp/ip. Cảm ơn bạn rất nhiều, sau khi cài đặt nó hoạt động. Nhưng tôi không hiểu tại sao cần thay đổi địa chỉ mac của tun1 f2:6b:68:c9:60:6b->f2:6b:68:c9:60:6c và tun2 46:44:6e:55:9b :c5->46:44:6e:55:9b:c6 . Cả hai địa chỉ mac đều được phân bổ bởi os. Tôi có cần thay đổi địa chỉ đích của Gói Ether không? Nếu không, điều này sẽ kích hoạt phát sóng. Theo tôi hiểu, cầu đóng vai trò chuyển đổi và có thể định tuyến Gói Ether tích lũy đến địa chỉ mac đích. Tuy nhiên, trong tình huống này, nó chỉ có thể phát gói.
Điểm:0
lá cờ cn

Có lẽ tôi đã có lý do.

Tap/Tun liên kết ngăn xếp mạng và chương trình người dùng. Chương trình người dùng có thể nhận bất kỳ dữ liệu nào được ghi vào thẻ nhấn theo ngăn xếp mạng.

Giả sử chúng ta có program1 lắng nghe tap1(mac1) và program2 lắng nghe sang tap2(mac2).

Nếu chương trình1 ghi một Gói Ether(src=mac1,dst=mac2) vào tap1, thì ngăn xếp mạng sẽ nhận được gói.Program2 chỉ có thể nhận gói nếu ngăn xếp mạng ghi gói vào tap2.

Điều này rõ ràng là không thể! Mac-Frame không có chức năng định tuyến. Hơn nữa, gói thuộc về máy chủ hiện tại.

Tuy nhiên, khi chúng tôi viết một gói quảng bá, ngăn xếp mạng sẽ chuyển tiếp gói tới mọi thẻ mạng ngoại trừ tap1.

Trên đây chỉ là sự hiểu biết nông cạn của tôi. Tôi không biết liệu nó có đúng không.

Đă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.