나는 완전히 이해할 수 없는 다소 이상한 행동을 관찰했습니다. 그래서 아래 그림과 같이 OpenVPN 연결을 설정했습니다. (TUN 및 클라이언트 간 설정입니다). 내 생각은 이 시나리오에서 핑 경로를 향하고 있습니다. 내 openvpn 연결
from client: 192.168.200.102 to LAN: 10.198.0.16
일반적으로 이 ping이 성공한다는 것은 놀라운 일이 아니지만, 제가 이해하기로는 서버의 iptables 설정을 다음과 같이 변경하는 경우입니다.
-P FORWARD DROP
그리고 심지어
net.ipv4.ip_forward = 0.
위의 설정으로는 트래픽이 목적지에 도달해서는 안 됩니다. 트래픽이 성공하더라도 LAN 인터페이스에 도달하지 않습니다. 문제는 LAN 인터페이스 eth0 10.198.0.16에 도착하는 트래픽(tcpdump 데이터 네트워크 패킷 분석기를 실행하여)을 볼 수 없다는 것입니다. LAN IP가 tun 인터페이스에 바인딩된 것처럼 tun 인터페이스가 트래픽에 자체 응답하는 것 같습니다. 아래를 참조하세요.
sudo tcpdump -i tun0 tcpdump: 16:34:21.391381 IP 192.168.200.102 > 10.198.0.16: ICMP echo request, id 14, seq 1885, length 64 16:34:21.391514 IP 10.198.0.16 > 192.168.200.102: ICMP echo reply, id 14, seq 1885, length 64
여기서 무슨 일이 일어나고 있나요? 내가 이해하는 한, 클라이언트에서 오는 요청은 서버의 tun 인터페이스로 이동하고 결국에는전달됨커널에서 eth0으로, 맞나요? 일반적으로 다음을 실행하여 볼 수 있습니까? sudo tcpdump -i tun0
또는 sudo tcpdump -i eth0
?
제가 이 문제를 그토록 까다롭게 여기는 이유는 클라이언트가 서버의 LAN에 액세스하는 것을 방지하는 규칙을 구현할 방법이 없으면 보안 위험이 있다고 생각하기 때문입니다. 여기서 무엇을 놓치고 있습니까? 클라이언트-클라이언트 구성을 위해 의도된 대로 패킷을 eth0 인터페이스로 전달하는 OpenVPN 프로세스가 있습니까?
내 문제를 더 잘 해결할 수 있도록 아래에 진단 정보를 첨부했습니다.
서버의 경우
ip addr
`1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether b8:27:eb:5c:a6:e6 brd ff:ff:ff:ff:ff:ff inet 10.198.0.16/24 brd 10.198.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::ba27:ebff:fe5c:a6e6/64 scope link valid_lft forever preferred_lft forever 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether b8:27:eb:09:f3:b3 brd ff:ff:ff:ff:ff:ff 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500 link/none inet 192.168.200.1/24 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::87cd:fedd:92fc:cde/64 scope link stable-privacy valid_lft forever preferred_lft forever
`
ip route
default via 10.198.0.1 dev eth0 proto static 10.198.0.0/24 dev eth0 proto kernel scope link src 10.198.0.16 192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.1 192.168.178.0/24 via 192.168.200.1 dev tun0 scope link
server openvpn.conf
tls-server mode server dev tun local 10.198.0.16 proto tcp-server port 1234 user openvpn group openvpn ca /etc/openvpn/cacert.pem cert /etc/openvpn/servercert.pem key /etc/openvpn/serverkey dh /etc/openvpn/dh2048.pem ifconfig-pool 192.168.200.2 192.168.200.103 255.255.255.0 client-config-dir /etc/openvpn/ccd ifconfig 192.168.200.1 255.255.255.0 keepalive 10 120 comp-lzo client-to-client push "topology subnet" topology "subnet" log /var/log/openvpn.log
클라이언트의 경우
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 38:af:d7:a0:52:ec brd ff:ff:ff:ff:ff:ff 3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:28:f8:8d:1c:6f brd ff:ff:ff:ff:ff:ff inet 192.168.178.79/24 brd 192.168.178.255 scope global dynamic noprefixroute wlp2s0 valid_lft 859868sec preferred_lft 859868sec inet6 2a0a:a540:d54:0:bd79:eb10:5e26:548a/64 scope global temporary dynamic valid_lft 7190sec preferred_lft 3590sec inet6 2a0a:a540:d54:0:6086:b044:dff:2694/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 7190sec preferred_lft 3590sec inet6 fe80::ad5c:6e18:87fa:dff4/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100 link/none inet 192.168.200.102/24 brd 192.168.200.255 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::5dfc:6b3a:3c4d:e9a4/64 scope link stable-privacy valid_lft forever preferred_lft forever
ip route
default via 192.168.178.1 dev wlp2s0 proto dhcp metric 600 169.254.0.0/16 dev wlp2s0 scope link metric 1000 10.198.0.0/24 via 192.168.200.1 dev tun0 192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.102 192.168.178.0/24 dev wlp2s0 proto kernel scope link src 192.168.178.79 metric 600
client openvpn.conf
dev tun client nobind remote 11.22.33.44 proto tcp port 1234 ca /etc/openvpn/cacert.pem cert /etc/openvpn/user_cert.pem key /etc/openvpn/user comp-lzo verb 3 keepalive 10 120 log /var/log/openvpn.log
ccd for client
iroute 192.168.178.0 255.255.255.0
답변1
물론 VPN과 나머지 네트워크 간의 트래픽은 tun0
. 이 트래픽의 경우 FORWARD
체인은 평소와 같이 참조되며 누가 어디에 연결할 수 있는지 제어할 수 있습니다. 활성화되지 않으면 ip_forward
트래픽이 전달되지 않습니다.
를 사용하지 않을 경우 client-to-client
클라이언트 간 트래픽은 동일한 경로를 사용합니다. tun0
인터페이스에서 서버 OS에 나타나고 OS 라우팅 테이블을 사용하여 적절하게 라우팅하고 방화벽을 통과하며 유일한 차이점은 대상이 뒤에 있다고 판단하므로 tun0
패킷은 그것을 통해 나갔습니다.
OpenVPN 프로세스는 사용자 공간에 있고 tun0은 커널 공간에 있기 때문에 그다지 효율적이지 않으며 각 패킷에 대해 최소한 두 번의 컨텍스트 변경이 발생합니다.
그러나 를 사용 하면 client-to-client
클라이언트 간의 패킷이 에 나타나지 않으며 tun0
서버의 방화벽 FORWARD
체인이 참조되지 않으며 ip_forward
제어가 전달에 영향을 미치지 않습니다. OpenVPN 프로세스 자체는 호스팅 OS와 별개로 자체 라우팅 테이블을 갖춘 라우터가 됩니다. 관리 인터페이스 명령을 사용하여 이를 확인 status
하거나 상태 파일에 덤프할 수 있습니다. 클라이언트의 파일이나 스크립트에서 생성된 동적 구성 iproute
에서만 유효한 지시문을 사용하여 이 "라우터" 내의 경로를 제어할 수 있습니다 ("내부 경로"를 의미한다고 생각합니다).client-config-dir
가장 쉬운 것은 VPN을 특별한 것으로 생각하지 않는 것입니다. 터널이 설정되면 잊어버리십시오. 이제 이는 각 컴퓨터(서버 및 클라이언트)에 추가 일반 인터페이스일 뿐이며 모든 인터페이스는 일반 단순 라우터에 연결됩니다. 그리고 일반적인 라우팅 및 방화벽을 고려하십시오.
마침내 당신이 다음 주소로 ping을 보낸다는 것을 알았습니다.VPN 서버 자체다른 인터페이스에 할당되었지만. 이 패킷은전달되지 않을 예정어쨌든 목적지는 서버 자체이기 때문에 ip_forward
이 패킷이 처리되는 방식에 영향을 주지 않으며 방화벽 체인을 통과 INPUT
하고 응답이 통과됩니다 OUTPUT
(예: FORWARD
시스템 자체를 대상으로 하지 않는 경우 체인이 아님). 패킷은 시스템으로 들어가고 시스템에서 볼 수 있지만 전송되지 않기 때문에 tun0
시스템에서는 볼 수 없습니다 . eth0
현지에서 처리됩니다. 답변의 경우에도 마찬가지입니다.
시스템에서 주소가 할당된 위치(인터페이스) 또는 액세스하는 데 사용하는 시스템의 주소는 중요하지 않습니다(라우팅 관련 코드). 중요한 것은 그것이 시스템에 속하는지 아닌지입니다.
관련 보안 문제는 일부 사람들이 서비스를 일부 인터페이스에 할당된 일부 IP 주소에 바인딩하면 다른 인터페이스를 통해 이 서비스에 대한 액세스가 차단된다고 생각한다는 것입니다.이것은 잘못된 것입니다.다른 인터페이스 뒤에 있는 다른 시스템에 서비스가 바인딩된 IP로의 경로가 있는 경우에도 여전히수있을 것입니다서비스에 액세스합니다. 이는 서비스를 보호하는 올바른 방법이 아닙니다. 적절한 방화벽 설정이 필요합니다.
또 다른 관련 문제는 일부 사람들이 ping -I <local-address> <address-to-ping>
또는 심지어 ping -I <interface> <address-to-ping>
어떤 인터페이스 핑이 나갈지 직접 선택한다고 생각한다는 것입니다. 다시 말하지만 이것은 잘못된 것입니다. 이렇게 하면 다음 중 하나만 선택할 수 있습니다.소스 주소핑은 있지만 이를 보낼 인터페이스는 없습니다. 인터페이스는 패킷의 대상 주소만을 기반으로 하는 라우팅 테이블에 따라 엄격하게 라우팅 코드에 의해 선택됩니다. (VRF 또는 RPDB 설정이 수행되지 않은 것으로 추정하지만 이는 고급 기능이며 설정한 사람들은 어쨌든 이 기능에 대해 알고 있습니다. ).