
내가 하고 싶은 일
네트워크 인터페이스 간에 IP 패킷을 라우팅하도록 Debian Stretch GNU/Linux 컴퓨터를 설정하고 싶습니다.
문맥
내 데비안 상자와 곧 출시될 라우터에서 사용할 수 있는 네트워크 인터페이스는 다음과 같습니다.
색인 | 인터페이스 이름 | 아이피 |
---|---|---|
1 | enp2s0 | 192.168.23.91/24 |
2 | enx00e04c360e75 | 192.168.1.1/24 |
삼 | enx000ec667a74a | 192.168.2.2/24 |
sysctl net.ipv4.ip_forward
반환1
하므로 라우팅이 활성화됩니다.cat /proc/sys/net/ipv4/conf/*/rp_filter
s 외에는 아무것도 반환하지 않습니다0
. 따라서 역방향 경로 필터링이 비활성화됩니다. (이것은 내가 찾은 몇 가지 다른 질문에 대한 우려의 원인이었습니다.)
라우팅 테이블은 다음과 같습니다.
$ sudo route -nn
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.23.254 0.0.0.0 UG 100 0 0 enp2s0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp2s0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 101 0 0 enx00e04c360e75
192.168.2.0 0.0.0.0 255.255.255.0 U 102 0 0 enx000ec667a74a
192.168.23.0 0.0.0.0 255.255.255.0 U 100 0 0 enp2s0
다음 작품
NIC 2에 연결된 내 장치( 192.168.1.111
)에서 NIC 2( 192.168.1.1
)와 NIC 3( 192.168.2.2
)을 모두 ping할 수 있습니다.
tcpdump
내 Debian 라우터의 출력이 예상한 대로 보입니다.
$ sudo tcpdump -i enx00e04c360e75 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enx00e04c360e75, link-type EN10MB (Ethernet), capture size 262144 bytes
18:10:51.919808 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 17, length 64
18:10:51.919863 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 17, length 64
18:10:52.920019 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 18, length 64
18:10:52.920130 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 18, length 64
18:10:53.920808 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 19, length 64
18:10:53.920895 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 19, length 64
[...]
18:11:03.408546 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 0, length 64
18:11:03.408622 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 0, length 64
18:11:04.405006 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 1, length 64
18:11:04.405061 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 1, length 64
18:11:05.405147 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 2, length 64
18:11:05.405201 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 2, length 64
다음은 작동하지 않습니다
NIC 2를 통해 연결된 장치에서 NIC 1을 통해 액세스할 수 있는 일부 호스트를 ping할 수 없습니다.
tcpdump
내 Debian 상자에서 실행하면 NIC 2에서 들어오는 패킷이 표시됩니다.
$ sudo tcpdump -i enx00e04c360e75 icmp -n
listening on enx00e04c360e75, link-type EN10MB (Ethernet), capture size 262144 bytes
18:11:31.837778 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 4, length 64
18:11:32.838830 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 5, length 64
18:11:33.838249 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 6, length 64
[...]
하지만 NIC 1을 통해 떠나지는 않습니다.
$ sudo tcpdump -i enp2s0 icmp -n
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
[nothing]
Debian 라우터 상자에서 직접 ping을 실행하면 tcpdump
예상한 대로 보입니다.
$ sudo tcpdump -i enp2s0 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:35:16.577795 IP 192.168.23.91 > 193.99.144.80: ICMP echo request, id 13146, seq 1, length 64
18:35:16.600861 IP 193.99.144.80 > 192.168.23.91: ICMP echo reply, id 13146, seq 1, length 64
18:35:17.578164 IP 192.168.23.91 > 193.99.144.80: ICMP echo request, id 13146, seq 2, length 64
18:35:17.599898 IP 193.99.144.80 > 192.168.23.91: ICMP echo reply, id 13146, seq 2, length 64
질문
NIC 2에 도착하는 ping 패킷이 NIC 1을 통해 중계되는 것을 방지하는 것은 무엇입니까? 이러한 패킷의 라우팅을 활성화하려면 어떻게 해야 합니까?
답변1
댓글로 교환된 내용을 요약하면 다음과 같습니다.
시스템이 명시적으로 라우터로 구성되지 않았습니다.
즉, 다음과 같은 것을 적용하는 명시적인 구성이 없습니다.
sysctl -w net.ipv4.ip_forward=1
시스템이 Docker를 실행 중입니다.
이는 다음을 의미합니다.
Docker는 시스템을 라우터로 전환합니다.
그것은 스스로를 설정합니다:
sysctl -w net.ipv4.ip_forward=1
-
라우터의 도커
Docker는 FORWARD 체인에 대한 정책도 DROP으로 설정합니다. Docker 호스트가 라우터 역할도 하는 경우 해당 라우터는 더 이상 트래픽을 전달하지 않게 됩니다. 시스템이 계속 라우터로 작동하도록 하려면 체인에 명시적인 ACCEPT 규칙을 추가하여
DOCKER-USER
이를 허용할 수 있습니다.$ iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT
그래서
- Docker가 전달된 패킷을 삭제하도록 함(컨테이너 제외)
- Docker를 중지하면 더 이상 전달이 활성화되지 않습니다(적어도 다음 부팅 시).
두 경우 모두 시스템은 결국 라우팅되지 않았습니다.
아마도 아래 두 가지 작업을 모두 수행해야 할 것입니다.
- 라우팅을 명시적으로 활성화합니다(
/etc/sysctl.conf
또는 어딘가에서/etc/sysctl.d/
). - Docker 가이드를 따르세요.이전 링크에서라우팅된 트래픽을 허용하기 위해