Iptables 防火墙

防火墙
瑞星 江民 诺顿 卡巴斯基  天网......
iptables:
netfilter / iptables --iptables 的全名 2.4版本内核后都集成有这个组件
iptables 基本概念
四张表: 表里有链 (chain )
filter: 用来进行包过滤: INPUT OUTPUT FORWARD
nat: 用来网络地址转换:(network address translation)允许一个内网地址块,通过NAT转换成公网IP,实现对公网的访问,解决IP地址不足
PREROUTING POSTROUTING OUTPUT
mangle:用来对数据包标记
PREROUTING INPUT OUTPUT FORWARD POSTROUTING
raw:对原始数据包的处理
PREROUTING OUTPUT
Incoming / \ Outgoing
-->[Routing ]--->|FORWARD|------->
[Decision] \_____/ ^
| |
| ____
___ / \
/ \ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
----> Local Process ----
iptables
-A 增加一条规则,后接链名,默认是加到规则的最后面
-D 删除
-L 列出规则
-n 以数值显示
-I 在最前面插入规则
-v 显示统计数据,与-L一起用,看到的信息更多
-F 清空规则
-z 清空计数器
-X 清空自定义链
-t 后接表名
-P policy,默认策略
-p protocol,后接协议名
--dport 目标端口
--sport 源端口
-d destination,目标地址
-s source,源地址
-i 接网卡接口, 进入的网卡接口
-o 接网卡接口, 出去的网卡接口
-j 后接动作
动作的分类:
ACCEPT 接收数据包
DROP 丢弃数据包
REJECT 拒绝数据包,和DROP的区别就是REJECT会返回错误信息,DROP不会
MASQUEREAD IP地址伪装,使用NAT转换成外网IP,可以PPP拔号(外网IP不固定情况)
SNAT 源地址转换,它与MASQUEREAD的区别是SNAT是接一个固定IP
DNAT 目标地址转换
REDIRECT 目标端口转换
LOG 记录日志
例1:列规则
iptables -L ----默认看的就是filter表
iptables -L -t filter
iptables -L -t nat
iptables -L -t mangle
iptables -L -t raw
例2:控制ping
# iptables -F
10.1.1.0/24网段ping本机,会被拒绝(客户端会收到拒绝信息)
# iptables -t filter -A INPUT -p icmp -s 10.1.1.0/24 -j REJECT
# iptables -t filter -D INPUT -p icmp -s 10.1.1.0/24 -j REJECT ----删除上一条规则
# iptables -t filter -A INPUT -p icmp -s 10.1.1.0/24 -j DROP
# iptables -t filter -D INPUT -p icmp -s 10.1.1.0/24 -j DROP
# iptables -t filter -A OUTPUT -p icmp -d 10.1.1.0/24 -j REJECT
# iptables -t filter -D OUTPUT -p icmp -d 10.1.1.0/24 -j REJECT
# iptables -t filter -A OUTPUT -p icmp -d 10.1.1.0/24 -j DROP
# iptables -t filter -D OUTPUT -p icmp -d 10.1.1.0/24 -j DROP
--上面四种方法都可以控制拒绝10.1.1.0/24网段ping本机
# iptables -t filter -A INPUT -p icmp -j REJECT --如果不写-s或-d,默认代表所有人
扩展:
我想实现所有人都ping不通我,但是10.1.1.X(X你自定义)这个IP能ping通我
--提示:iptables的匹配规则:读取的顺序是从上往下一条一条匹配,匹配一条就不继续往下匹配,都没有匹配,则最后匹配默认策略
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -A INPUT -p icmp -s 10.1.1.X -j ACCEPT
----此写法错误的
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -I INPUT -p icmp -s 10.1.1.X -j ACCEPT
----正确写法,把第二条加到第一条前面
# iptables -t filter -I INPUT 2 -p icmp -s 10.1.1.X -j ACCEPT
----链后面接数字2,表示插入到原来第二条的上面,成为新的第2条
删除的方法:
方法一:
# iptables -t filter -D INPUT -s 10.1.1.X -p icmp -j ACCEPT
----加的时候怎么写,删除时就要怎么写 A 参数换成 D就可以
方法二:
# iptables -L -n --line
# iptables -D INPUT 2
----在规则比较多或者不好写规则的情况下,可以先用--line或者--line-number列出行号,再用行号删除
方法三:
# iptables -F -----直接清空filter表的所有规则
iptables -X
iptables -Z ----清除计数器,自定义链
例3,规则的保存与还原 (默认的规则:/etc/sysconfig/iptables)
# /etc/init.d/iptables save ----这样是默认保存到/etc/sysconfig/iptables(重启后依然有效)
# iptables-save > /etc/sysconfig/iptables ----将当前规则保存到这个文件,文件可以自定义
# iptables-save > /etc/sysconfig/iptables_1 ----将当前规则保存到自定义的文件(重启后,该自定义保存的规则无效)
# iptables -F
# iptables -X
# iptables -Z
----使用这三条来清空filter表,如果别的表也要清空的话,就加-t 表名都清一次
# iptables-restore < /etc/sysconfig/iptables ----把保存的规则还原回去
--/etc/sysconfig/iptables文件为默认保存文件,重启iptables服务会默认把此文件里的规则还原。当然也可以手工保存到另一个文件,就需要iptables-restore手工还原了。
例4,每个链的默认策略的修改
# iptables -P INPUT DROP ----INPUT键默认策略改为DROP,改回来把DROP换成ACCEPT就行了
# iptables -P OUTPUT DROP ----OUTPUT键默认策略改为DROP
例5,实现允许ssh过来(代表本机为服务器身份),ssh出去(代表本机为客户端身份),别的任何访问都拒绝 (要求,INPUT和OUTPUT双链默认策略都为DROP)
OUTPUT INPUT
客户端 随机端口 ---》 服务器 22
   (1024-65535) 
