iptables 을 이용한 포트포워딩 문제
글쓴이: ikpil / 작성시간: 화, 2013/12/03 - 12:07오전
iptables-script.sh
#!/bin/bash iptables -F iptables -t nat -F iptables -t mangle -F iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 220.137.77.121 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # port forward iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.3:80 # firewall iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW -i eth1 -j ACCEPT iptables -P INPUT DROP # save service iptables save service iptables restart
문제점은 외부에서 http://web.qqq.com 으로 접속하면, 192.168.0.3:80 의 웹서버에 접속 되어 잘 됩니다.
그런데 내부(192.168.0.24)에서 http://web.qqq.com 으로 하면, 192.168.0.3:80 에 접속을 못하고, 계속 없는 페이지라고 나옵니다.
환경
1. CentOS 6.5
2. eth0 - 공인 아이피(220.137.77.121)
3. eth1 - 사설 아이피(192.168.0.1),
4. iptables-script.sh 를 실행하여, 룰을 적용하고 저장하고 있습니다.
5. 이 머신으로 인터넷 공유를 하고 있으며, eth1 으로 DHCPD 데몬을 구동하고 있습니다.
Forums:
우선 6번째 줄의 규칙은 주석처리해도 되는 것
우선 6번째 줄의 규칙은 주석처리해도 되는 것 같습니다. 그 아랫줄의 MASQUERADE 규칙에서 저절로 처리될 겁니다
그리고, 원하시는 바가 이뤄지려면 port forward 규칙이 아래와 같이 바뀌면 될 것 같습니다.
이 경우 내부PC로부터 웹서버로 가는 패킷은 CentOS 서버의 iptables를 거쳐갈 수밖에 없지만, 웹서버로부터의 응답은 아마도 CentOS 서버 거치지 않고 내부PC로 바로 가게 될 것 같네요. 모로 가도 서울만 가면 되니 별 상관 없겠죠.. 궁금하시면 패킷캡처로 확인해보시면 될 것입니다.
먼저 답변 주셔서 무척 감사합니다. 말씀하신데로,
먼저 답변 주셔서 무척 감사합니다.
말씀하신데로, 6번째 줄은 주석처리해도 인터넷 공유가 정상 처리되었습니다. 감사합니다.
그리고 다음처럼 처리 했을 때, 한발 더 진전 되었으나, 원하는 바를 얻지는 못했습니다.
이전 룰에서는 192.168.0.3:80 에 접근도 못했으나, 바꾼 후 접근은 하나 192.168.0.3 서버에서SYN_RECV 대기 합니다.
netstat -anput 하면 다음처럼 나옵니다. 192.168.0.24 유저가 192.168.0.3 서버에 접속할 때, 다음처럼 나오고 대기합니다.
대안으로 내부 네임서버를 두어서 접속하게 하는 방법이 떠오르는데, 이렇게 하면 문제를 풀기 보다는
우회한다는 생각이 들어, 방법을 더 찾고 싶습니다.
http://www.ikpil.com
아마 웹서버의 응답패킷이 로컬PC로 도달했겠지만
아마 웹서버의 응답패킷이 로컬PC로 도달했겠지만
로컬PC에서 그 응답패킷을 해당 소켓에 대응시켜주지 않는 문제인 것 같습니다.
보내는 패킷은 192.168.0.24:26978 -> 220.137.77.121:80 주소를 달고 갔는데
응답패킷은 192.168.0.3:80 -> 192.168.0.24:26978 식의 주소를 달고 오기 때문이겠고요.
거기까지는 생각을 못했네요..
아래의 SNAT 규칙을 DNAT 아래쪽에 넣으면 응답패킷도 CentOS의 iptables를 거쳐 오지 않을까 싶은데요.
제가 유사한 규칙을 쓰고 있기는 한데, 이렇게 같은 서브넷을 대상으로 SNAT를 써보지는 않아서 자신은 없네요.
정말 감사합니다. 테스트 완료 했습니다.
정말 감사합니다. 테스트 완료 했습니다.
http://www.ikpil.com
잘 된다니 다행이네요. 그리고, 이전 답변에서
잘 된다니 다행이네요.
그리고, 이전 답변에서 아래의 두 규칙중 첫번째 것을 제거하고 두 번째 것을 쓰시라 권했습니다만,
사실 둘 중 어떤 것을 쓰셔도 됩니다.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 220.137.77.121
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
공인IP를 동적으로 받아 쓰신다면 MASQUERADE 말고는 선택지가 없겠지만
고정IP로 쓰시는 중이니 둘 다 무방하고, 오히려 첫 번째 것이 더 적절하겠습니다.
네. 현재 아무런 문제가 발견되지 않아 두번째 룰로
네. 현재 아무런 문제가 발견되지 않아 두번째 룰로 유지하고 있습니다.
회사에서 인터넷이 자꾸 끊어져서 매우 불편했는데, 더이상 끊어지지 않아
매우 편하게 이용하고 있습니다.
다시 한번 감사합니다.
http://www.ikpil.com
댓글 달기