/etc/sysconfig/iptables의 설정은 다음과 같습니다.
#start of my iptables
# Generated by iptables-save v1.2.11 on Wed May 27 00:31:22 2015
*mangle
:PREROUTING ACCEPT [130933577:29488298585]
:INPUT ACCEPT [130933577:29488298585]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [171790648:176814024859]
:POSTROUTING ACCEPT [171789023:176813945079]
COMMIT
# Completed on Wed May 27 00:31:22 2015
# Generated by iptables-save v1.2.11 on Wed May 27 00:31:22 2015
*filter
:INPUT ACCEPT [130907005:29486700773]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [171789023:176813945079]
-A INPUT -s 117.21.191.0/255.255.255.0 -j DROP
-A INPUT -s 106.0.210.78 -j DROP
-A INPUT -s 58.218.0.0/255.255.0.0 -j DROP
-A INPUT -s 117.3.215.251 -j DROP
-A INPUT -s 119.97.146.0/255.255.255.0 -j DROP
-A INPUT -s 203.185.69.45 -j DROP
-A INPUT -s 58.18.172.0/255.255.255.0 -j DROP
-A OUTPUT -p tcp -m tcp --dport 6660:6669 -j DROP
-A INPUT -p tcp -s my_static_ip --dport 22 -j ACCEPT
-A INPUT -p tcp -s my_static_ip --dport 21 -j ACCEPT
-A INPUT -p tcp -s my_static_ip --dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp ! -s my_static_ip -j DROP
COMMIT
# Completed on Wed May 27 00:31:22 2015
# Generated by iptables-save v1.2.11 on Wed May 27 00:31:22 2015
*nat
:PREROUTING ACCEPT [8063847:452240147]
:POSTROUTING ACCEPT [3324733:239203840]
:OUTPUT ACCEPT [3324733:239203840]
COMMIT
# Completed on Wed May 27 00:31:22 2015
# end of my iptables
my_static_ip는 Linux 서버에 연결하는 데 사용하는 IP 주소입니다(예: 100.10.10.10).
기본적으로 ssh, ftp, pop 등에 액세스하려는 악의적인 IP와 봇이 많기 때문에 ssh, ftp를 사용하고 이메일을 보내고 보내기 위해 내 IP 중 하나만 내 서버에 연결하도록 허용하고 싶습니다. 내 서버의 모든 사람이 HTTP와 SSL을 사용할 수 있어야 합니다.
위의 설정을 사용하면 이메일을 받거나 보낼 수 없다는 점을 제외하고는 모든 것이 정상입니다. 내가 뭘 잘못하고 있는지 말해 줄 수 있나요?
도움을 주셔서 미리 감사드립니다.
답변1
이메일 전송은 일반적으로 포트 25(SMTP), 465(SSL을 통한 SMTP) 및/또는 587(제출)을 사용합니다. 귀하의 구성에서 볼 수 있는 유일한 "이메일" 포트는 110(POP3)입니다. 이는 즐겨 사용하는 메일 클라이언트에서 이메일을 읽기 위한 클라이언트-메일 서버 프로토콜이지만 서버에서 이메일을 받거나 보내는 데 사용되지 않습니다. .
서버로 이메일을 받으려면 외부에서 위의 포트를 허용해야 하며, 서버를 통해 클라이언트에서 메일을 보낼 수 있으려면 고정 주소에서 이러한 포트를 허용해야 합니다.
답변2
먼저, 모범 사례에 대한 일반적인 의견은 다음과 같습니다.
더 나은 접근 방식은 IP에 대한 다른 체인과 리디렉션 필터를 만드는 것입니다.
-A INPUT -p tcp -s my_static_ip -j MYIP
그런 다음 다른 모든 필터를 MYIP
체인에 넣습니다. 부정적인 조항도 필요하지 않습니다 ! -s my_static_ip
. IP를 다른 체인으로 리디렉션한 후 다음 줄에서 다른 모든 것을 제거할 수 있습니다.
-A INPUT -p tcp -j DROP
sshguard
또는 하나의 주소를 제외한 모든 주소에 대한 액세스를 완전히 제한하지 않고 학대자를 차단하는 유사한 필터도 좋은 생각입니다 ssh
.
당신이 신뢰한다면 my_static_ip
, 당신은 그것을 완전히 통과시킬 수 있습니다.
이메일의 경우 어떤 프로토콜을 사용하고 있는지 알아야 합니다. 포트 110이 열려 있지만(암호화되지 않은 POP) SMTP 및/또는 IMAP가 필요할 수 있습니다.
이는 다음 설명으로 이어집니다. 어쨌든 모든 설정된 연결(http(s)뿐만 아니라)을 수락하면 아무런 문제도 발생하지 않습니다. 메일 서버에 대한 연결을 시작하는 사람(새 메일 확인 또는 메일 보내기)은 귀하이기 때문에 메일 서버는 자체적으로 귀하에게 연락하지 않고 귀하가 요청한 서비스만 제공합니다. 따라서 모든 ESTABLISHED를 허용하면 괜찮습니다. 많은 애플리케이션(메일 클라이언트뿐만 아니라)은 다양한 프로토콜을 사용하여 콘텐츠를 검색하며 모두 현재 구성을 손상시킵니다. 그냥 사용
-A INPUT -p tcp -m tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
그리고 보안을 손상시키지 않으면서 모든 시나리오를 다룰 수 있습니다. 새로 들어오는 연결은 끊어지지만 사용자 쪽에서 오는 트래픽은 통과가 허용됩니다.
편집하다:
내 제안이지만 테스트하지는 않았습니다.
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
:MYIP - [0:0]
##:sshguard - [0:0]
#accept established connections immediately
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#drop all invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP
#accept localhost (web interfaces and such)
-A INPUT -i lo -j ACCEPT
#pings and such
-A INPUT -p icmp -j ACCEPT
#special treatment of your ip
#whatever MYIP chain doesn't accept is still subjected to all the following
#rules - because of the dash in the :MYIP - line above.
#if you really trust MYIP, you can just use ACCEPT
-A INPUT -s my_static_ip -j MYIP
#split into individual chains for TCP and UDP packets, handle them separately
#in case you want to add specific rules for UDP and TCP things (like the http(s) acceptance below)
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
#reasonable defaults for dropping things
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
#if you have a web server, allow http(s):
-A TCP -p tcp -m tcp --dport 80 -j ACCEPT
-A TCP -p tcp -m tcp --dport 443 -j ACCEPT
#dropping these outbound ports?
-A OUTPUT -p tcp -m tcp --dport 6660:6669 -j DROP
#it's nice to let DNS through
-A UDP -p udp -m udp --dport 53 -j ACCEPT
#what to accept in your ip chain
#you don't even need mail ports here, because their requests don't come from outside
-A MYIP -p tcp --dport 22 -j ACCEPT
-A MYIP -p tcp --dport 21 -j ACCEPT
#alternative: install sshguard and uncomment these lines (and the chain definition in the header)
##-A TCP -p tcp -m tcp --dport 22 -j sshguard
##-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT