iptables 阻止来自 php 的传出请求
iptables block outgoing request from php
我们有一个 Ubuntu 服务器托管 php 服务器和游戏服务器。
最近,我们受到了很多 DOS 和洪水攻击。所以我发现一些 iptables 规则可以保护 http 和游戏端口免受攻击。
这是我的规则:
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m limit --limit 5/sec -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 443 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3724 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
但是当 php 想要向另一台服务器打开像 Soap WebService 这样的请求时,问题就出现了。并且 iptables 阻止了这个连接。
我认为问题出在这一行:
iptables -P INPUT DROP
但如果没有此行,则允许对所有其他端口的所有请求。
这是 php Soap 错误:
object(SoapClient)#48 (2) { ["_soap_version"]=> int(1) ["sdl"]=> resource(97) of type (Unknown) }
感谢您的所有评论。谢谢
问题在于传出连接使用随机本地端口来侦听回复。因此,例如,如果您在端口 53 上请求 DNS 条目,您的计算机将在端口 42316 上侦听数据。如果后一个端口被阻塞,如上述设置中的情况,连接将失败。
这很容易解决,通常允许状态为 ESTABLISHED 和 RELATED 连接的数据包。
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
此外,将其他规则更改为使用状态 NEW,因为这很可能是您要限制的内容。否则它只会削弱服务器的连接性。
我们有一个 Ubuntu 服务器托管 php 服务器和游戏服务器。 最近,我们受到了很多 DOS 和洪水攻击。所以我发现一些 iptables 规则可以保护 http 和游戏端口免受攻击。
这是我的规则:
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m limit --limit 5/sec -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 443 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3724 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-upto 15 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
但是当 php 想要向另一台服务器打开像 Soap WebService 这样的请求时,问题就出现了。并且 iptables 阻止了这个连接。
我认为问题出在这一行:
iptables -P INPUT DROP
但如果没有此行,则允许对所有其他端口的所有请求。
这是 php Soap 错误:
object(SoapClient)#48 (2) { ["_soap_version"]=> int(1) ["sdl"]=> resource(97) of type (Unknown) }
感谢您的所有评论。谢谢
问题在于传出连接使用随机本地端口来侦听回复。因此,例如,如果您在端口 53 上请求 DNS 条目,您的计算机将在端口 42316 上侦听数据。如果后一个端口被阻塞,如上述设置中的情况,连接将失败。
这很容易解决,通常允许状态为 ESTABLISHED 和 RELATED 连接的数据包。
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
此外,将其他规则更改为使用状态 NEW,因为这很可能是您要限制的内容。否则它只会削弱服务器的连接性。