1.iptables包括四种表
filter表:包过滤
nat表:网络地址转换
mangle表:包重构(修改)
raw表:数据跟踪处理
2.链
filter表:INPUT ,FORWARD ,OUTPUT
nat表:PREROUTING ,OUTPUT ,POSTROUTING
mangle表:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
每一条链中可以有一 条或数条规则,规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
3.数据流向
(1)数据包的目的地址是本机
系统将数据包送到Input链,若通过规则检查,则该包被发给相应的本地进程处理,若没有通过规则检查,系统会丢掉
PREROUTING-->INPUT
(2)目的地址不是本机
系统将数据包送往Forward链,若通过检查,则该包被发给相应的本地进程处理,若没有通过检查,系统将丢掉这个包
PREROUTING-->FORWARD-->POSTROUTING
(3)数据包是本地进程产生
系统将数据包送到Output链,若通过检查,该包被发到相应的本地进程处理,若没有通过,则丢掉
OUTPUT-->POSTROUTING
4.使用方法
iptables [-t TABLE] COMMAND CHAIN [CRETRIA] -j ACTION
-t: filter,nat等
COMMAND:对链或链中的规则进行管理
-A 追加一条规则
-I 插入一条规则
-R 替换
-D 删除
-P 设置链的默认规则
CHAIN:
-N 新建一个自定义链
-X 删除一个自定义链
-F 清空指定链
-P 设定链的默认策略
-Z 置零(每条规则,包括默认策略都有两个计数器,一个是被本规则匹配到的所有数据包的个数,另一个是被本规则匹配到的大小之和)
ACTION:
DROP 悄悄丢弃
REJECT 明示拒绝
ACCEPT 接受
iptables -L #查看
5.配置
服务脚本:/etc/rc.d/init.d/iptables
脚本配置文件:/etc/sysconfig/iptables-config
规则保存的位置:/etc/sysconfig/iptables
注意:在修改iptables后
先执行/etc/rc.d/init.d/iptables save,再执行service iptables restart
iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore < /etc/sysconfig/iptables.2
则完成了将iptables中定义的规则手动生效
6.匹配条件
(1)通用匹配:
-s:源地址
-d:目标地址
-p:icmp,tcp,udp
-i: -i eth0 一般用在INPUT和PREROUTING上,指定进来的网络接口
-o: -o eth0 一般在OUTPUT和POSTROUTING上,指定出去的网络接口
(2)扩展匹配:
-p tcp :
--sport PORT[-PORT2],指定单个端口或者多个连续端口,不能同时指定多个非连续端口
--dport PORT[-PORT2]
--tcp-flags
TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
-p udp :
--sport
--dport
-p icmp:
--icmp-type 0:echo-reply 8:echo-request
(3)显示匹配
netfilter:扩展模块引入扩展,用于扩展匹配条件
-m state:用于实现连接的状态监测
( 什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。)
-m multiport:表示启用多端口扩展 之后我们就可以启用比如 --dports 21,23,80
7.例子
(1)iptables -F #清空filter的所有过滤条件:不加-t指定表,则默认是filter表
(2)iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT:接受所有的连接
(3)禁用172.17.21.1ping本机,ping别人是通的
iptables -t filter -A INPUT -s 172.17.21.1 -p icmp --icmp-type 8 -j DROP
(4)删除
先使用iptables -L -n --line-numbers查询行号
iptables -t filter -D INPUT(那个链上的) 行号
(5)添加规则
加入则可以远程ssh
iptables -I INPUT 8 -p tcp --dport 22 -j ACCEPT #表示将这条规则插入到第8行
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(6)将192.168.198.136的ftp链接包丢掉
先尝试在192.168.198.136上进行登录服务器192.168.198.129
ftp 192.168.198.129,发现是可以登录的
然后在服务其上面配置过滤规则,注意ftp占用两个端口
iptables -I INPUT -s 192.168.198.136 -p tcp --dport 20 -j DROP
iptables -I INPUT -s 192.168.198.136 -p tcp --dport 21 -j DROP
(7)允许主机从eth0访问ssh服务
iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
(8)设置链的默认规则
iptables -P INPUT (DROP|ACCEPT)
(9)修改链的第几条规则
iptables -R INPUT [行号] (后面接要修改的内容)
8.NAT链
NAT(Network Address Translation网络地址翻译)是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作
为什么要有NAT?
(1)实现内网访问外网
(2)实现外网访问内网
(3)SNAT:改变转发数据包的源地址
(4)DNAT:改变转发数据包的目的地址
1.假如我要让公司192.168.10.0/24段的地址都通过linux服务器的eth0 :172.17.111.13上网
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.17.111.13
2.更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4
3.更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4
iptables -t nat -A PREROUTING -d 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4
PREROUTING: 可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT;
POSTROUTING:可以在这里定义进行 源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。OUTPUT:定义对本地产生的数据包的目的NAT规则