내가 하고 싶은 것
네트워크 인터페이스 사이에서 IP 패킷을 라우팅하도록 Debian Stretch GNU/Linux 컴퓨터를 설정하고 싶습니다.
문맥
내 Debian 상자와 곧 출시될 라우터에서 사용할 수 있는 네트워크 인터페이스는 다음과 같습니다.
색인 | 인터페이스 이름 | 아이피 |
---|---|---|
1 | enpu2s0 | 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에 도착하는 핑 패킷이 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 가이드를 따르세요.이전 링크에서트래픽 라우팅 허용