
두 개의 가상 인터페이스 쌍(veth0a & veth0b)을 생성하고 한 인터페이스(veth0b)의 끝을 새 네트워크 네임스페이스(netns0)에 할당한 Ubuntu 18.04 서버가 있습니다.
ip netns add netns0
ip netns exec netns0 ip link set lo up
ip link add veth0a type veth peer name veth0b
ip link set veth0b netns netns0
/usr/bin/firejail
그런 다음 Firejail을 사용하여 특정 사용자(test-user)가 이 사용자에 대한 기본 셸로 설정하고 파일에 다음을 추가하여 기본적으로 이 새 네임스페이스를 사용하도록 강제했습니다 /etc/firejail/login.users
.
test-user: --netns=netns0
이것이 작동하는지 확인하기 위해 다음 테스트를 실행했습니다.
tshark -i veth0a -f "port 443"
루트 계정에서 실행- 테스트 사용자로 서버에 SSH로 접속
curl https://1.1.1.1
SSH 사용자로 실행
tshark 출력에는 1.1.1.1 트래픽에 대한 적절한 veth0b 소스 IP 주소가 표시됩니다.
내가 겪고 있는 문제는 테스트 사용자 계정을 사용하여 SSH를 통해 양말5 동적 포트 전달을 설정하려고 할 때입니다.
ssh -D 10000 -q -C -N test-user@server_ip
내 노트북이나 워크스테이션에서 이 명령을 실행하면 포트 1000에 로컬 양말5 서버를 설정하고 SSH 연결을 통해 터널링할 수 있습니다. 이것을 내 로컬 양말5 프록시로 설정하면 https://api.ipify.org
프록시가 작동하고 있고 내 노트북이 서버의 IP 주소를 사용하고 있음을 보여줍니다.
문제는 sock5 트래픽이 적절한 네임스페이스를 통과하지 않는 것으로 보인다는 것입니다. 즉, 테스트 사용자 SSH 연결을 통해 양말5 서버에 연결되어 있는 동안 내 노트북에서 웹을 탐색하는 동안 내 트래픽이 tshark -i veth0a에 나타나지 않습니다.
포트 전달 터널에서도 Firejail을 사용하도록 하려면 추가 단계가 필요합니까? /etc/passwd의 셸 설정은 대화형 로그인 셸에만 영향을 줍니까? 사용자의 비대화형 셸도 로 변경해야 합니까 /usr/bin/firejail
? 그렇다면 어떻게 해야 할까요?
어떤 도움이라도 대단히 감사하겠습니다.
답변1
시도하는 것이 작동하지 않으며 그 이유를 설명하고 있습니다.
SSH 연결은 원격 서버의SSHD네트워크 네임스페이스가 아닌 호스트에서 실행되는 데몬입니다. 연결을 위한 인스턴스가 생성됩니다. 그런 다음 인증을 받고 터널이 설정됩니다.그 다음에사용자 세션이 설정되었습니다.
다음은 다음을 사용하여 SSH 클라이언트 버전 7.9p1로 실행한 예제에서 발췌한 것입니다 ssh -v -4 -D 10000 remoteuser@server
.
debug1: Offering public key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
debug1: Server accepts key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
debug1: Authentication succeeded (publickey).
Authenticated to server ([192.0.2.2]:22).
debug1: Local connections to LOCALHOST:10000 forwarded to remote address socks:0
debug1: Local forwarding listening on 127.0.0.1 port 10000.
debug1: channel 0: new [port listener]
debug1: channel 1: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = C.UTF-8
보시다시피 Local connections to LOCALHOST:10000 forwarded to remote address socks:0
...가 channel 0: new [port listener]
먼저 발생합니다.그 다음에 Entering interactive session
발생합니다. 이것은 일반적으로 호출됩니다방화 감옥등등, 너무 늦을 것입니다. 이전에 수행된 모든 작업은 호스트 네트워크 네임스페이스에서 발생합니다. 그러나 실제로 귀하의 경우에는 다음을 사용하고 있기 때문입니다 -N
.
-N
원격 명령을 실행하지 마십시오. 이는 포트를 전달하는 데 유용합니다.
어떤 쉘도 실행되지 않습니다.방화 감옥실행되지 않으며 대체 네트워크 네임스페이스가 전혀 건드리지 않습니다. -N
위에서 설명한 내용이 없더라도 어쨌든 문제가되지 않습니다 .
따라서 정말로 그렇게 하려면 별도의 SOCKS5 프록시가 필요하며 -D
더 이상 해당 옵션을 사용할 수 없습니다. 다음 인스턴스를 실행할 수 있습니다.SSHD또는 기타 SOCKS5 지원 도구(예:dante-server
) 네트워크 네임스페이스 내에서 다음을 사용하여 포트 리디렉션을 수행합니다.IP테이블,nftables, 또는 다음의 클래식 -L
옵션SSH리디렉션하려면veth0b의 IP와 이 SOCKS5 프록시의 수신 포트가 필요하지만 이는 아마도 단순한 것 이상의 것이 필요할 것입니다.방화 감옥그리고 일반 사용자. 이 시점에서는 다음에서 전체 설정을 실행하는 것이 좋습니다.체계화된, 또는 본격적으로LXC(또는LXD또는도커등) 컨테이너. ip netns
기능만으로도 충분할 때가 많습니다(참조:ip netns(iproute2)를 사용한 네임스페이스 관리).