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:
- 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
- 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ú:
- Mặc dù tên thiết bị được gọi là tun, nhưng kiểu của nó là tap
- 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