[질문]특정포트 접속을 특정 IP 만 접속하도록 하는 쉬운 방법

panda9의 이미지

ipfwadm, ipchains 를 쓰지 않고 tcp wrapper 처럼
간단히 설정파일을 이용해 특정 포트로 오는 ip 중 선택한 것만
접속하도록 하는 방법이 있나요?

ipfwadm, ipchains 를 이용하려 했는데 정확히 이해가
되질 않아 시간을 두고 공부를 할 생각인데 그 전에
위와 같이 하고 싶은데 쉬운 방법은 없을까요?

제어하고자 하는 포트는 1500~1600 대 입니다.

고수님들의 조언 부탁드립니다.

무한포옹의 이미지

힘들겠죠..

tcpwrapper를 쓰면 프로그래밍할때 libwrap을 적용해야하고.

ip{chains,tables}가 가장 간단합니다

-------------------------------
== warning 대부분 틀린 얘기입니다 warning ===

송지석의 이미지

/etc/hosts.allow , hosts.deny

파일을 사용하시면 되실지도... 라고 생각했지만 이게 tcp wrapper를 사용하는 건가보군요.

일단 iptables를 쓰신다면

다음 스크립트가 도움이 될 겁니다. kltp.kldp.org에서 가져왔었는뎅...

#!/bin/sh

# 모듈을 올린다.
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_mangle
# 우선 모든 Rule을 정리한다.

/sbin/iptables -F

/sbin/iptables -A INPUT -m state --state RELATED -j ACCEPT

# localhost에서의 traffic을 받아들인다.

/sbin/iptables -A INPUT -i lo -j ACCEPT

# 119, 118에서의 연결을 모두 받아들인다. 

/sbin/iptables -A INPUT -s 192.168.1.118 -j ACCEPT

/sbin/iptables -A INPUT -s 192.168.1.119 -j ACCEPT

#donkey를 위해 사용하는 포트들을 열어준다.
/sbin/iptables -A INPUT -p tcp --destination-port 4661 -j ACCEPT #상대편에서 보내는 것 중에 내 4661 포트를 접속하는 패킷을 열어준다.
/sbin/iptables -A INPUT -p tcp --source-port 4661 -j ACCEPT  # 상대편이 보내는 것 중에 그쪽 포트가 4661인 패킷을 받아준다
/sbin/iptables -A INPUT -p tcp --destination-port 4662 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --source-port 4662 -j ACCEPT
/sbin/iptables -A INPUT -p udp --destination-port 4665 -j ACCEPT
/sbin/iptables -A INPUT -p udp --source-port 4665 -j ACCEPT

# x manager port 6000
/sbin/iptables -A INPUT -p tcp --destination-port 6000 -j ACCEPT

# 확립된 연결에 대한 Packet을 받아들인다.
/sbin/iptables -A INPUT -i eth0 -p tcp ! --syn -j ACCEPT
# 인증 연결을 거부한다(그렇지 않을 경우 메일서버가 오랫동안 타임아웃 상태가 될 것이다.)
/sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 113 -j REJECT

# echo나 목적지에 도착 못하거나 시간 초과된 icmp packet들을 받아들인다.

/sbin/iptables -A INPUT -i eth0 -p icmp --icmp-type 0 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --icmp-type 3 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp --icmp-type 11 -j ACCEPT

# 다음으로 각각에 대한 정책을 세운다.
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT

/sbin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP
/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

만약에 특정 ip마다 포트를 달리 열어주려면
ACCEPT 부분중에
/sbin/iptables -A INPUT -s 192.168.1.120 -p tcp --destination-port 22 -j ACCEPT
하면 120번에서 내게 ssh 접속하는 것을 열어줄 수 있죠.
/sbin/iptables -A INPUT -s 192.168.1.120 -p tcp --destination-port 1500 -j ACCEPT
해주면 1500 포트를 열어주고요 뭐 기타등등..

이걸 스크립트로 만들어서 루트계정으로 실행시키면 됩니다.

/etc/rc.d/rc.local에 이 스크립트를 실행하게 하면 부팅시에 자동으로 실행됩니다.