1. iptables命令
格式:iptables [-t table] COMMAND CHAIN [num] 匹配标准 -j 处理办法
[-t tables]:指定表,可以省略,默认filter表(用于iptables)
CMOMAND:
管理规则:
-A:附加一条规则,添加在链的尾部
-I CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条
-D CHAIN [num]:删除指定链中的第num条规则
-R CHAIN [num]:替换指定的规则
管理链:
-F [CHAIN]:flash,清空指定规则链,如果省略CHAIN,可删除对应表中所有链
-P CHAIN:设定指定链的默认策略
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:置零指定链中所有规则的计数器
-E:重命名自定义的链
例:【需要注意的是:先不要把默认策略改为DROP,应该先写两条策略让自己不被拒绝】
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
查看类:
-L:显示指定表中的规则,会反解IP和端口,反解IP会很慢[DNS]
-n:以数字格式显示主机地址和端口号
-v:显示链及规则的详细信息
-x:显示计数器的精确值
--line-numbers:显示规则号码
例:# iptables -L -n -v
CHAIN [num]:指定哪个链的哪一条,CHAIN可取值为INPUT,OUTPUT,FORWARD
num省略默认为改链的第一条规则
匹配标准:
通用匹配:
-s,--src:指定源地址
-d,--dst:指定目标地址
-p{tcp|udp|icmp}:指定协议
-i INTERFACE:指定数据报文流入的接口
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE:指定数据报文流出的接口
可用于定义标准的链:POUTPUT,FORWARD,POSTROUTING
例:iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP
扩展匹配:
隐含扩展:
-p tcp:
--sport PORT[-PORT]:源端口
--dport PORT[-PORT]:目标端口
--tcp-flags mask comp:只检查mask指定的标志位,是逗号分隔的标志位列表
comp:此列表中出现的标志位必须为1,comp中没有出现而mask中出现的为0
如:--tcp-flags SYN,FIN,ACK,RST SYN
SYN为1其他三个标志位为0,这是TCP第一次连接 == --syn
例:iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
-p udp:
--sport PORT[-PORT]:源端口
--dport PORT[-PORT]:目标端口
-p icmp:
--icmp-type:
0:echo-rely,响应报文
8:echo-request,请求报文
显示扩展:
使用额外的匹配规则
格式:-m EXTEXTION --spe-opt
I.state:
状态扩展,结合ip_cootrack追踪会话的状态
NEW:
ESTABLISHED:
INVALID:
RELATED
如:
处理办法:
ACCEPT: 放行
DROP: 丢弃
REJECT: 拒绝
DNAT: 目标地址转换
SNAT: 源地址转换
REDIRECT: 端口重定向
MASQUERADE:地址转换
LOG: 日志
MASK: 打标记
2. 练习
(1)放行192.168.1.0/24网段访问192.168.1.40的ssh服务(端口22)
# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.40 -p tcp --dport 22 -j ACCEPT
# iptables -A OUTPUT -s 192.168.1.40 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
(2)修改默认策略
【为了防止远程链接时把自己挡到外面了,所以先放行ssh】
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
(3)允许任何主机访问192.168.1.40的web服务
# iptables -I INPUT -d 192.168.1.40 -p tcp --dport 80 -j ACCEPT
# iptables -I OUTPUT -s 192.168.1.40 -p tcp --sport 80 -j ACCEPT
(4)放行自己对自己的所有访问
# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
此时连ping自己都不通了,虽然127.0.1是本地回环地址,
但是从网络角度将,也需要从OUTPUT出去,然后从INPUT进来
# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
# iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.101 ms
(5) 允许自己ping任何主机
# iptables -A OUTPUT -s 192.168.1.40 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 192.168.1.40 -p icmp --icmp-type 0 -j ACCEPT
3. DNS服务器进行解析,如果不是自己负责的域,需要去互联网找,
假设DNS服务器的INPUT,OUTPUT,FORWARD的默认策略是DROP,
那一般至少需要几条链呢?
答:8条
第1条:允许客户端请求解析
第2条:允许本机响应客户端的解析请求
第3条:请求寻找不是自己负责的域
第4条:响应寻找不是自己负责的域的结果
UDP和TCP各4条,所以共8条
4. iptables不是服务,但是有服务脚本,服务脚本的主要作用在于管理保存的规则
命令lsmod:查看内核模块
装载及移除iptables/netfilter相关的内核模块:
iptables_nat
iptables_filter
iptables_mangle
iptables_raw
ip_nat:ip报文实现nat功能的另外的补充模块
ip_conntrack:追踪连接条目并保存在内存中
5.ip_conntrack:
追踪连接条目并保存在内存中(/proc/net/ip_conntrack)
可以防止反木马病毒
反木马病毒:在主机内有一个执行文件,主动去找一个可出去的端口,主动去连接外面的主机
而iptables防止不了这种情况
ip_conntrack:会追踪所有的连接,保存它们的链接信息
从而约定有请求的并建立了连接才允许出去,也就是响应
数目:ip_conntrack是可以限制保存数目的
/proc/net/ip_conntrack:此文件能保存的信息有限,因为是保存在内存中的
/proc/sys/net/ipv4/ip_conntrack_max:此文件存放的是能保存的最大数目;
当存了最大数目的连接条目后,以后的请求将被丢弃。
大型服务器上并发量很多最大数目也无法满足,在大型服务繁忙的主机上不要开此模块。
注意啦:#iptables -t nat -L
查看nat条目时,会自动加载ip_conntrack模块