포트 22를 특정 인터페이스로 전달

포트 22를 특정 인터페이스로 전달

저는 특정 컴퓨터에 세 개의 별도 인터페이스가 있는 상황에 있습니다. 연결된 각 네트워크는 서버가 (네트워크 기반 라우팅/방화벽을 통해) 특정 서비스만 제공하도록 허용합니다. 분명히 클라이언트는 다양한 서브넷에서 연결할 수 있으며 네트워크 방화벽을 사용하여 클라이언트에 대한 액세스를 제어합니다.

관리 인터페이스는 SSH 트래픽을 허용하지만 클라이언트가 연결하려면 기본 경로가 관리 네트워크의 게이트웨이로 설정되어야 합니다. 이는 SSH를 중심으로 작동하지만 프로덕션 인터페이스를 통해서만 허용되는 HTTP 서비스를 중단합니다. 세 번째 인터페이스는 백업 인터페이스이지만 해당 인터페이스에 대한 모든 트래픽은 동일한 서브넷에 있습니다.

라우팅 테이블은 다음과 같습니다.

[root@xxxcpr2 ~]# ip route
10.19.1.0/24 dev eth0 proto kernel scope link src 10.19.1.10
10.18.29.0/24 dev eth1 proto kernel scope link src 10.18.29.25
192.168.5.0/24 dev eth2 proto kernel scope link src 192.168.5.35
default via 10.18.29.1 dev eth1

그중 eth0은 관리 인터페이스, eth1은 프로덕션 인터페이스, eth2는 백업 인터페이스입니다.

기본적으로 제가 달성하고자 하는 것은 모든 포트 22 트래픽에 대한 기본 게이트웨이가 관리 인터페이스 외부로 라우팅되지만 직접 연결된 서브넷 외부의 다른 모든 트래픽은 프로덕션 인터페이스 외부로 라우팅되어야 한다는 것입니다. 기본적으로 원하는 것의 90%를 달성했습니다. SSH 트래픽에 대한 예외를 추가하고 싶습니다.

내가 찾은이것그러나 나는 그것을 작동시킬 수 없습니다. 어쩌면 내 이해가 부족하거나 RHEL과 Ubuntu 사이에 약간의 차이점이 있을 수도 있습니다. main테이블의 기본 게이트웨이는 이미 프로덕션 인터페이스 밖으로 나가도록 설정되어 있으므로 내가 한 일은 다음과 같습니다 .

# echo 1 > /proc/sys/net/ipv4/ip_forward
# ip route add table 22 default via 10.19.1.1
# iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
# ip rule add fwmark 22 table 22
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.18.29.25
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.19.1.10

내 생각으로는(누군가 이것이 잘못되었다고 지적할 수도 있음) 패킷에 태그를 지정하고 표 22를 사용하여 규칙을 생성하는 것이 작동할 것입니다(원래 게시물이 왜 언급되었는지는 모르겠지만 SNAT완전성을 위해 가능한 한 많이 복제하려고 했습니다). 하지만 main테이블의 기본 경로를 변경하지 않으면 연결 시간이 계속 초과됩니다.

기본적으로 이 시점에서는 내가 이해하지 못하거나 간과하고 있는 점을 지적해 줄 사람이 필요합니다.

답변1

들어오는 SSH 연결의 경우(연결 추적 없음)

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 22

나가는 SSH 연결의 경우(연결 추적 없음)

iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 22

--port대신 및 --dport다음을 사용하여 결합 할 수 있어야 합니다 .--sport

연결 추적을 사용하는 것이 더 나은 방법일 수 있지만 위의 규칙은 시작하는 데 도움이 될 것입니다.

답변2

들어오는 SSH 트래픽에 대해 가지고 있는 유사한 설정을 기반으로 하는 보다 완전한 방화벽 규칙 세트입니다.

테스트하기 전에 기존 iptables 규칙을 새로 고치십시오.

iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m multiport --ports 22  -m state --state NEW  -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp -m multiport --ports 22  -m state --state NEW  -j ACCEPT

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -N MarkThem -t mangle
iptables -t mangle -A OUTPUT -p tcp -m tcp -m multiport --ports 22  -j MarkThem
iptables -t mangle -A PREROUTING -p tcp -m tcp -m multiport --ports 22  -j MarkThem
# May need to filter out local LAN connections here.
# But try without filtering first.
# iptables -t mangle -A MarkThem  -s 10.18.29.0/24   -j RETURN
# iptables -t mangle -A MarkThem  -s 10.19.1.0/24   -j RETURN
# iptables -t mangle -A MarkThem  -s 192.168.5.0/24   -j RETURN
iptables -t mangle -A MarkThem  -j MARK --set-mark 22
iptables -t mangle -A MarkThem  -j CONNMARK --save-mark

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.18.29.25
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.19.1.10

포트 22의 소스 또는 대상과 일치하도록 규칙을 명시적으로 설정했습니다. 특정 기능이 제대로 작동하면 방화벽 규칙을 강화할 수 있습니다.

-b나가는 SSH 연결을 테스트할 때 바인드 주소를 지정하고 선택적으로 관리 주소에서 발생하는 트래픽에 대해 작동하는지 확인하는 것이 좋습니다 .

SSH -b 10.19.1.10[이메일 보호됨]

관련 정보