在我的iptables脚本中,我一直在尝试编写尽可能细化的规则。我限制了允许哪些用户使用哪些服务,部分出于安全性考虑,一部分作为学习练习。
在运行3.6.2内核的Debian 6.0.6上使用iptables v1.4.16.2。
但是我遇到了一个我不太了解的问题。
所有用户的传出端口
这工作得很好。我没有任何通用的状态跟踪规则。
##出口端口81 $ IPTABLES -A输出-p tcp –dport 81 -m conntrack –ctstate新的,已确定的-j接受 $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate已建立-j接受
用户匹配的出站端口
##用户帐户的传出端口80 $ IPTABLES -A输出-匹配所有者--uid-owner用户帐户-p tcp --dport 80 -m conntrack --ctstate新创建的--sport 1024:65535 -j接受 $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024:65535 -d $ MYIP -m conntrack --ctstate已建立-j接受
这仅将端口80拨出给帐户“ useraccount”,但是TCP流量这样的规则存在问题。
##默认传出日志+阻止规则 $ IPTABLES -A OUTPUT -j LOG --log-prefix“ BAD OUTGOING” --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A输出-j DROP
问题
上面的作品,用户“ useraccount”可以很好地获取文件。系统上的其他用户都无法建立到端口80的传出连接。
useraccount @ host:$ wget http://cachefly.cachefly.net/10mb.test
但是上面的wget在我的系统日志中留下了x7删除的条目:
10月18日02:00:35 xxxx内核:BAD OUTGOING IN = OUT = eth0 SRC = xx.xx.xx.xx DST = 205.234.175.175 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 WINDOW = 979 RES = 0x00 ACK URGP = 0
对于类似的UDP流量规则,我不会得到这些丢弃。我已经制定了限制哪些用户可以发出DNS请求的规则。
丢弃的传出ACK数据包似乎来自我不了解的根帐户(URGP = 0)。即使当我将useraccount换成root时。
我认为ACK数据包被归类为新消息,因为conntrack在3向握手的第3步之后开始跟踪连接,但是为什么会被丢弃呢?
这些下降可以安全地忽略吗?
编辑
因此,我经常看到这样的规则,这些规则对我来说很有效:
$ IPTABLES -A输出-s $ MYIP -p tcp -m tcp --dport 80 -m状态-状态NEW,已建立-j接受 $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m状态--state已建立-j接受
我将“ -m state --state”替换为“ -m conntrack --ctstate”,因为状态匹配显然已经过时了。
拥有通用状态跟踪规则是最佳实践吗?上面的规则不正确吗?
要严格控制传出用户的连接,这样会更好吗?
$ IPTABLES -A INPUT -m conntrack --ctstate已建立-j接受 $ IPTABLES -A输出-m conntrack --ctstate已建立-j接受 $ IPTABLES -A输出-p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner useraccount -j ACCEPT $ IPTABLES -A输出-p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner otheraccount -j ACCEPT