Điểm:0

Không thể xâu chuỗi nhiều không gian tên mạng lại với nhau

lá cờ de

Báo cáo vấn đề

Với cấu hình bên dưới, một cặp veth được tạo giữa không gian tên mạng mặc định/chính và một mạng được gọi là ns1.

Cấu hình cũng tạo ra một cặp veth thứ hai: veth2 nằm trong netns ns1 và veth3 nằm trong netns ns2, điều này tham gia ns1 đến ns2 tạo chuỗi: netns-veth0 mặc định <-> veth1-ns1-veth2 <-> veth3-ns2.

Sudo ip link thêm veth0 gõ veth tên ngang hàng veth1
sudo ip -6 addr add CCFF::0/127 ngang hàng CCFF::1/127 dev veth0
thiết lập liên kết sudo ip dev veth0

sudo ip netns add ns1
Sudo ip link set veth1 netns ns1
sudo ip -n ns1 -6 addr add CCFF::1/127 ngang hàng CCFF::0/127 dev veth1
Sudo ip -n ns1 thiết lập liên kết dev veth1
Sudo ip -n ns1 -6 route thêm mặc định qua CCFF::0

Sudo ip link add veth2 type veth peer name veth3
Sudo ip link set veth2 netns ns1
sudo ip -n ns1 -6 addr add CCFF::2/127 ngang hàng CCFF::3/127 dev veth2
Sudo ip -n ns1 thiết lập liên kết dev veth2
Sudo ip -n ns1 -6 route thêm CCFF::/64 qua CCFF::3

sudo ip netns thêm ns2
Sudo ip link set veth3 netns ns2
Sudo ip -n ns2 -6 addr add CCFF::3/127 ngang hàng CCFF::2/127 dev veth3
Sudo ip -n ns2 thiết lập liên kết dev veth3
Sudo ip -n ns2 -6 route thêm mặc định qua CCFF::2

Sudo ip -6 r thêm CCFF::/64 qua CCFF::1

Từ các mạng mặc định, tôi có thể ping veth0 trong cùng một mạng. Từ mạng mặc định, tôi có thể ping veth1 và veth2, cả hai đều có trong ns1. Từ mạng mặc định, tôi không thể pint veth3 trong ns2.

Nếu tôi mở rộng thay đổi như sau, bằng cách thêm veth4 vào ns2 và veth5 trong ns3 Tôi có cùng một vấn đề. Tôi có thể ping từ bất kỳ giao diện nào trong ns1 đến bất kỳ giao diện nào trong ns2, nhưng không thể truy cập bất kỳ giao diện nào trong ns3.

Sudo ip link thêm veth4 gõ veth tên ngang hàng veth5
Sudo ip link set veth4 netns ns2
sudo ip netns exec ns2 ip -6 addr add CCFF::4/127 ngang hàng CCFF::5/127 dev veth4
sudo ip netns exec ns2 thiết lập liên kết ip dev veth4
Sudo ip netns exec ns2 ip -6 route thêm CCFF::/64 qua CCFF::5

sudo ip netns thêm ns3
Sudo ip link set veth5 netns ns3
sudo ip netns exec ns3 ip -6 addr add CCFF::5/127 ngang hàng CCFF::4/127 dev veth5
sudo ip netns exec ns3 thiết lập liên kết ip dev veth5
Sudo ip netns exec ns3 ip -6 route thêm mặc định qua CCFF::4

Có vẻ như tôi chỉ có thể ping một giao diện trong một mạng "láng giềng"/"được kết nối" trực tiếp với giao diện mà tôi đang ping từ đó. Tôi không thể ping qua chuỗi không gian tên mạng. Tất cả các định tuyến đều hợp lệ; netns mặc định có thể ping bất kỳ giao diện nào trong ns1 nhưng không có gì hơn nữa, giao diện trong ns1 có thể ping bất kỳ giao diện nào trong mạng mặc định hoặc ns2 nhưng không có gì trong ns3, và ns3 có thể ping bất cứ thứ gì trong ns2 nhưng không có gì ngoài trong ns1 hoặc mạng mặc định.

Đây có phải là giới hạn của không gian tên mạng không?

Xử lý sự cố

Chuyển tiếp IPv6 được bật, ip6tables chỉ được đặt thành "cho phép tất cả", tôi không chắc cần kiểm tra điều gì khác.

