我尝试根据两条规则对 www 数据包进行简单的限制:
- 允许入站/出站 www 数据包。(这有效。)
- 降低从 1024 以下的源端口到端口 80 的入站流量。(这不起作用。)
现在,从技术上讲,当我使用 hping 来测试我的规则时,
hping3 192.168.100.100 -S -p80 -s 1023
我应该不是接收任何数据包。但是,我仍然接收数据包,这意味着我关于丢弃 1024 以下端口数据包的规则不起作用。
有人知道为什么吗?
这是我目前在 shell 脚本中的 iptables 规则:
##!/bin/sh
INTERNET=eth0
SERVER_IP="192.168.7.100"
ALLOWED_WWW_PORT=80
IPT="/sbin/iptables"
clear
# Flushing all rules
$IPT -F
$IPT -X
# DROP all incomming traffic
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# Drop inbound traffic to port 80(http) from source ports less than 1024
$IPT -A INPUT -p tcp -i $INTERNET -s 0/0 --sport 0:1023 -d $SERVER_IP --dport 80 -j DROP
# Permit inbound www(80) packets.
$IPT -A INPUT -p tcp -i $INTERNET -s 0/0 -d $SERVER_IP --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp -o $INTERNET -s $SERVER_IP --sport 80 -d 0/0 -m state --state ESTABLISHED -j ACCEPT
# Permit outbound www(80) packets.
$IPT -A OUTPUT -p tcp -o $INTERNET -s $SERVER_IP -d 0/0 --dport $ALLOWED_WWW_PORT -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp -i $INTERNET -s 0/0 --sport $ALLOWED_WWW_PORT -d $SERVER_IP -m state --state ESTABLISHED -j ACCEPT
# Log and drop all other packets to file /var/log/messages
iptables -A OUTPUT -j LOG
iptables -A INPUT -j LOG
iptables -A FORWARD -j LOG
# make sure nothing comes or goes out of this box
iptables -A OUTPUT -j DROP
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
# save, restart, and check the iptables
service iptables save
service iptables restart
iptables -L -n -v -x
当我运行 shell 脚本时,Chain INPUT 的结果如下:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- eth0 * 0.0.0.0/0 192.168.7.100 tcp spts:0:1023 dpt:80
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 192.168.7.100 tcp dpt:80 state NEW,ESTABLISHED
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 192.168.7.100 tcp spt:80 state ESTABLISHED
使用 hping 从另一台机器测试我的规则的正确方法是什么?
这是我的数据包结果:
[root@daniel-laptop ~]# hping2 192.168.7.100 -S -p 80 -s 1023
HPING 192.168.7.100 (eth0 192.168.7.100): S set, 40 headers + 0 data bytes
len=46 ip=192.168.7.100 ttl=64 DF id=0 sport=80 flags=RA seq=1 win=0 rtt=0.5 ms
len=46 ip=192.168.7.100 ttl=64 DF id=0 sport=80 flags=RA seq=2 win=0 rtt=0.3 ms
len=46 ip=192.168.7.100 ttl=64 DF id=0 sport=80 flags=RA seq=3 win=0 rtt=0.4 ms
len=46 ip=192.168.7.100 ttl=64 DF id=0 sport=80 flags=RA seq=4 win=0 rtt=0.5 ms
len=46 ip=192.168.7.100 ttl=64 DF id=0 sport=80 flags=RA seq=5 win=0 rtt=0.5 ms
len=46 ip=192.168.7.100 ttl=64 DF id=0 sport=80 flags=RA seq=6 win=0 rtt=0.3 ms
len=46 ip=192.168.7.100 ttl=64 DF id=0 sport=80 flags=RA seq=7 win=0 rtt=0.4 ms
^C
--- 192.168.7.100 hping statistic ---
8 packets tramitted, 7 packets received, 13% packet loss
round-trip min/avg/max = 0.3/0.4/0.5 ms
[root@daniel-laptop ~]#
答案1
稍微重新安排一下你的脚本文件;将“丢弃入站流量到端口 80...”规则移到“允许入站 www(80) 流量”规则上方。
现在,ACCEPT 规则在 DROP 规则之前进行评估,因此即使从端口 <1024 传输流量也能够通过。
您可以使用来验证这一点iptables -vL
,并查看哪些规则得到了命中。
答案2
如果您查看输出,iptables -L
您会看到允许端口 80 上的入站数据包的规则位于阻止端口 80 上源端口低于 1024 的数据包的规则之前。这样做的效果是允许端口 80 上的所有数据包,因为当找到匹配项时,iptables 会停止处理规则。
重新安排您的规则,使得 1024 以下的源端口上的阻止位于端口 80 上的允许之前。
答案3
不要使用 hping3 来测试,它会随着每个连续的数据包增加运动量。
正确的规则:
$IPT -A INPUT -p tcp -i $DEFAULT_NIC -s 0/0 --sport 0:1023 -d $SERVER_IP --dport 80 -j DROP
$IPT -A INPUT -p tcp -i $DEFAULT_NIC -s 0/0 -d $SERVER_IP --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp -o $DEFAULT_NIC -s $SERVER_IP --sport 80 -d 0/0 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp -o $DEFAULT_NIC -s $SERVER_IP -d 0/0 --dport $ALLOWED_WWW_PORT -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp -i $DEFAULT_NIC -s 0/0 --sport $ALLOWED_WWW_PORT -d $SERVER_IP -m state --state ESTABLISHED -j ACCEPT
将运动规则上调。
测试:
server# nc -l -t -p 80
client# nc -t IP 80 -p 1023
client# nc -t IP 80 -p 1024
答案4
您是否检查过 INPUT 规则的顺序?也许您的第一个 INPUT 规则允许该流量。