iptables는 SSH 프록시를 통해 로컬이 아닌 트래픽을 전달합니다.

iptables는 SSH 프록시를 통해 로컬이 아닌 트래픽을 전달합니다.

SSH를 통해 로컬 포트에서 원격 시스템으로 트래픽을 전달하려고 합니다.대리(터널 아님). 나는 이것이 iptables 규칙만으로는 수행될 수 없다는 것을 배웠습니다(사실이 아니라면 정정해 주십시오). 그래서 TCP 연결을 SSH SOCKS 프록시로 리디렉션하도록 REDSOCKS를 설정했습니다.
OUTPUT 체인의 iptables 규칙을 사용하여 로컬 트래픽을 원격 시스템으로 전송했지만 PREROUTING의 동일한 개념이 작동하지 않습니다. 목표는 VPN과 같은 원격 시스템의 네트워크에 있는 것처럼 로컬 시스템이 외부 인터넷을 볼 수 있도록 하는 것입니다.

----------                      --------------
| inside |  <-- 10.0.0.0/24 --> |-> iptables |
----------                      |      |     |
                                |      ˇ     |
                                |   redsocks |
                                |      |     |
                                |      ˇ     |                  ----------
                                |     ssh -> | <-- internet --> | remote |
                                --------------                  ----------

참고: 저는 원격 시스템에서 어떤 작업(구성 변경, 경로 추가)도 하고 싶지 않습니다!

으로 SSH 연결이 설정되었습니다 ssh -D 1337 user@remote.
Redsocks는 이미 구성 및 시작되었으며 포트에서 수신 대기 중입니다 12345.

중간 기계에서:

OUTSIDE_INTERFACE=wlan0
INSIDE_INTERFACE=eth0
SSH_SOCKS_PORT=1337
REDSOCKS_PORT=12345

# set the ip address
ifconfig $INSIDE_INTERFACE 10.0.0.1 netmask 255.255.255.0

# enable ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# reset iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -F
iptables -X

# redirect local traffic, except traffic from redsocks to ssh
iptables -t nat -A OUTPUT -p tcp --dport $SSH_SOCKS_PORT -j RETURN
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT

# redirect traffic from inside
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT

그러면 로컬 컴퓨터의 트래픽이 리디렉션되고 원격 네트워크에 있는 것처럼 인터넷이 표시됩니다.
하지만 내부 기계는할 수 없다인터넷 접속.

(IP 주소는내부에머신은 이미 설정되었으며 성공적인 ping으로 테스트되었습니다.)

나는 시도했다:

  • iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp -j REDIRECT --to-ports 12345
  • 첨가iptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADE

만약 내가오직iptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADE규칙 을 정하다홀로, 내부 시스템은 인터넷에 액세스할 수 있습니다(그러나 프록시를 통해서는 액세스할 수 없음).

연결을 시도한 후 다음 통계가 표시됩니다.

# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 10 packets, 641 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   42  2184 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 12345

Chain INPUT (policy ACCEPT 43 packets, 2244 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 19 packets, 1164 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   18  1080 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1337
   18  1080 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 12345

Chain POSTROUTING (policy ACCEPT 46 packets, 2825 bytes)
 pkts bytes target     prot opt in     out     source               destination

내가 이해하는 바에 따르면 내부 시스템의 패킷도 리디렉션되지만 어딘가에서 손실된다는 의미입니다.


그리고 질문이 있어요

  • SSH 트래픽이 iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT규칙에 의해 리디렉션되지 않는 이유는 무엇입니까? 포트만 필터링했는데 $SSH_SOCKS_PORT..

iptables 흐름도

답변1

좋아, 문제는 iptables 규칙에 있지 않았거나 주로 없었습니다.
IPtables 리디렉션다음을 수행하십시오.

대상 IP를 기본 IP로 변경하여 패킷을 머신 자체로 리디렉션합니다.들어오는 인터페이스의 주소(로컬에서 생성된 패킷은 127.0.0.1 주소로 매핑됩니다.)

그리고 redsocks는 기본적으로 수신된 패킷만 수신합니다.127.0.0.1, 따라서 인터페이스 주소의 대상이 있는 패킷은 redsocks에 도착하지 않습니다.

redsocks 구성을 다음으로 변경한 후local_ip = 0.0.0.0;그것은 효과가 있었다.

(참고: TCP에만 해당되며 UDP(예: DNS)에는 추가 설정이 필요합니다.)

답변2

상황에 따라 redsock을 10.0.0.1로 모니터링한 다음 REDIRECT 또는 DNAT만 모니터링하면 됩니다.

iptables -t nat -A PREROUTING -p tcp -m tcp --syn -j DNAT --to 10.0.0.1:12345

나는 당신과 같은 문제에 직면했습니다. OUTPUT에 혼란스러워서 127.0.0.1에서 계속 듣고 있었습니다.

참조:동일한 서버의 양말 프록시로 VPN 연결 라우팅

관련 정보