$ip -6 r
ccff::1 dev veth0 proto kernel metric 256 pref medium
ccff::/127 dev veth0 proto kernel metric 256 pref medium
ccff::/64 qua ccff::1 dev veth0 metric 1024 pref medium
fe80::/64 dev veth0 proto kernel metric 256 pref medium

$ sudo ip -n ns1 -6 r
ccff:: dev veth1 proto kernel metric 256 pref medium
ccff::/127 dev veth1 proto kernel metric 256 pref medium
ccff::3 dev veth2 proto kernel metric 256 pref medium
ccff::2/127 dev veth2 proto kernel metric 256 pref medium
ccff::/64 qua ccff::3 dev veth2 metric 1024 pref medium
fe80::/64 dev veth1 proto kernel metric 256 pref medium
fe80::/64 dev veth2 proto kernel metric 256 pref medium
mặc định qua ccff :: dev veth1 metric 1024 pref medium

$sudo ip -n ns2 -6 r
ccff::2 dev veth3 proto kernel metric 256 pref medium
ccff::2/127 dev veth3 proto kernel metric 256 pref medium
ccff::5 dev veth4 proto kernel metric 256 pref medium
ccff::4/127 dev veth4 proto kernel metric 256 pref medium
ccff::/64 qua ccff::5 dev veth4 metric 1024 pref medium
fe80::/64 dev veth3 proto kernel metric 256 pref medium
fe80::/64 dev veth4 proto kernel metric 256 pref medium
mặc định qua ccff::2 dev veth3 metric 1024 pref medium

$sudo ip -n ns3 -6 r
ccff::4/127 dev veth5 proto kernel metric 256 linkdown pref medium
mặc định qua ccff::4 dev veth5 metric 1024 linkdown pref medium

$cat /proc/sys/net/ipv6/conf/all/chuyển tiếp 
1

$cat /proc/sys/net/ipv6/conf/default/chuyển tiếp 
1

$sudo ip6tables-save
# Được tạo bởi ip6tables-save v1.8.4 vào Thứ Tư ngày 17 tháng 11 22:02:48 năm 2021
*lọc
:CHẤP NHẬN ĐẦU VÀO [76565:173401906]
:CHẤP NHẬN VỀ PHÍA TRƯỚC [0:0]
:CHẤP NHẬN ĐẦU RA [50440:6536664]
LÀM
# Hoàn thành vào Thứ 4 ngày 17 tháng 11 22:02:48 2021

$lsb_release -a
Không có mô-đun LSB nào khả dụng.
ID nhà phân phối: Ubuntu
Mô tả: Ubuntu 20.04.3 LTS
Phát hành: 20.04
Tên mã: tiêu cự

$ uname -a
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Thứ ba ngày 26 tháng 10 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Điểm:2
lá cờ in

Chuyển tiếp IPv6 được bật

Có lẽ là không: Khi tôi thử điều này trên hệ thống của mình bằng các lệnh được đưa ra ở đầu câu hỏi, tôi cũng không thể truy cập veth3:

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 byte dữ liệu
^C
--- Thống kê ping CCFF::3 ---
Truyền 13 gói, nhận 0 gói, mất gói 100%, thời gian 12290ms

Tuy nhiên, khi tôi kích hoạt chuyển tiếp trong ns1

tiếng vọng 1 | sudo ip netns exec ns1 tee /proc/sys/net/ipv6/conf/all/forwarding

nó hoạt động:

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 byte dữ liệu
64 byte từ ccff::3: icmp_seq=1 ttl=63 time=0,112 ms
64 byte từ ccff::3: icmp_seq=2 ttl=63 time=0,054 ms

Vì vậy, có khả năng bạn cũng chưa bật chuyển tiếp IPv6 trong ns1. (Và nhớ chuyển tiếp là mỗi không gian tên; bạn đã bật nó trong không gian tên chính chưa, nhưng không phải trong ns1?)


Tôi đã sửa lỗi này bằng cách thực hiện một tcpdump trên mỗi giao diện; rằng ping không đạt được veth2 là một dấu hiệu cho thấy chuyển tiếp không được kích hoạt.

Và nếu bạn đang tự hỏi "nhưng tại sao tôi có thể ping veth2 nếu chuyển tiếp không được bật": Linux xử lý tất cả các địa chỉ cục bộ như nhau, vì vậy bạn có thể truy cập bất kỳ địa chỉ cục bộ nào từ bất kỳ giao diện nào. Điều này hoàn toàn không liên quan đến chuyển tiếp.

