인바운드 액세스를 차단하도록 iptables를 구성한다고 가정합니다(포트 22 및 기타 몇 가지 포트 제외). 또한 다음 규칙에 따라 iptables가 집으로 전화하는 장난스러운 소프트웨어를 "밀고"할 수 있기를 원한다고 가정합니다.
iptables -A OUTPUT -p all -s $THIS_SERVER -m conntrack --state NEW -j LOG --log-prefix "OUTBOUND "
이것은 모두 훌륭하지만 SSH 터널 트래픽도 있는 경우 iptables를 사용하여 해당 트래픽을 다르게 처리하려면 어떻게 해야 합니까? 여기 나의 구체적인 예가 있습니다. 클라이언트가 다음을 수행할 수 있도록 sshd가 전달을 허용한다고 가정합니다.
ssh -D127.0.0.1:12345 uid@myserver -N
그런 다음 한쪽 끝에는 아웃바운드 요청을 할 수 있는 SOCKS 프록시가 있습니다 $THIS_SERVER
. 이는 허용하고 싶은 동작이지만 위에서 언급한 서버 자체에서 발생하는 트래픽과 다른 트래픽으로 기록하고 싶습니다(또는 전달된 이 트래픽을 전혀 기록하지 않을 수도 있음).
이것이 가능하다고 생각하시나요? 가능하다면 설명해주세요. 내가 하려는 것은 FORWARD 체인을 통해 두 번째 클래스를 캡처하는 것이지만 작동하지 않습니다. 두 트래픽 유형 모두 동일한 기준으로 선택된 것 같아서 구분할 수 없습니다. 이러한 SSH 터널 패킷을 상호 연결하는 방법이 있습니까?
의심의 여지를 없애기 위해 내 서버를 통해 SOCKS 프록시를 설정한 다음 Firefox를 여는 것과 관련된 로그 항목은 다음과 같습니다. UID=980
Linux 파서 사용자, UID=1000
SSH를 통해 터널링하는 원격 사용자 입니다 .
[15719.755667] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=62202 DF PROTO=UDP SPT=35744 DPT=53 LEN=53 UID=980 GID=980
[15719.755771] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=62203 DF PROTO=UDP SPT=32777 DPT=53 LEN=53 UID=980 GID=980
[15720.046668] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=95 TOS=0x00 PREC=0x00 TTL=64 ID=62256 DF PROTO=UDP SPT=33118 DPT=53 LEN=75 UID=980 GID=980
[15720.047446] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=34.210.48.174 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=520 DF PROTO=TCP SPT=34758 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 UID=1000 GID=1000
[15720.049736] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=34.210.48.174 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=1938 DF PROTO=TCP SPT=34760 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 UID=1000 GID=1000
[15720.614489] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=74 TOS=0x00 PREC=0x00 TTL=64 ID=62296 DF PROTO=UDP SPT=43834 DPT=53 LEN=54 UID=980 GID=980
[15720.614573] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=74 TOS=0x00 PREC=0x00 TTL=64 ID=62297 DF PROTO=UDP SPT=55510 DPT=53 LEN=54 UID=980 GID=980
[15720.615559] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=75 TOS=0x00 PREC=0x00 TTL=64 ID=62298 DF PROTO=UDP SPT=40906 DPT=53 LEN=55 UID=980 GID=980
[15728.039642] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=72 TOS=0x00 PREC=0x00 TTL=64 ID=63174 DF PROTO=UDP SPT=39308 DPT=53 LEN=52 UID=980 GID=980
[15728.039723] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=72 TOS=0x00 PREC=0x00 TTL=64 ID=63175 DF PROTO=UDP SPT=53907 DPT=53 LEN=52 UID=980 GID=980
[15729.529947] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=81 TOS=0x00 PREC=0x00 TTL=64 ID=63315 DF PROTO=UDP SPT=45694 DPT=53 LEN=61 UID=980 GID=980
[15729.530068] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=81 TOS=0x00 PREC=0x00 TTL=64 ID=63316 DF PROTO=UDP SPT=52263 DPT=53 LEN=61 UID=980 GID=980
[15729.896039] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=70 TOS=0x00 PREC=0x00 TTL=64 ID=63355 DF PROTO=UDP SPT=40457 DPT=53 LEN=50 UID=980 GID=980
[15729.896132] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=70 TOS=0x00 PREC=0x00 TTL=64 ID=63356 DF PROTO=UDP SPT=38307 DPT=53 LEN=50 UID=980 GID=980
[15730.189743] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=82 TOS=0x00 PREC=0x00 TTL=64 ID=63442 DF PROTO=UDP SPT=40521 DPT=53 LEN=62 UID=980 GID=980
[15730.189870] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=82 TOS=0x00 PREC=0x00 TTL=64 ID=63443 DF PROTO=UDP SPT=34444 DPT=53 LEN=62 UID=980 GID=980
[15730.190707] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=81 TOS=0x00 PREC=0x00 TTL=64 ID=63444 DF PROTO=UDP SPT=55549 DPT=53 LEN=61 UID=980 GID=980
[15730.192361] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=52.43.38.51 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=22080 DF PROTO=TCP SPT=60876 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 UID=1000 GID=1000
[15730.641766] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=81 TOS=0x00 PREC=0x00 TTL=64 ID=63507 DF PROTO=UDP SPT=54359 DPT=53 LEN=61 UID=980 GID=980
[15730.641890] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=81 TOS=0x00 PREC=0x00 TTL=64 ID=63508 DF PROTO=UDP SPT=52250 DPT=53 LEN=61 UID=980 GID=980
[15749.499230] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=87 TOS=0x00 PREC=0x00 TTL=64 ID=198 DF PROTO=UDP SPT=57205 DPT=53 LEN=67 UID=980 GID=980
[15749.499394] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=87 TOS=0x00 PREC=0x00 TTL=64 ID=199 DF PROTO=UDP SPT=45791 DPT=53 LEN=67 UID=980 GID=980
[15749.500301] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=116 TOS=0x00 PREC=0x00 TTL=64 ID=200 DF PROTO=UDP SPT=37022 DPT=53 LEN=96 UID=980 GID=980
[15749.500917] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=54.68.157.14 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=64708 DF PROTO=TCP SPT=43082 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 UID=1000 GID=1000
[15752.028535] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=81 TOS=0x00 PREC=0x00 TTL=64 ID=585 DF PROTO=UDP SPT=59245 DPT=53 LEN=61 UID=980 GID=980
[15752.028624] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=81 TOS=0x00 PREC=0x00 TTL=64 ID=586 DF PROTO=UDP SPT=55551 DPT=53 LEN=61 UID=980 GID=980
[15752.029484] OUTPUT:LOG,ACCEPT IN= OUT=eth0 SRC=$THIS_SERVER DST=$NAMESERVER LEN=75 TOS=0x00 PREC=0x00 TTL=64 ID=587 DF PROTO=UDP SPT=34032 DPT=53 LEN=55 UID=980 GID=980
답변1
SSH 터널에는 대상 포트 22가 있을 수 있으므로 해당 포트를 무시하도록 규칙에 지시할 수 있습니다.
iptables -A OUTPUT -p tcp --dport 22 -s $THIS_SERVER -m conntrack --state NEW -j ACCEPT
iptables -A OUTPUT -p all -s $THIS_SERVER -m conntrack --state NEW -j LOG --log-prefix "OUTBOUND "
답변2
결과를 얻는 한 가지 방법은 sshd
별도의 네트워크 네임스페이스에서 실행한 다음 들어오는 SSH 연결에 DNAT 터널링을 제공하고 해당 네임스페이스의 아웃바운드 트래픽에 NAT를 제공하는 것입니다. 이 설정에서는 sshd
별도의 (가상) 인터페이스에서 트래픽을 받게 됩니다.