iptables详解
netfilter(iptables)
netfilter --工作在内核软件,实现数据包的过滤。
iptables --工作应用层一个软件,用来控制netfilter。
1.netfilter/iptables包过滤防火墙(tcp/ip四层)
1)应用层 --通过软件为用户提供接口
2)传输层 --提供可靠或不可靠的数据传输(TCP/UDP)使用端口来标示服务类型 sport dport
3)网络层 --提供路由和选址(icmp) sip dip
4)数据链路层 --传输数据帧(MAC) s_mac
5)物理层 --传输透明比特流
过滤的依据: s_mac/sip/dip/sport/dport/状态(三次握手/四次断开)
netfilter的逻辑架构:

------------------------
netfilter防火墙的元素及关系:
netfilter==>表==>链==>规则
------------------------
三张表:
filter 防火墙表,允许和拒绝都在这里实现
nat 地址转换
mangle 数据包整形
五条链:
INPUT 本机进站的数据流
OUTPUT 本机出站的数据流
FORWARD 路由的数据流
POSTROUTING 路由后的数据流
PREROUTING 路由前的数据流
--------------------
表跟链的对应关系:
filter:INPUT,OUTPUT,FORWARD
nat: OUTPUT,PREROUTING,POSTROUTING
mangle:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
------------
四种数据流:
本机进站的数据流:packet-->ethX-->PREROUTING-->INPUT-->本机
本机出站的数据流:packet-->OUTPUT-->POSTROUTING-->ethX-->destination
路由的数据流:
出去: packet-->eth0-->PREROUTING-->FORWARD-->POSTROUTING-->eth1--destination
回来: packet-->eth1-->PREROUTING-->FORWARD-->POSTROUTING-->eth0--destination
本机访问本机: 本机-->packet-->lo-->PREROUTING-->INPUT-->本机
本机-->packet-->OUTPUT-->POSTROUTING--lo-->本机
--------------------
表的匹配顺序:
mangle-->nat-->filter
-----------------
防火墙规则匹配顺序:
1.按顺序匹配,如果第一条匹配到了就直接执行这条规则的动作,不往下匹配其它规则.
2.如果第一条匹配不到,第二条也匹配不到,继续往下匹配直到找到匹配的规则,如果找不到匹配默认规则.
--------------------
iptables操作命令:
#iptables --help
Usage: iptables -[AD] chain rule-specification [options]
iptables -[RI] chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LFZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
--append -A chain 追加规则
--delete -D chain 删除规则
--delete -D chain rulenum 删除指定序号的规则
--insert -I chain [rulenum] 插入一条规则(default 1=first)
--replace -R chain rulenum 替换一条规则
--list -L [chain] 显示出链或者链中的规则
--flush -F [chain] 在一个链或者所有链中清空规则
--zero -Z [chain] 清空计数
--new -N chain 创建用户自定义链
--delete-chain
-X [chain] 删除用户自定义链
--policy -P chain target 指定默认规则
Change policy on chain to target
--rename-chain
-E old-chain new-chain
重命名用户自定义链
Options:
--proto -p [!] proto 指定协议,!代表取反
--source -s [!] address[/mask] --指定源地址
source specification
--destination -d [!] address[/mask] --指定目标地址
destination specification
--in-interface -i [!] input name[+] --指定数据从哪个网口进来
network interface name ([+] for wildcard)
--jump -j target --匹配动作
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match --扩展匹配
extended match (may load extension)
--numeric -n --端口和IP以数值方式显示,不作反解
--out-interface -o [!] output name[+] --指定数据从哪个网口出去
network interface name ([+] for wildcard)
--table -t table --指定使用哪个表 (default: `filter')
--verbose -v --显示详细信息
--line-numbers --显示规则的序号
--exact -x expand numbers (display exact values)
传输层:协议(tcp/udp)
端口(sport/dport)
网络层:
IP地址(sip/dip/icmp)
数据链路层:
mac地址(--mac-source)
物理层:
从哪个网卡进来 -i
从哪个网卡出去 -o
---------------
查看:
# iptables -t nat -L -n -v --line
# iptables -t filter -L -n
# iptables -t filter -L INPUT
# iptables -t filter -L INPUT -v -n
# iptables -t filter -L INPUT -n -v --line
# watch -n 0.1 iptables -L INPUT --line -n -v
追加规则:
# iptables -t filter -A INPUT -i lo -j ACCEPT
插入规则:
# iptables -t filter -I INPUT -i eth0 -j ACCEPT --插入成为第一条
# iptables -t filter -I INPUT 3 -i eth0 -j ACCEPT --插入成为第三条规则
替换规则:
# iptables -t filter -R INPUT 3 -i eth1 -j ACCEPT --替换成为指定规则
删除规则:
# iptables -t filter -D INPUT 2 --删除指定链指定编号的规则
+++++++++++
#iptables -t filter -A INPUT -i lo -j ACCEPT
#iptables -t filter -A OUTPUT -o lo -j ACCEPT
#iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.250 -j ACCEPT
# iptables -t filter -A INPUT -i eth1 -j ACCEPT
# iptables -L INPUT -n --line -v
# iptables -t filer -I INPUT 2 -i eth2 -j ACCEPT 插入默认第二条
# iptables -t filter -I INPUT -i eth3 -j ACCEPT 插入默认第一条
# iptables -t filter -R INPUT 1 -i eth4 -j ACCEPT 替换默认第一条
#iptables -t filter -D INPUT 1 删除默认第一条
# iptables -t filter -F INPUT 清空filter所有INPUT链
#iptables -t filter -F
#iptables -L INPUT -n --line -v
+++++++++++++++++++
清空规则:
1、清空一张表
# iptables -t filter -F
2、清空一条链中的规则
# iptables -t filter -F INPUT
新建/删除用户自定义的链:
# iptables -t filter -N uplooking 新建
# iptables -t filter -X uplooking 删除
# iptables -t filter -X 清空filter表中所有用户自定义链
+++++++++
iptables -t filter -N TCP
iptables -t filter -N UDP
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p tcp -j TCP
++++++++
更改默认规则:
# iptables -t filter -P INPUT ACCEPT
# iptables -t filter -P INPUT DROP
实例应用一(本机的访问控制):
拒绝所有:允许本机能访问所有服务,允许访问DNS,postfix,dovecot,vsftpd,telnet,web,
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
1.允许本机访问本机的所有服务:
[root@mail ~]# iptables -t filter -A INPUT -i lo -j ACCEPT
[root@mail ~]# iptables -t filter -A OUTPUT -o lo -j ACCEPT
+++++++++
iptables -t filter -A INPUT -p tcp -dport 5902 -i br0 -s 192.168.0.45 -j ACCEPT
iptables -t filter -A OUTPUT -o br0 -p tcp --sport 5902 -d 192.168.0.45 -j ACCEPT
iptables -L -n -v --line
iptables -t filter -A INPUT -i br0 -p tcp --dport 5900:5902 -s 192.168.0.0/24 -j ACCEPT
iptables -t filter -A OUTPUT -o br0 -p tcp --sport 5900:5902 -d 192.168.0.0/24 -j ACCEPT
++++++++++++++
2.允许指定客户机访问我的80端口
[root@mail ~]# iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -s 10.1.1.111 -j ACCEPT
[root@mail ~]# iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 80 -d 10.1.1.111 -j ACCEPT
[root@mail ~]# iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -s 10.1.1.0/24 -j ACCEPT
[root@mail ~]# iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 80 -d 10.1.1.0/24 -j ACCEPT
[root@mail ~]# iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
[root@mail ~]# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT
# iptables -t filter -R INPUT 2 -p tcp -m multiport --dport 20:21,80,443,5900 -j ACCEPT
# iptables -t filter -R OUTPUT 2 -p tcp -m multiport --sport 20:21,80,443,5900 -j ACCEPT
[root@mail ~]# service iptables save --防火规则马上写马上生效,但重启机器或者重iptables服务,规则丢失.
将当前规则保存到 /etc/sysconfig/iptables: [确定]
从非默认位置恢复规则:
# iptables-save > /tmp/iptables.save
# iptables-restore < /tmp/iptables.save
icmp:
[root@mail ~]# iptables -t filter -i eth0 -A INPUT -p icmp -j ACCEPT
[root@mail ~]# iptables -t filter -o eth0 -A OUTPUT -p icmp -j ACCEPT
===========================================================================================================================================
iptables应用示例:
1、允许ping 127.0.0.1 和 允许 ping 10.1.1.0/24 ,其他服务都禁止
# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT
# iptables -A INPUT -j DROP
或者
# iptables -P INPUT DROP 《--定义默认策略,当在规则表里找不到匹配的规则就采取策略的动作
# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT
2、只运访问本机的SSH服务(只允许远程ssh登录到本机)
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT <---定义端口的参数 --dport
还有就是
定义源端口 --source-port --sport
定义目的端口 --destination-port --dport
3、定义连续端口
iptables -A INPUT -p tcp --dport 20:100 -j ACCEPT <---允许访问 20到100的端口
4、定义多端口 <---引入一个“模块”的概念
iptables -A INPUT -m multiport -p tcp --dports 22,80,110 -j ACCEPT
-m 指定模块
multiport 支持多端口的扩展模块
5、允许和内网的客户(10.1.1.0/24)进行传输数据(包括ping)
iptables -P INPUT DROP
iptables -A INPUT -p ALL -i eth0 -s 10.1.1.0/24 -j ACCEPT
6、决绝访问色情网站www.baidu.com
iptables -A OUTPUT -d www.baidu.com -j DROP
7、通过硬件地址进行过滤
-m mac --mac-source [!] address
iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p icmp -j REJECT
注意REJECT 和 DROP 区别
8、定义连续的IP地址
iptables -A INPUT -m iprange --src-range 10.1.1.140-10.1.1.254 -j DROP
9、
只想我的电脑成为SSH 服务器端
# iptables -P INPUT DROP
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT
成为ssh服务器端的同时成为ssh客户端,让你能远程登录到别的电脑
# iptables -P INPUT DROP
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT
数据包的四种状态
NEW 想要建立连接的数据包,也就是第一个数据包
INVALID 无效的数据包,例如:损坏的数据报或者不完整的数据包
ESTABLISHED 数据包是完整有效的,已经建立连接的。通讯的两端已经有数据来往过的。
RELATED 与已经发送的数据包相关的数据包。
NEW(类似TCP的syn) [NEW,INVALID无效态] ESTABLISHED (连接态) RELATED(衍生态,关联)[ ESTABLISHED,RELATED]
ssh 10.1.1.141 ---> NEW (建立连接的请求的数据包) ----OUTPUT---> 10.1.1.141
10.1.1.141 ---> ACK 回应 本机,这时候回应的数据包就属于 ESTABLISHED ,回应的数据包走的INPUT链的,根据规则,允许通过。 那么以后在这个建立的连接的基础上产生的数据包就属于RELATED,根据规则也允许通过。
iptables 引入数据包的状态的目的是为了提高iptables的处理效率,只要匹配一次,以后的数据包就可以不再与规则进行多次的匹配。
11、对外只开放web服务,其他一切不放行,不允许进来也不允许出去
# iptables -P OUTPUT DROP
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT <--tcpdump tcp port 80 只看到进来的,没有出去的
# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
12、开放工作在主动模式下的ftp服务
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
13、开放工作在被动模式下的ftp服务
ftp 两种模式:
主动模式:传输数据20端口 ,ftp服务器主动去连接客户端
被动模式:传输数据>1024端口,客户端主动去连接服务器
# modprobe ip_conntrack_ftp
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
假如ftp服务器监听的端口不只是21而是还有别的:
# modprobe ip_conntrack_ftp ports=21,2021
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 2021 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
14、综合应用:
本机需要开放的服务有: ssh(22) 、 web(80) 、 ftp(21 20) 、 DNS(53) 、pop3(110)、pop3s(995)、IMAP(143)、IMAPS(993)、smtp(25)等服务。
其中web 、ftp、pop3、pop3s、IMAP、IMAPS 允许所有网络的人访问;
ssh 只允许本地局域网中的某个MAC地址访问
只允许本地局域网的用户发送邮件
只允许本地局域网的用户查询DNS
# modprobe ip_conntrack_ftp
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp -m multiport --destination-ports 20,21,80,110,143,993,995 -j ACCEPT
# iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p tcp -s 10.1.1.0/24 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 25 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -s 10.1.1.0/24 -j ACCEPT
service iptables save
==================================================================
SNAT
SNAT:(1)-j SNAT 源地址转换,静态 IP
(2)-j MASQUERADE 源地址转换,动态 IP
[内网] (172.16.196.129) 【eth0】<---host-only-----> 【eth0】(172.16.196.1) 【eth1】 [外网](192.168.2.138)
【LAN】(客服端) [SNAT] ( 服务端)
服务器配置(实现软路由那台机器,需要两张网卡)
1、打开路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
开机生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# sysctl -a | grep ip_forward
2、配置Iptables
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.2.138 《--把所有的协议数据都映射出去外部网络
内网客户端的配置:
1、配置网关
# route add default gw 172.16.196.1
2、配置DNS
# vim /etc/resolv.conf
nameserver 210.21.196.6
================================
host-only (内网) | 外网(互联网)
[vm1-slave] eth0 <---> eth0 [vm2-master] eth1 <------> eth0 [真实机]
172.16.196.129 172.16.196.128 10.1.1.21 10.1.1.20
服务器(vm2-master)的配置:
1、打开路由转发
2、配置Iptables
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.1.1.21
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source -j MASQUERADE
客户端的配置(vm1-slave):
1、配置网关
# route add default gw 172.16.196.128
2、配置DNS
# vim /etc/resolv.conf
nameserver 202.96.128.86
===============================================
DNAT
外网 内网
[vm1-slave] -------------------> eth0 [vm2-master] eth1 <--------------------> 10.1.1.20 eth0 [真实机器Web]
172.16.196.129 (172.16.196.128Router DNAT 10.1.1.21)
192.168.100.2 192.168.100.1 10.1.1.21 10.1.1.20
http://172.16.196.128/
Router的配置(vm2-master)
1、打开路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
开机生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# sysctl -a | grep ip_forward
2、配置Iptables ,实现目的地址映射 DNAT
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -d 172.16.196.128 -j DNAT --to 10.1.1.20
内网的Web服务器的配置:
1、配默认网关
# route add default gw 10.1.1.21
# route del -net 172.16.196.0 netmask 255.255.255.0 dev vmnet1 <---额外的步骤,由于虚拟机自动添加了一个路由条目
外网的[vm1-slave] 作为测试主机,需要访问 http://172.16.196.128/
1、配默认网关
# route add default gw 172.16.196.128
注意真机的默认网关10.1.1.20
#route add default gw 10.1.1.21
浙公网安备 33010602011771号