BTW, nó giúp ích rất nhiều cho bạn chạy một xterm trong mỗi không gian tên; điều đó làm cho việc gỡ lỗi dễ dàng hơn rất nhiều.

jwbensley avatar
lá cờ de
Tôi nghĩ rằng cài đặt `/proc/sys/net/ipv6/conf/default/forwarding` trong ns mặc định sẽ được kế thừa vào bất kỳ ns mới nào được tạo. Tôi thật ngu ngốc. Cảm ơn @dirkt.
Điểm:1
lá cờ cn

Tôi đã đi đến một kết luận hoàn toàn hợp lệ giống như @dirkt đã làm, mỗi không gian tên là một máy chủ lưu trữ mạng, bao gồm cả cài đặt liệu nó có hoạt động giống như một bộ định tuyến hay không (mặc định là tắt). /proc/sys/net cài đặt riêng biệt cho từng không gian tên. giải quyết là riêng biệt, các liên kết giao diện là riêng biệt (nhưng tên máy chủ thì không, vì bạn phải tạo không gian tên UTS). Vì vậy, về cơ bản đó là câu trả lời của bạn.

Dù sao thì cũng không phải để giảm bớt, nhưng để tham khảo trong tương lai, tôi sẽ thêm một số thứ và sắp xếp lại và đơn giản hóa điều này một chút. Bạn thực sự không cần cài đặt định tuyến trong không gian tên mặc định của mình, trừ khi bạn muốn định tuyến lưu lượng truy cập bên ngoài đến các không gian tên này hoặc ngược lại.

Để tổng hợp một cấu trúc cho không gian tên mặc định và ns1 cộng với ns2.

# tạo không gian tên
ip netns thêm ns1
ip netns thêm ns2

# loopback, thật tuyệt khi có
thiết lập liên kết ip -n ns1
thiết lập liên kết ip -n ns2

# tạo các cặp veth cho mỗi không gian tên mới
liên kết ip thêm veth0 gõ veth ngang hàng tên veth1
liên kết ip thêm veth2 gõ veth ngang hàng tên veth3

# thêm giao diện vào không gian tên của chúng
liên kết ip được đặt veth1 netns ns1
liên kết ip được đặt veth2 netns ns1
liên kết ip được đặt veth3 netns ns2

# chỉ định địa chỉ
ip -6 addr thêm CCFF::0/127 dev veth0
ip -n ns1 -6 addr add CCFF::1/127 dev veth1
ip -n ns1 -6 addr add CCFF::2/127 dev veth2
ip -n ns2 -6 addr add CCFF::3/127 dev veth3

# thiết lập các liên kết mới để lên
thiết lập liên kết ip dev veth0
thiết lập liên kết ip -n ns1 dev veth1
thiết lập liên kết ip -n ns1 dev veth2
thiết lập liên kết ip -n ns2 dev veth3

# không gian tên nên chuyển tiếp
ip netns exec ns1 sysctl -w net.ipv6.conf.all.forwarding=1

# định tuyến bất kỳ ip6 nào về phía máy chủ thông qua không gian tên 1
ip -n ns2 -6 route thêm mặc định qua CCFF::2

# định tuyến bất kỳ ccff ip6 nào từ máy chủ
# đến một không gian bên trong hơn thông qua không gian tên 1
ip -6 r thêm CCFF::/64 qua CCFF::1

Sau đó, bạn có thể thực hiện một số thử nghiệm:

danh sách mạng ip
ip netns exec ns2 ping6 ccff::0
ip netns exec ns2 ping6 ccff::1
ip netns exec ns2 ping6 ccff::3

# Hoặc đặt trình bao của bạn (ví dụ: bash) vào không gian tên ns2
ip netns exec ns2 /bin/bash
ping6 ccff::0
lối ra

Bạn cũng có thể thực hiện một số thay đổi đối với tệp lưu trữ và giải quyết

# Thiết lập trình phân giải 
# (thay thế bằng DNS của riêng bạn, không hoạt động với trình phân giải loopback)

mkdir -p /etc/netns/ns2
echo nameserver dns-ip > /etc/netns/ns2/resolv.conf

# Có thể cung cấp cho nó tệp máy chủ riêng để chỉnh sửa
cp /etc/hosts /etc/netns/ns2/hosts

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