这是我在 /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)。
基本上我只想允许我的一个IP连接到我的服务器以使用ssh、ftp、接收和发送电子邮件等,因为有许多滥用IP和机器人试图访问ssh、ftp、pop等。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。
这引出了我的下一条评论:如果您无论如何都接受所有 ESTABLISHED 连接(而不仅仅是 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