客户端 随机端口 《--- 服务器 22
INPUT OUTPUT
实现允许10.1.1.0/24网段来ssh本机(服务器),其它任何访问都拒绝(在双链拒绝的情况下)
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 22 -d 10.1.1.0/24 -j ACCEPT
实现允许从本机(客户端)ssh到10.1.1.0/24网段的服务器,其它任何访问都拒绝(在双链拒绝的情况下)------
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A OUTPUT -p tcp --dport 22 -d 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --sport 22 -s 10.1.1.0/24 -j ACCEPT
例6,
在上面的基础上再加上只允许10.1.1.0/24这个网段访问你的httpd服务,和你只能访问10.1.1.0/24网段的httpd服务
http tcp 80
https tcp 443
例7,
在上面的基础上再加上允许别人访问本台服务器的DNS
只需要做udp的53端口就可以了,不用写tcp 53(因为tcp 53主要是用于主从DNS服务器同步的)
-------------------------------
一些特殊的写法
连续端口或多端口写法
iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 25,110 -j ACCEPT
硬件地址
iptables -A INPUT -m mac --mac-source 00:23:CD:95:DA:0B -p all --dport 80 -j ACCEPT
例8
samba
139 445
例9, 邮件服务器
smtp 25 pop3 110 imap 143
smtps 465 pop3s 995 imaps 993
客户端 邮件服务器
随机 -------> 25,110,143
随机 <------- 25,110,143
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -p tcp -m multiport --dport 25,110,143 -s 10.1.1.0/24 -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --sport 25,110,143 -d 10.1.1.0/24 -j ACCEPT
例10 dhcp
iptables 对dhcp端口控制无效
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
例11
nfs
--因为nfs用到rpc调用,端口不固定,所以需要把端口给固定起来.nfs服务也会用到rpc调用,也需要做端口绑定
vim /etc/sysconfig/nfs ----在此文件里加上下面四句
LOCKD_TCPPORT=3000
LOCKD_UDPPORT=3000
MOUNTD_PORT=3001
STATD_PORT=3002
/etc/init.d/nfs restart
/etc/init.d/rpcbind restart ----这里先把默认策略改成ACCEPT,再启动就可以启动起来,然后再把默认策略改回成DROP,再继续做下面的实验
netstat -ntl |grep 300 去查看,看到rpc.的守护进程的端口为自己绑定的端口
iptables -A INPUT -p tcp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3002 -j ACCEPT
iptables -A INPUT -p udp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p udp --sport 3000:3002 -j ACCEPT
还要加上2049(nfs)和111(rpcbind)的端口的规则
iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 2049 -j ACCEPT
iptables -A INPUT -p udp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p udp --sport 2049 -j ACCEPT
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -p udp --sport 111 -j ACCEPT
--现在就可以用另一台机showmount -e 查看并进行挂载了
--练习:把上面的3000,3001,3002,2049,111合起来来做
# iptables -A INPUT -p tcp -m multiport --dport 111,2049,3000,3001,3002 -j ACCEPT
# iptables -A INPUT -p udp -m multiport --dport 111,2049,3000,3001,3002 -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --sport 111,2049,3000,3001,3002 -j ACCEPT
# iptables -A OUTPUT -p udp -m multiport --sport 111,2049,3000,3001,3002 -j ACCEPT
例12: yum
视你做的yum类型而定
file
例13
mysql
3306
例14
rsync
873
还加一个22
例15
vnc
5900
练习:
服务器端准备:
# yum install vsftpd -y
pasv_min_port=3000
pasv_max_port=3005
# /etc/init.d/vsftpd restart
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
客户端测试方法:
1,命令连接测试,能成功连接上就表示命令端口连接没问题
# ftp 10.1.1.10(服务器的ip)
2,数据传输测试,用上面的命令登录成功后,在客户端使用passive指令转换你的主动和被动模式,
(服务器端不用转换,因为服务器端默认就是主动和被动都支持的)
然后使用ls指令能看到里面的pub子目录就表示数据传输OK了(因为默认是登录到服务器的/var/ftp/目录,里面有一个pub子目录)
1,为什么有主动和被动两种连接方式呢?
因为这是一种比较古老的设计方式,它是假设客户端用户有防火墙并且还不会配置防火墙的情况下,才设计出两种模式。
防火墙默认只会拒绝进来的包,而不会拒绝出去或出去回来的包。
2,一般用主动好还是被动好?
用被动比较常见,(原因参考问题一)
3,主动和被动在使用时的区别?
没有防火墙,那么使用起来没什么区别,只是底层传输包的方式不一样
有防火墙,那么防火墙的规则写法也不一样
主动:
service client
20 21 n~m
<--------------------
--------------------->
------------------------------------------->
<--------------------------------------------
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
被动:
service client
随机端口 21 n~m
3000-3005 <--------------------
--------------------->
<----------------------------------------------------------
---------------------------------------------------------->
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT
posted @ 2018-06-19 21:44  Sky-wings  阅读(224)  评论(0编辑  收藏  举报