커널 4.9.62와 다음과 같은 두 개의 물리적 인터페이스를 갖춘 ARM 임베디드 시스템이 있습니다.
________
+------------+ /
| | |
+----------------------+ Subnet 1 +--------|
|10.0.0.180 |10.0.0.1 | /
+------+-------+ +------------+ |
| eth0 | /
| | |
| Host | | Internet
| | |
| wlan0 | \
+------+-------+ +------------+ |
|10.0.10.250 | | \
+----------------------+ Subnet 2 +-------|
|10.0.10.1 | |
+------------+ \________
>ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:20:c4:04:c2:03 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
link/ether 74:da:38:d3:3e:4e brd ff:ff:ff:ff:ff:ff
>ip route
default via 10.0.0.1 dev eth0
default via 10.0.10.1 dev wlan0 metric 2
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.180
10.0.10.0/24 dev wlan0 proto kernel scope link src 10.0.10.250
내가 원하는 것은 두 개의 인터페이스 중 하나에 대해 네트워크 테스트를 실행할 수 있도록 두 개의 네트워크 네임스페이스를 추가하는 것입니다. 그래서 내가 원하는 결과는 다음과 같습니다.
>ping google.com
PING google.com (172.217.4.46): 56 data bytes
64 bytes from 172.217.4.46: seq=0 ttl=56 time=53.575 ms
>ip netns exec eth_ns ping google.com
PING google.com (172.217.4.46): 56 data bytes
64 bytes from 172.217.4.46: seq=0 ttl=55 time=53.496 ms
>ip netns exec wlan_ns ping google.com
PING google.com (172.217.4.110): 56 data bytes
64 bytes from 172.217.4.110: seq=0 ttl=55 time=56.443 ms
현재 저는 다음 스크립트를 사용하여 두 개의 네트워크 네임스페이스를 설정하려고 합니다. 각각은 veth 쌍의 한쪽 끝과 veth 쌍의 다른 쪽 끝이 적절한 물리적 인터페이스에 연결되어 있습니다.
# ############################################
# Create the ethernet namespace
ip netns add eth_ns
# Create veth link.
ip link add v-eth1 type veth peer name v-peer1
# Add peer-1 to NS.
ip link set v-peer1 netns eth_ns
# Setup IP address of v-eth1.
ip addr add 10.200.1.1/24 dev v-eth1
ip link set v-eth1 up
# Setup IP address of v-peer1.
ip netns exec eth_ns ip addr add 10.200.1.2/24 dev v-peer1
ip netns exec eth_ns ip link set v-peer1 up
ip netns exec eth_ns ip link set lo up
ip netns exec eth_ns ip route add default via 10.200.1.1
# ############################################
# Create the wlan namespace
ip netns add wlan_ns
# Create veth link.
ip link add v-wlan1 type veth peer name v-peer2
# Add peer-2 to NS.
ip link set v-peer2 netns wlan_ns
# Setup IP address of v-wlan1.
ip addr add 10.200.2.1/24 dev v-wlan1
ip link set v-wlan1 up
# Setup IP address of v-peer2.
ip netns exec wlan_ns ip addr add 10.200.2.2/24 dev v-peer2
ip netns exec wlan_ns ip link set v-peer2 up
ip netns exec wlan_ns ip link set lo up
ip netns exec wlan_ns ip route add default via 10.200.2.1
# ############################################
# Share internet access between host and NS.
# Enable IP-forwarding.
echo 1 > /proc/sys/net/ipv4/ip_forward
# Flush forward rules, policy DROP by default. Flush nat rules.
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
# ############################################
# Enable masquerading of 10.200.1.0.
iptables -t nat -A POSTROUTING -s 10.200.1.0/255.255.255.0 -o eth0 -j MASQUERADE
# Allow forwarding between eth0 and v-eth1.
iptables -A FORWARD -i eth0 -o v-eth1 -j ACCEPT
iptables -A FORWARD -o eth0 -i v-eth1 -j ACCEPT
# ############################################
# Enable masquerading of 10.200.2.0.
iptables -t nat -A POSTROUTING -s 10.200.2.0/255.255.255.0 -o wlan0 -j MASQUERADE
# Allow forwarding between wlan0 and v-wlan1.
iptables -A FORWARD -i wlan0 -o v-wlan1 -j ACCEPT
iptables -A FORWARD -o wlan0 -i v-wlan1 -j ACCEPT
결과적으로 아래 처음 두 명령은 예상대로 작동하지만 세 번째 명령은 실패합니다.
>ping google.com
PING google.com (172.217.4.46): 56 data bytes
64 bytes from 172.217.4.46: seq=0 ttl=56 time=53.575 ms
64 bytes from 172.217.4.46: seq=1 ttl=56 time=53.751 ms
64 bytes from 172.217.4.46: seq=2 ttl=56 time=52.709 ms
>ip netns exec eth_ns ping google.com
PING google.com (172.217.4.46): 56 data bytes
64 bytes from 172.217.4.46: seq=0 ttl=55 time=53.496 ms
64 bytes from 172.217.4.46: seq=1 ttl=55 time=52.967 ms
64 bytes from 172.217.4.46: seq=2 ttl=55 time=53.038 ms
>ip netns exec wlan_ns ping google.com
ping: bad address 'google.com'
wlan_ns에서 기본 라우터를 ping할 수 있습니다.
>ip netns exec wlan_ns ping 10.0.10.1
PING 10.0.10.1 (10.0.10.1): 56 data bytes
64 bytes from 10.0.10.1: seq=0 ttl=63 time=5.232 ms
그러나 작동하기 위해 wlan_ns를 통한 라우팅이 필요한 것은 없습니다. 10.0.0.1 기본 경로를 삭제할 수 있고 wlan_ns가 작동하기 때문에 두 개의 기본 경로에 문제가 있다고 확신합니다.
그렇다면 eth_ns와 wlan_ns가 동시에 작동하도록 라우팅 테이블이나 iptable을 어떻게 구성합니까?