url_filter_load_rule()
{
config_get url $1 dest_str
if [ -z "$url" ];then
return
fi
cmd="iptables -t filter -I URL_FILTER -m string --algo bm --string "
cmd=$cmd$url
config_get mac $1 src_mac
if [ -n "$mac" ];then
cmdmac=" -m mac --mac-source $mac "
cmd=$cmd$cmdmac
fi
config_get starttime $1 start_time
config_get stoptime $1 stop_time
if [ -n "$starttime" ];then
cmdtime=" -m time --timestart $starttime --timestop $stoptime "
cmd=$cmd$cmdtime
config_get weekdays $1 weekdays
if [ -n "$weekdays" ];then
days=""
for day in $weekdays
do
days="$day,$days"
done
cmd="$cmd --weekdays $days"
fi
fi
config_get target $1 target
if [ "$taget" == "RETURN" ]; then
$cmd -j $target 2>/dev/null
else
$cmd -j DROP 2>/dev/null
fi
}
使用到的工具命令:nslookup 用于查询DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题。
使用url有两种方法:
方法一:
1、首先利用nslookup查看下url的IP地址;例如禁止www.baidu.com
2、使用nslookup将域名转换为IP地址后,使用IPtables命令将源IP禁止即可
使用iptables查看配置信息:
方法二:
使用字符匹配过滤方法,这也是常用的URL过滤:
-m state :-m 表示添加一个模块,states是IPtables的状态模块
-m string :字符串限定 –algo :字符串匹配算法,可使用的有kmp,bm。
url_filter_flush()
{
iptables -t filter -D FORWARD -j URL_FILTER 2>/dev/null
iptables -t filter -D FORWARD -i br-lan -j URL_FILTER 2>/dev/null
iptables -t filter -F URL_FILTER 2>/dev/null
iptables -t filter -X URL_FILTER 2>/dev/null
}
-X:删除使用者自订table项目,一般使用iptables -N xxx 新增自订 chain 后,可以使用 iptables -X xxx 删除之
-D:删除某一条规则
-F :清除所有的已订定的规则
(-F 是清空指定某个chains内所有的rule设定。比方iptables -F -t filter,就是将filter table内所有的INPUT/OUTPUT/FORWAD chain 设定的规则都清空。)
-i :匹配从这块网卡流入的数据
-o :匹配从这块网卡流出的数据
–dport :匹配目标端口号
–sport :匹配来源端口号
-j:选项指定规则目标
目标可以是用户自定义链:内建目标;或扩展
“iptables –[A|I 链] [-i|o 网络接口] [-p 协议] [-s 来源ip/网域] [-d 目标ip/网域] –j[ACCEPT|DROP]”
IPtables 开放网口与IP来源:
例:所有的来自lo这个网口的封包,都予以接受
iptables -A INPUT -i lo -j ACCEPT
例:目标来自192.168.1.200这个IP的封包都予以接受
iptables -t filter -I INPUT -i eth0 -s 192.168.1.200 -j ACCEPT
例:192.168.1.0/24可接受,但是192.168.1.10丢弃
iptables 规则记录
例:iptables -A INPUT -s 192.168.1.200 -j LOG
相关信息就会被写入到/var/log/messages中
iptables 开放tcp 、udp端口
例如:开放Samba端口(udp137、138;tcp139,445)
iptables -A INPUT -i eth0 -p udp –dport 137:138 -j ACCEPT
iptables -A INPUT-i eth0 -p tcp –dport 139 -j ACCEPT
iptables -A INPUT-i eth0 -p tcp –dport 445 -j ACCEPT
iptables匹配ICMP端口和ICMP类型
iptables –A INPUT –p icmp –icmp-type 类型 –j ACCEPT
参数:–icmp-type :后面必须要接 ICMP 的封包类型,也可以使用代号,
例如 8 代表 echo request 的意思。(可自查询ICMP-type对应表)
Iptables –syn的处理方式
指定TCP匹配扩展
使用 –tcp-flags 选项可以根据tcp包的标志位进行过滤。
#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN
#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK
上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。
#iptables -A FORWARD -p tcp –syn
选项—syn相当于”–tcp-flags SYN,RST,ACK SYN”的简写。
IPtables 状态模块
-m :一些iptables的模块,主要常见的有:
state:状态模块
mac:网络网卡硬件地址(hardware address)
–state : 一些封包的状态,主要有:
INVALID:无效的封包,例如数据破损的封包状态
ESTABLISHED:已经联机成功的联机状态
NEW : 想要建立新的联机封包状态
RELATED:这个常用的,封包是与我们主机发送出去的封包有关
例:只要已建立或相关封包就予以通过,只要不合法封包就丢弃。
iptables –A INPUT –m state –state RELATED ESTABLISHED –j ACCEPT
iptables –A INPUT –m state –state INVALID –j DORP
例:对局域网内mac地址为00:0C:29:56:A6:A2主机开放其联机
iptables -A INPUT -m mac –mac-source 00:0C:29:56:A6:A2 -j ACCEPT
Iptables保存于恢复
iptables-save > /etc/sysconfig/iptables.20180606
iptables-restore < /etc/sysconfig/iptables.20180606
url_filter_init()
{
iptables -t filter -N URL_FILTER 2>/dev/null
iptables -t filter -I FORWARD -j URL_FILTER 2>/dev/null
iptables -t filter -I INPUT -i br-lan -j URL_FILTER 2>/dev/null
}
-N :新建一个表
url_filter_set_default_drop()
{
iptables -t filter -I URL_FILTER -p tcp -m string –algo bm –string GET -j REJECT –reject-with tcp-rst 2>/dev/null
}