netfilter : 数据过滤。在Linux的内核中有5个hook functions, chains(链)
五个规则链: PREROUTING, INPUT , FORWARD, OUTPUT, POSTROUTING
三表:
filter: 允许不允许
NAT:地址转换
manale:修改报文原数据
三表五链的关系
filter: INPUT,FORWARD,OUTPUT
nat: PREROUTING, OUTPUT, POSTROUTING
mangle: PERROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
自己定义的链只有和内核中的链接起来才能生效,也只能删除自己的定义的链,内核中的不能删。
iptables/netfiler : iptables 是定义规则,netfiler是过滤的
定义规则:
iptables –L –n 查看表 -v 显示详细信息
iptables [ -t table ] COMMAND chain CRETIRIA –j ACTION
-T table 定义哪个表 ,默认是filter表
COMMAND: 命令:
链管理命令: -p 设定默认策略
例: iptables –P INPUT {DROP|ACCEPT}
-F 清空规则链
例: iptable –t nat –F PREROUTING
-N 新建一条链
例:iptables –N inbound_tcp_web
-X 删除用户自定义的空链
-E 重命名自定义的链
-Z 清空链及链中的计数器
例: iptables –Z
规则管理命令:
-A 在当前规则的最后追加
-I num 把当前规则插入到第几条
-R num 修改第几条规则
-D num 删除第几条规则
查看命令:
-L –n –v ( -v ,-vv,-vvv) -x –line-numbers; -n 是不用反向解析,-v 详细信息, -x 不用转换精确显示字节大小, --line-numbers 显示行号
CRETIRIA:匹配标准(通用匹配,扩展匹配)
通用匹配:
-s, -src , --source :匹配源地址
IP, NETWORK/NETMASK, 0..0.0.0/0.0.0.0
-d 匹配目标地址
-p (tcp|udp|icmp) 匹配协议
-i eth0 流入接口
-o 流出接口
扩展匹配:(隐含扩展,显式扩展)
隐含扩展:
-p tcp
--dport
--sport
--tcp-flags检查的标志位 必须为1 标志位 ( SYN,ACK,FIN,PSH,RST,URG)
例: -tcp-flags SYN,ACK,FIN,RST,SYN 缩写: tcp-flags –syn 常用写法
-p udp
--dport
--sport
-p icmp
--icmp-type
ping出的数据包echo-request数字为 8 ,回应的echo-reply 数字为0
显式扩展
-p tcp –m multiport –dports 21,23,80
-m指定模块
-j ACTION 如何处理
DROP 丢弃,REJECT 拒绝,ACCEPT 接受,custom_chain 转向链, DNAT, SNAT,目标源地址转换,MASOUERADE,REDIRECT,MARK,
例:iptables –t filter –R INPUT 1 –s 172.16.0.0./16 –p udp –dport 53 –j REJECT
例:iptables –t filter –A OUTPUT –s 172.16.100.1 –d 172.16.0.0/16 –p tcp –sport 22 –j ACCPET
例:iptables –P
状态检查:
state
NEW 新建立的链接
ESTABLISHED 已建立的链接
RELATED
INVALID
例:iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT (state 有两个杠)
例: iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
例: iptables –A INPUT –p icmp –icmp-type 0 –j ACCEPT (icmp-type 有两个杠)
由于127.0.0.1是个特殊的地址,需要手动加入才能ping通的,否则ping不通
重启iptales的所有的规则失效,保存方法: service iptables save 位置:/etc/sysconfig/iptables 手动开启:iptables-save > /etc/sysconfig/iptables.2 iptables-restore < /etc/sysconfig/iptables.2
/proc/sys/net/ipv4/ip_forward 路由功能
route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] 增加路由格式
route [-v] [-A family] del [-net|-host] target [gw Gw] [netmask Nm] 删除路由
route –v 显示路由信息
Nat的转换:
源地址转换:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 172.16.0.1
外网地址是静态的用此方法,如果是动态的用以下地址
MASQUERADE地址伪装:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
阻止80:
#iptables –P FORWARD DROP
# iptables -A FORWARD -s 192.168.0.0/24 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEP
目标地址转换:
iptables -t nat -A PREROUTING -d 192.168.0.100 -p tcp --dport 80 -j DNAT --to-destination 172.16.0.1
开放ftp:
iptables –A INPUT –d 172.16.0.1 –p tcp –m state –state ESTABLISHED,RELATED –j ACCEPT
加载模块”ip_conntrack_ftp ip_nat_ftp”或者编辑/etc/sysconfig/iptables-config的IPTABLES_MODULES中写入“ip_conntrack_ftp ip_nat_ftp”
加载模块:modprobe ip_conntarck_ftp ; modprobe ip_nat_ftp
iptables脚本写法:
#/bin/bash
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables –t filter –F
iptables –t nat –F
iptables –t mangle –F
iptables –p INPUT DROP
iptables –p OUTPUT DROP
iptables –p RORWARD DROP
这是一些需用关闭常见攻击漏洞
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
保存之后,将名字写在/etc/rc.local中。
l7-filter软件的使用: 网站:sourceforge.net
有内核和补丁组成
配置:环境:2.6 linux kernel ; iptables source, i7-filter kernel;
所需软件:iptables-1.4.6.tar.bz2 l7-protocols- linux-2.6.28.10.tar.gz netfilter-layer7-v2.22.tar.gz
iptables -A INPUT -m layer7 --l7proto ftp -j REJECT
iptables –A FORWARD –s 192.168.0.0/24 –m layer7 –l7proto qq –j REJECT
iptables –t filter –A FORWARD –s 192.168.0.0/24 –m layer7 –l7-proto qq –j REJECT
hash –r 清空命令缓存 –d name删除某个特定缓存命令