원격 SSH 로그인이 작동하지 않습니다

원격 SSH 로그인이 작동하지 않습니다

SSH 포트 22로 포트 전달이 설정된 라우터 뒤에 컴퓨터가 있고 완벽하게 작동합니다. 로그인하여 모든 작업을 수행할 수 있습니다. 내가 원하는 것은 이 컴퓨터를 VPN에 연결하고 로컬 네트워크 또는 VPN 연결(인터넷 액세스용)을 통한 트래픽만 허용하는 것입니다. 이것도 훌륭하게 작동합니다. VPN 연결이 끊어지면 PC를 인터넷에 연결할 수 없습니다. 이제 IPTABLES를 사용하여 이 작업을 수행하고 있습니다. 문제는 라우터 포트 전달을 통해 외부 소스에서 들어오는 SSH를 얻을 수 없다는 것입니다. 로컬 네트워크 내에서 컴퓨터에 SSH를 통해 연결할 수 있습니다.

내가 시도한 것은 다음과 같습니다.

# Allow traffic to VPN SERVER
sudo iptables -A INPUT -s $REMOTE_IP -j ACCEPT

# Allow ssh traffic
iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT    
iptables -A OUTPUT -o eth1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# Allow local traffic.
sudo iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -s 172.16.0.0/12 -j ACCEPT
sudo iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT

# Disallow everything else.
sudo iptables -A INPUT ! -i tun+ -j DROP

# Allow traffic from VPN SERVER.
sudo iptables -A OUTPUT -d $REMOTE_IP -j ACCEPT

# Allow local traffic.
sudo iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
sudo iptables -A OUTPUT -d 172.16.0.0/12 -j ACCEPT
sudo iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT

# Disallow everything else.
sudo iptables -A OUTPUT ! -o tun+ -j DROP

sudo openvpn --config client.cfg --auth-user-pass client.cred --daemon

이것은 내 iptables -vL -n 출력입니다. (VPN 서버를 XX.XX.XX.XX로 교체)

Chain INPUT (policy ACCEPT 25674 packets, 4792K bytes)
 pkts bytes target     prot opt in     out     source               destination         
78848   11M ACCEPT     all  --  *      *       XXX.XXX.XXX.XXX      0.0.0.0/0           
 3176  318K ACCEPT     tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 state NEW,ESTABLISHED 
    0     0 ACCEPT     all  --  *      *       10.0.0.0/8           0.0.0.0/0           
    0     0 ACCEPT     all  --  *      *       172.16.0.0/12        0.0.0.0/0           
 2517  231K ACCEPT     all  --  *      *       192.168.0.0/16       0.0.0.0/0           
   35 12374 DROP       all  --  !tun+  *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 32187 packets, 4374K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 3681 2443K ACCEPT     tcp  --  *      eth1    0.0.0.0/0            0.0.0.0/0           tcp spt:22 state ESTABLISHED 
70697   10M ACCEPT     all  --  *      *       0.0.0.0/0            XXX.XXX.XXX.XXX      
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            10.0.0.0/8          
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            172.16.0.0/12       
   27  5787 ACCEPT     all  --  *      *       0.0.0.0/0            192.168.0.0/16      
 2265  150K DROP       all  --  *      !tun+   0.0.0.0/0            0.0.0.0/0

예, ifconfig를 수행하면 eth1만 있고 eth0은 없으므로 그렇지 않습니다.

이것은 또한 netstat -rn의 출력입니다.

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         XX.XXX.242.128  128.0.0.0       UG        0 0          0 tun0
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth1
XX.XXX.193.107  192.168.1.1     255.255.255.255 UGH       0 0          0 eth1
XX.XXX.242.0    0.0.0.0         255.255.255.0   U         0 0          0 tun0
128.0.0.0       XX.XXX.242.128  128.0.0.0       UG        0 0          0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1

답변1

Penguin359가 올바르게 말했듯이 문제는 반환 패킷이 로컬 라우터를 통하지 않고 VPN을 통해 라우팅된다는 것입니다(수신 연결은 로컬 라우터에서 옵니다). 라우터의 SNAT가 하나의 솔루션이지만 이것이 가능하지 않은 경우 PC에서 고급 라우팅을 사용할 수 있습니다.

기존 iptables 규칙 외에도 다음과 같은 고급 라우팅 규칙을 추가해야 합니다.

ip rule add from 192.168.1.X table 128
ip route add table 128 to 192.168.1.0/24 dev eth1
ip route add table 128 default via 192.168.1.1

192.168.1.X를 PC의 LAN IP 주소로 바꾸세요. 192.168.1.1은 LAN의 라우터이고 192.168.1.0/24는 LAN의 서브넷입니다.

첫 번째 명령은 소스 주소가 192.168.1.X인 모든 패킷이 다음을 사용하도록 규칙을 만듭니다.특수 라우팅 테이블번호는 128입니다. 다음 두 명령은 기본 게이트웨이가 라우터(기본 라우팅 테이블의 VPN 서버가 아님)인 라우팅 테이블 128을 만듭니다.

소스 주소가 192.168.1.X인 유일한 패킷은 라우터에서 들어오는 연결(즉, 포트 전달 SSH 연결)과 LAN으로 향하는 패킷에 응답하는 패킷입니다. 이는 VPN에서 원하지 않는 패킷입니다. 다른 모든 나가는 패킷은 서로 다른 소스 주소를 가지며 VPN을 통해 라우팅하는 기본 라우팅 테이블을 사용합니다.

답변2

명확히 말하면 VPN이 실행되는 동안 외부 소스의 SSH는 중단되지만 VPN이 실행되기 전에는 모든 소스의 SSH가 제대로 작동합니다. 문제는 라우팅 테이블에 있습니다. 위와 같이 기본 경로( 0.0.0.0)는 으로 이동합니다 tun0. 나는 흥미로운 넷마스크가 무엇을 하는지 이해하지 못하지만 128.0.0.0이로 인해 1-126으로 시작하는 외부 주소가 사용됩니다 tun0. SSH를 사용하면 들어오는 패킷이 어디서 오는지는 중요하지 않으며 나가는 패킷은 라우팅 테이블의 일치하는 위치에서만 나갑니다. 나는 이 이상한 구성을 직접 해보았다. 이러한 유형의 문제에 대한 표준 솔루션은 들어오는 SNAT 규칙을 사용하여 들어오는 패킷의 소스 주소를 라우터의 내부 IPv4 주소로 변경하는 것입니다. 이렇게 하면 PC에 대한 내부 연결로 나타나며 위 라우팅 테이블의 로컬 대상에 상주하므로 라우터로 다시 라우팅됩니다. 그런 다음 라우터는 SNAT를 역전시켜 모든 사악한 해커가 냄새를 맡고 찌르도록 야생으로 다시 보냅니다. 규정에 따라 SNAT는 iptables네트워크 내의 PC가 아닌 라우터에 존재해야 합니다. 일반 Linksys WRT 라우터와 같은 것을 사용하는 경우 방화벽/NAT 규칙을 제어하려면 OpenWRT 또는 이와 유사한 라우터를 설치해야 할 것입니다.

관련 정보