좋은 오후에요. Ubuntu 서버를 사용하여 프로젝트를 진행 중이며 3개의 VM이 설정되어 있습니다. 현재로서는 방화벽, 라우터 및 클라이언트(1)입니다. 현재 퍼티를 사용하여 방화벽에 SSH로 연결할 수 있고 라우터로 SSH로 연결할 수 있으며 마지막으로 클라이언트에 SSH로 연결하여 코드를 작성하고 컴파일할 수 있습니다.
내가 알고 싶은 것은 추가 SSH를 사용하지 않고 클라이언트에 직접 SSH를 연결할 수 있는 방법입니다.
고마워요 케이봇
편집: sudo iptables -t nat -v -x -n -L
방화벽의 출력:
Chain PREROUTING (policy ACCEPT 1217 packets, 108875 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 2 packets, 136 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 11 packets, 783 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 6 packets, 406 bytes)
pkts bytes target prot opt in out source destination
35 2218 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
답변1
첫째, 방화벽이 이미 라우터 기능을 구현하고 있으므로 방화벽과 라우터 서버를 하나의 서버로 병합하는 것이 좋습니다.
방화벽에 대한 SSH 기능을 유지하면서 외부 세계의 SSH 기능을 클라이언트에 직접 추가하고 싶다고 가정해 보겠습니다. iptables 규칙 세트가 원하는 것을 결정하는 유일한 방법이므로 목적에 따라 다른 포트를 사용해야 합니다. 저는 포트 2222를 사용하겠지만 여러분은 원하는 무료 포트를 사용하세요.
nat 테이블에 PREROUTING 규칙이 필요합니다.
sudo iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 2222 -j DNAT --to $INTIP:22
여기서 $EXTIF는 외부 네트워크 인터페이스 이름입니다. 내 생각엔 eth0인 것 같아. $INTIP는 내부 IP 주소입니다.
또한 트래픽이 FORWARD 체인을 통과하도록 허용해야 합니다. 기본 정책은 DROP이므로 다음과 같아야 합니다.
sudo iptables -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 2222 -d $INTIP -m state --state NEW -j LOG --log-prefix "PFNEW2222:" --log-level info
sudo iptables -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 2222 -d $INTIP -m state --state NEW -j ACCEPT
여기서 $INTIF는 내부 네트워크 인터페이스 이름입니다. 내 생각에는 eth1이다.
로깅 규칙도 있다는 점에 유의하세요. 그냥 제안입니다.
반환 경로가 정상이어야 합니다.
기타 제안사항:
기본 정책이 ACCEPT이므로 현재 OUTPUT 체인 규칙이 필요하지 않습니다.
외부 IP 주소(아래 $EXTIP)를 알고 있는 경우 MASQURADE 대신 SNAT를 사용하세요.
sudo iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP
그렇지 않다면 OK
이미 전달이 활성화되어 있다고 가정합니다.
$ cat /proc/sys/net/ipv4/ip_forward
1