포트 23006만 수신할 수 있는 서버가 있습니다. 외부에서 포트 443을 통해 액세스하고 싶습니다.
systemctl 설정이 있습니다.
$ sudo sysctl --system
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /usr/lib/sysctl.d/99-protect-links.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.pid_max = 4194304
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.route_localnet = 1
포트 443에서 수신 대기하기 위해 다른 테스트 서버를 실행하면 작동하며 외부에서 액세스할 수 있습니다. 하지만 이는 테스트 서버일 뿐 실제 서버 프로그램은 아닙니다.
socat을 실행하면:
sudo nohup socat TCP-LISTEN:443,pktinfo,fork TCP:127.0.0.1:23006
작동하고 외부에서 액세스할 수 있습니다. 하지만 내 서버에는 클라이언트의 실제 IP 주소가 표시되지 않습니다.
포트 23006에서 컬을 실행하면 실제 서버가 응답합니다.
$ curl 127.0.0.1:23006
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.24.0</center>
</body>
</html>
이 iptables 명령을 실행하면:
sudo iptables -t nat -A OUTPUT -o lo -p tcp --dport 443 -j REDIRECT --to-port 23006
그런 다음 포트 443을 통해 내 서버에 액세스할 수도 있지만 로컬에서만 가능합니다.
$ curl 127.0.0.1:443
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.24.0</center>
</body>
</html>
문제는 포트 443을 통해 외부에서 내 서버에 액세스할 수 없다는 것입니다. 도와주세요. 미리 감사드립니다.
답변1
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 23006
답변2
리디렉션하고 싶다면들어오는교통이 불편하면 PREROUTING
체인을 이용하세요.
또한 리디렉션을 원할 경우 대신 mangle
또는 nat
테이블을 사용하는 것이 좋습니다.