iptables工作在网络层
数据走向图:
iptables语句语法:
表名 命令 匹配 目标
iptables -t t_name -A INPUT -p tcp/udp -j
icmp DROP
-I -s IP/NET ACCEPT
-L -d IP/NET REJECT
-D --sport N1:N2 REDIRECT
-F --dport 25 MASQUERADE
-P 25: LOG
25:28
-i 进入的接口
-o 出去的接口
-A 向下添加规则 INPUT -d 目标IP
filter 进入
-I 向上添加规则 OUTPUT -s源IP
发出 --sport源端口
-L显示规则与-n连用不用解析 FORWARD -p协议 {
iptables -t nat 转发 -i源接口 --dport目标端口
-F将规则全部清空 PREROUTING
路由前转化 -o目的接口
-D删除一条规则 POSTROUTING
路由后转化
-P 默认规则修改
mangle
-R 替换规则
-N 自定义规则
-S 删除自定义链
-Z 清空计算器
检查表的顺序:m---->n------------>f
目标:设置iptables,提高安全性
service iptables save
内核的netfilter/iptables
进入 出去
------->进行路由判断----->FORWARD------------------>
| |
| |
| |
INPUT OUTPUT
| |
|_____本地程序___|
INPUT
filter {FORWARD 作FW功能,保护本机或者隔离两个网络
OUTPUT
eg: A 192.168.0.253
拒绝192.168.0.0/24访问A的22端口
iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j DROP
iptables -t filter -L INPUT
command match target
iptables -t table_name -A CHAIN_NAME -s ip/net DROP
-P INPUT -d ip/net ACCEPT
-F OUTPUT -p tcp/udp/icmp
-L FORWARD --sport 22 / 22:
-D PREROUTING --dport 22:100
-I POSTROUTING -i eth0
-o eth0
DROP/ACCEPT/REJECT/LOG/MASQUERADE/REDIRECT/SNAT/DNAT
| | | | | | | |
丢弃 /接受 / 丢弃+恢复/r日志/伪装 /端口重定向 /源NAT/目标NAT
先来看防火墙功能 --- filter表
INPUT 对目标地址是本机的数据包的检查点
OUTPUT 对由本地像外发的数据包的检查点
FORWARD 对经过本机转发到其它的网络的检查点(要求本机做为路由器功能打开ip_forward选项)
1 、现在有一台服务器,仅提供如下服务
各服务器端口号:
ICMP
TELNET --tcp/udp23
SSH --tcp 22
DNS ---- udp/tcp 53
SAMBA ---- 137/138/139/445
NFS ---- 2049 ???
FTP ---- 21 20? 分主被动模式
SMTP---tcp/udp25 邮件的发
POP3---tcp/udp 110 邮件的收
DNS---tcp/udp53
DHCP---tcp/udp67.68
HTTP---tcp/udp80
HTTPS---tcp/udp 443
ORACLE--1521
WEBLOGIC--7777
MYSQL--tcp/udp 3306
RPC--tcp/udp111
SQUID---3128
表:
1.filter:用于过滤的时候
2.nat: 用于做 地址转换 NAT:Network Address Translator
3.mangle: 给数据包打标记
链:
1.INPUT: 位于 filter 表,匹配目的 IP 是本机的数据包
2.FORWARD: 位于 filter 表,匹配穿过本机的数据包
3.OUTPUT: 位于 filter 表,匹配来源IP 是本机的数据包
4.PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)
5.POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)
语法:
iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配到以后的动作]
iptables 中的指令,均需区分大小写。
在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设是作用在 filter 这个表。
1.iptables -A APPEND,追加一条规则
例:iptables -t filter -A INPUT -j DROP 在 filter 表的 INPUT 链里追加一条规则(作为最后一条规则)
匹配所有访问本机 IP 的数据包,匹配到的丢弃
2.iptables -I <链名> [规则号码] INSERT,插入一条规则
例: iptables -I INPUT -j DROP 在 filter 表的 INPUT 链里插入一条规则(插入成第 1 条)
iptables -I INPUT 3 -j DROP 在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)
注意: 1、-t filter 可不写,不写则自动默认是 filter 表
2、-I 链名 [规则号码],如果不写规则号码,则默认是 1
3、确保规则号码 ≤ (已有规则数 + 1),否则报错
3.iptables -D <链名> <规则号码 | 具体规则内容> DELETE,删除一条规则
例:iptables -D INPUT 3(按号码匹配) 删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)
iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配) 删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则
注意:
1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
2、按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错
3、按内容匹配删除时,确保规则存在,否则报错
4.iptables -R <链名> <规则号码> <具体规则内容> REPLACE,替换一条规则
例:iptables -R INPUT 3 -j ACCEPT 将原来编号为 3 的规则内容替换为“-j ACCEPT”
5.iptables -P <链名> <动作> POLICY,设置某个链的默认规则
例:iptables -P INPUT DROP 设置 filter 表 INPUT 链的默认规则是 DROP
注意:当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理。
动作前面不能加 –j,这也是唯一一种匹配动作前面不加 –j 的情况
6.iptables -F [链名] FLUSH,清除规则
例:iptables -F INPUT 清空 filter 表 INPUT 链中的所有规则
iptables -t nat -F PREROUTING 清空 nat 表 PREROUTING 链中的所有规则
注意:
1、-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则
2、-P 设置了 DROP 后,使用 -F 一定要小心!!!
3、如果不写链名,默认清空某表里所有链里的所有规则
7.iptables -L [链名] LIST,列出规则 --line-number 列出规则号
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M)
n:只显示 IP 地址和端口号码,不显示域名和服务名称
例:iptables -L 粗略列出 filter 表所有链及所有规则
iptables -t nat -vnL 用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号
iptables -t nat -vxnL PREROUTING 用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解
8.iptables -X 清除预设表 filter 中,使用者自订链中的规则
9.流入、流出接口(-i、-o)
iptables -A INPUT -i lo -j ACCEPT 匹配是否从网络接口 lo进来,本地接受
-o eth0 匹配数据流出的网络接口
10.来源、目的地址(-s、-d)
例:
-s 192.168.0.1 匹配来自 192.168.0.1 的数据包
-s 192.168.1.0/24 匹配来自 192.168.1.0/24 网络的数据包
-s 192.168.0.0/16 匹配来自 192.168.0.0/16 网络的数据包
-d 202.106.0.20 匹配去往 202.106.0.20 的数据包
-d 202.106.0.0/16 匹配去往 202.106.0.0/16 网络的数据包
-d www.abc.com 匹配去往域名 www.abc.com 的数据包
11.协议类型 (-p) 可以是 TCP、UDP、ICMP 等,也可为空
例:-p tcp -p udp -p icmp --icmp-type 类型(request-请求,reply-回应)
iptables -A INPUT -s 192.168.1.3 -p icmp --icmp-type echo-reply -j ACCEPT 表示来源地址1.3ping不通目的地址,但目的地址能ping通1.3
12.来源、目的端口(--sport、--dport)
--sport <匹配源端口> 可以是个别端口,可以是端口范围
例:
--sport 1000 匹配源端口是 1000 的数据包
--sport 1000:3000 匹配源端口是 1000-3000 的数据包(含1000、3000)
--sport :3000 匹配源端口是 3000 以下的数据包(含 3000)
--sport 1000: 匹配源端口是 1000 以上的数据包(含 1000)
--dport <匹配目的端口> 可以是个别端口,可以是端口范围
例:
--dport 80 匹配目的端口是 80 的数据包
--dport 6000:8000 匹配目的端口是 6000-8000 的数据包(含6000、8000)
--dport :3000 匹配目的端口是 3000 以下的数据包(含 3000)
--dport 1000: 匹配目的端口是 1000 以上的数据包(含 1000)
注意:--sport 和 --dport 必须配合 -p 参数使用
匹配应用举例
1、端口匹配 -p udp --dport 53 匹配网络中目的端口是 53 的 UDP 协议数据包
2、地址匹配 -s 10.1.0.0/24 -d 172.17.0.0/16 匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包
3、端口和地址联合匹配 -s 192.168.0.1 -d www.abc.com -p tcp --dport 80
匹配来自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 协议数据包
注意:
1、--sport、--dport 必须联合 -p 使用,必须指明协议类型是什么
2、条件写的越多,匹配越细致,匹配范围越小
13.-j ACCEPT通过,允许数据包通过本链而不拦截它
例:iptables -A INPUT -j ACCEPT 允许所有访问本机 IP 的数据包通过
14.-j DROP 丢弃,阻止数据包通过本链而丢弃它
]# iptables -P INPUT DROP
]# ping 127.0.0.1
]# iptables -t filter -A INPUT -i lo -j ACCEPT
]# iptables -t filter -A INPUT -p icmp -s 192.168.0.0/24 -j ACCEPT
]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
允许本机访问192。168。0。0/24的主机22端口,回来的数据包
]# iptables -t filter -A INPUT -p tcp --sport 22 -s 192.168.0.0/24 -i eth0 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 53 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 80 -j ACCEPT
[root@localhost /]#
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 443 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 25 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 110 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -p udp --dport 137:138 -s 192.168.0.0/24 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 139 -j ACCEPT
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 445 -j ACCEPT
[root@localhost /]#
总结以上重点:
1、默认策略为DROP,会更加 安全
itpables -t filter -P INPUT DROP
此时,最好iptables -t filter -A INPUT -i lo -j ACCEPT
千万不要iptables -t filter -F INPUT (并不会还原默认策略)
2、基本的iptables语句语法得会,并且能够了解内核是如何对数据包进行检查的。
一些常见的服务,基本IP/NET/PORT来做访问控制,应该没有任何问题!!!!
3、一定要会分析数据包的走向。SIP DIP SPORT DPORT
这样,写规则 才能正确并且精确!!!
4、记得保存规则,以避免重启服务规则还原
[root@localhost /]# iptables -L --line-numbers
[root@localhost /]# iptables -L INPUT -nv --line-numbers
[root@localhost /]# /etc/init.d/iptables save
将当前规则保存到 /etc/sysconfig/iptables: [确定]
[root@localhost /]#
NFS如何配置允许192.168.0.0/24?(INPUT的默认策略为DROP的情况下)
NFS使用了哪些端口?
rpcinfo -p
确定111,2049是必用,并且固定的,但是还有一些端口不固定,因而需要配置nfs,定义端口!!!
]# vim /etc/sysconfig/nfs
[root@localhost /]# grep 500 /etc/sysconfig/nfs
RQUOTAD_PORT=5001
LOCKD_TCPPORT=5002
LOCKD_UDPPORT=5002
MOUNTD_PORT=5005
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 5005 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 5005 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 5001 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 5001 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 5002 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 5002 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 2049 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 2049 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 111 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 111 -j ACCEPT
FTP如何配置允许192.168.0.0/24?(INPUT的默认策略为DROP的情况下)
FTP的工作模式有2种
主动模式(port)
被动模式(passive)
加载模块,识别FTP的数据连接为相应状态
[root@localhost /]# modprobe ip_nat_ftp
允许FTP的连接
[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 21 -j ACCEPT
允许FTP的数据传输,通过状态来匹配,匹配为ESTABLISHED和RELATED状态
[root@localhost /]# iptables -t filter -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
对应ICMP的不可达消息 也是RELATED状态
[root@www ~]# iptables -t filter -A INPUT -p icmp -m state --state RELATED -j DROP
ICMP如何配置为只允许192.168.0.253ping通192.168.0.0/24,反之则不允许(INPUT的默认策略为DROP的情况下)
[root@localhost /]# iptables -t filter -A INPUT -p icmp -m state --state ESTABLISHED -s 192.168.0.0/24 -j ACCEPT
----------高级匹配和高级扩展以及应用-----
icmp 无端口 网络层
tcp22
回环接口就是自己和自己的通信 lo是虚假想象出来的
udp?
-n 不显示详细信息 -v 显示详细信息
iptables -L-nv
rpcinfo -p 显示NFS的端口 111 2049必用
tcp/ip 协议 卷一 卷2 卷3
UDP
用端口不方便要用状态
源端口是大于1024的随即端口
1 192.168.1.0/24不可以访问192.168.2.253的22端口23端口53端口
分析来源和目标:
snet:192.168.1.0/24 dip:192.168.1.253
sport: >1024 dport:23,22,53
在1.253上的INPUT链写规则 :
[root@ netfilter]# iptables -t filter -A INPUT -p tcp -s 192.168.1.0/24 -d 192.168.1.253 --dport 22:23 -j DROP
[root@ netfilter]# iptables -t filter -A INPUT -p udp -s 192.168.1.0/24 -d 192.168.1.253 --dport 22:23 -j DROP
[root@ netfilter]# iptables -t filter -A INPUT -p tcp -s 192.168.1.0/24 -d 192.168.1.253 --dport 53 -j DROP
[root@ netfilter]# iptables -t filter -A INPUT -p udp -s 192.168.1.0/24 -d 192.168.1.253 --dport 53 -j DROP
[root@ netfilter]# iptables -t filter -L INPUT -n
[root@ netfilter]# iptables -t filter -L INPUT -n --line-number
[root@ netfilter]# iptables -t filter -D INPUT 3
[root@ netfilter]# iptables -t filter -L INPUT -n --line-number -v
Chain INPUT (policy ACCEPT 184M packets, 14G bytes)
num pkts bytes target prot opt in out source destination
1 24 2432 DROP tcp -- * * 192.168.1.0/24 192.168.1.253 tcp dpts:22:23
2 0 0 DROP udp -- * * 192.168.1.0/24 192.168.1.253 udp dpts:22:23
[root@ netfilter]# iptables -t filter -P INPUT DROP
[root@ netfilter]# iptables -t filter -A INPUT -i lo -j ACCEPT
[root@ netfilter]# ping localhostPING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.136 ms
--------------
作业:
A ------ B
A、B都启动22端口
A、B的默认策略都设置为DROP掉
A 可以ssh到B
B 不可以ssh到A`
-------------
sysctl -a
net.ipv4.netfilter.ip_conntrack_max = 65536
vim /etc/grub.conf
kernel /boot/vmlinuz-2.6.18-238.el5 ro root=LABEL=/1 ip_conntrack.hashsize=524288
------- iptables ++++++++扩展匹配++++++++++
这就需要用到 netfilter 的功能扩展模块,所有的扩展模块都存放在 /lib/modules/2.6.X/kernel/net/ipv4/netfilter/ 下。
可以自行编译额外的 netfilter 功能模块到这里,在使用新加入的模块之前,需要先加载模块:insmod 模块(可以填绝对路径),
也可以使用 iptables 的 --modprobe= 参数来指定 。
!! 内核模块都是根据特定的内核环境编译出来的,所以不同的内核编译出来的内核模块一般是不通用的。
!! netfilter 的动态衔接库文件位于 /lib/iptables/ 下
使用方法:
需要先使用 -m 选项来指定要使用的扩展匹配功能(模块),之后再指明参数
!! TCP 连接,三次握手(建立链接),四次挥手(断开链接)
?? 模块与动态衔接库的区别
modinfo ip_nat_ftp.ko 查看模块的详细信息
大写的就是拓展目标,小写扩展匹配
1. -m connlimit 匹配并发连接数(一个用户打开多线程操作)用于限制每个IP并发的TCP最大连接数
[!] --connlimit-above n 匹配并发连接数大于 n 个
iptables -m connlimit -h 查看用法
例:只允许不超过三个用户连接到本机的21端口(ftp服务),如果超过了 3 个,则 REJECT 每个访问23端口的并发连接数
iptables -t filter -A INPUT -p tcp --dport 21 -m connlimit --connlimit-above 3 -j REJECT
iptables -t filter -A INPUT -p tcp --syn--dport 23 -m connlimit --connlimit-above 3 -j REJECT
或者
iptables -t filter -A INPUT -p tcp --syn--dport 23 -m connlimit !--connlimit-above 3 ACCEPT
限制子网掩码不常用
iptables -t filter -A INPUT -p tcp --syn--dport 23 -m connlimit --connlimit-above 3 --connlimit-mask 24 --j REJECT
每IP访问23端口的并发连接数上限超过2个就REJECT
[root@www netfilter]# iptables -t filter -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
[root@www netfilter]# iptables -t filter -A INPUT -p tcp --syn --dport 23 -m connlimit -h
[root@www netfilter]# iptables -m connlimit -h
每IP访问80端口的并发连接数上限超过3个就REJECT
[root@ ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP
[root@ ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m connlimit ! --connlimit-above 3 -j ACCEPT
[root@ ~]# iptables -L INPUT -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 #conn/32 > 3
# limit the nr of parallel http requests to 16 per class C sized
# network (24 bit netmask)
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
2. -m icmp 匹配 ICMP
--icmp-type [!] typename
可以使用 iptables -p icmp -h 来查看 typename,这些 typename 都对应着协议的编号,其中两个重要的是, 0 表示 echo-reply (icmp 回复),
8 表示 echo-request (icmp 请求)
注意:使用时,需要先指明网络协议为 icmp
两种基本的ICMP类型:
echo-request
echo-reply
ping (icmp) 工作流程图 A ping B B pingA数据包的走向图
A -- icmp (echo-request) --> B
A <-- icmp (echo-reply) -- B
A <--icmp (echo-request)-B
A----icmp (echo-reply)------>B
可以直接拒绝 icmp 协议,但这样不论 ping 别人还是别人 ping 本机,都是不可以的(被DROP了)。
iptables -t filter -A INPUT -p icmp -j DROP
例:为了达到别人不能 ping 本机,而本机可以 ping 别人的目的,可以按顺序加入下规则
iptables -t filter -A INPUT -p icmp -s 192.168.0.0/24 -m icmp --icmp-type echo-reply -j ACCEPT
iptables -t filter -A INPUT -p icmp -j DROP
注意:可以直接以 0 代替 echo-reply ,8 代替 echo-request
[root@ ~]# iptables -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
[root@ ~]# iptables -I INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
[root@ ~]# iptables -I INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
3. -m iprange 匹配 IP 的范围
[!]--src-range ip1-ipn源范围
[!]--dst-range ip1-ipn目标范围
例:不允许 192.168.0.1 到 192.168.0.100 的主机 ping 本机
iptables -t filter -A INPUT -p icmp -m iprange --src-range 192.168.0.1-192.168.0.100 -j DROP
]# iptables -P INPUT ACCEPT
]# iptables -F
]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m iprange --src-range 192.168.0.1-192.168.0.100 -j DROP
允许192.168.1.1-192.168.1.100主机上网
]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.1-192.168.1.100 -j ACCEPT
]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.101-192.168.1.252 -j DROP
范围的匹配,指某一段的ip
iptables -A INTPUT -m iprange --src-range 192.168.0.1-192.168.0.100 -j ACCEPT 一段地址进行访问允许
4. -m length 匹配IP数据包的大小 分片 分段按长度
注意:这里是数据包的大小,包括了IP包头信息和包内数据信息
num1:num2 包的大小为 num1 到 num2 之间
num1: 包的大小为 num1 以上,包括 num1
:num2 包的大小为 num2 以下,包括 num2
关于 ping 的包中的数据大小和包头大小
[root@station24 ~]# ping 192.168.0.253
PING 192.168.0.253 (192.168.0.253) 56(84) bytes of data.
64 bytes from 192.168.0.253: icmp_seq=1 ttl=64 time=0.566 ms
64 bytes from 192.168.0.253: icmp_seq=2 ttl=64 time=0.167 ms
64回的包的大小
注意,回执信息第一行中的 56(84) ,这表示回执的包大小是84个字节,其中54个字节是数据部分,剩下的28字节是 header 信息,其中20个字节是IP的 header 源ip目标IP,
剩下的8个是ICMP的 header。
使用 ping 的 -s 选项来指定发送的 icmp 包中的数据的大小
ping -s sum IP ping -s 100 192.168.0.253
这里用 -s sum 选项来指定发送的包中的数据的大小为 sum ,因此包的大小会是 sum + 28 bytes
例:只接受数据包大小在 200 bytes 以内的 icmp 数据包(ping )
iptables -t filter -A INPUT -p icmp -m length --length :200 -j ACCEPT
]# iptables -t filter -A INPUT -p icmp -m length --length 100:200 -j ACCEPT
]# iptables -t filter -A INPUT -p icmp -j DROP
]# iptables -t filter -I INPUT -s 192.168.1.0/24 -p icmp -m length --length 80:100 -j DROP
这里列出所有的 header 大小信息:
TCP header 20 bytes
UDP header 8 bytes
IP header 20 bytes
icmp header 8 bytes
因为 MTU 为 1500 bytes(假设这里的路径MTU为 1500),那么发送一个 6000 bytes 的包就必须分片,这里要分为 4 片,分别是
packet_01 40 + 1460 = 1500 bytes
packet_02 40 + 1460 = 1500 bytes
packet_03 40 + 1460 = 1500 bytes
packet_04 40 + 620 = 1500 bytes
这里使用的是 TCP 协议,所以 TCP header + IP header = 40 bytes
5. -m limit 匹配每段时间内接受包的个数 限制速度
使用令牌桶过滤算法,就是说,每段时间内允许传输一定数量的包,超过则阻止,如果传输的包较少,则把多余的允许值放入令牌桶,那么如果另一段时间,请求超过规定的数目后,
就会从令牌桶中抽出以前保存的允许值,交给这些多出的请求。
--limit rate rate的形式可以是 num/minute,表示每分钟只接受num个包,也可设定时间段为 second 、hour 、day,默认是 3/hour,这里一个包的最大大小受MTU大小所限制。
--limit-burst number 爆发流量,设定令牌桶中初始的允许包的数目为 number,默认是 5。
例:每分钟只接受10个icmp包,超过的(即使说不匹配这条规则的)则按默认规则来处理。
iptables -t filter -A INPUT -p icmp -m -icmp --icmp-type echo-request -m limit --limit 10/minute -j ACCEPT
这里通过限制本机服务的回包数,即在 OUTPUT 上限制包流量,来限制对方的对本服务的访问速度
]# iptables -F OUTPUT
]# iptables -t filter -A OUTPUT -p tcp --sport 80 -m limit --limit 20/second -j ACCEPT
]# iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP
----------
]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
例:设定客户端访问http服务的带宽为30KB
iptables -t filter -A OUTPUT -d 192.168.0.0/24 -p tcp --sport 80 -m limit --limit 20/minute -j ACCEPT
iptables -t filter -A OUTPUT -d 192.168.0.0/24 -p tcp --sport 80 -j DROP # 如果不匹配上面的那一条,则这一条就是 httpd 的默认规则
]# watch iptables -L INPUT -nv
]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type echo-request -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type echo-request -j DROP
----------wget 下载 速率30k/s--------
]# iptables -t filter -A OUTPUT -p tcp --sport 80 -m limit --limit 20/second -j ACCEPT
]# iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP
可以限制数据包有多少通过
两个一起写:
1.iptables -A INPUT -m limit --limit 10/m -p icmp -j ACCEPT 10指每分钟10个包
2.iptables -A INPUT -p icmp -j DROP 不符合的丢弃
下载速度:
iptables -A INPUT -m limit --limit 20/s -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP 不符合上条规则的丢弃
测试:dd if=/dev/zero of=file 在/var/www/html/下写文件
启动APACHE
wget 192.168.0.28/file
也可这么写:
iptables -A OUTPUT -d 192.168.0.28 -p tcp --sport 80 -m limit --limit 20/s -j ACCEPT
iptables -A OUTPUT -d 192.168.0.28 -p tcp --sport 80 -j DROP
!! lo 接口的 MTU(16436),因为是本地回环,所以要远远大于其他物理网卡接口的 MTU 大小(1500bytes),所以使用 iptables 的 -m limit 限制流量时,若本机访问自己的服务,
则情况会有所不同
!! 使用 ethtool 来调整网卡的参数,比如修改网卡支持的贷款(10M 或 100M 或 1000M,以及全工双全工的设置等等)
wget http://192.168.0.253/file
8b=12KB
100/8
30KB/S=30000b/s
包大小大约是1500b
所以20/s 每秒20个包
6. -m mac 匹配网卡 MAC 地址 基于MAC地址的访问 只能用于INPUT和PREROUTING链使用
--mac-source [!] address
格式:-m mac --mac-source mac_addr
MAC 地址的写法是 XX:XX:XX:XX:XX:XX ,6个16进制数,总大小 48bit
]# iptables -A INPUT -p icmp -m mac --mac-source 00:B0:C4:01:27:D1 -j DROP
.ping 发个数据包 然后用arp -n可查看mac地址
iptables -A INTPUT -m mac --mac-source 00:23:54:6A:18:CE -j DROP 不写协议表示都默认,写多个只有写多个iptables语句
7. -m mark 匹配 mangle 表所标记的包 标记mask 相当于合格证 安装数据包的标记匹配,按照数据包的标记匹配
mangle表:给数据包打标记,一般在路由前打标记
转发功能只能在nat表PREROUTING中打标记
--mark value
打标记:iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.1-192.168.0.100 -j MARK --set-mark 1
MARK打标记,名字为1。(1到无穷大的整数只是打标记,需要应用到其他的链里)
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.200 -j MARK --set-mark 2
iptables -t filter -A FORWARD -m mark --mark 1 -j DROP
iptables -t filter -A FORWARD -m mark --mark 2 -j ACCEPT
]# iptables -t filter -I INPUT -m mark --mark 1 -j DROP
]# iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.1.1-192.168.1.50 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.253 -j MARK --set-mark 2
iptables -t filter -A FORWARD -m mark --mark 1 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A FORWARD -m mark --mark 2 -p tcp --dport 80 -j DROP
]# iptables -t mangle -A FORWARD -m iprange --src-range 192.168.1.1-192.168.1.100 -j MARK --set-mark 1
]# iptables -t mangle -A FORWARD -m iprange --src-range 192.168.1.101-192.168.1.200 -j MARK --set-mark 2
]# iptables -t filter -A FORWARD -m mark --mark 1 -j ACCEPT
]# iptables -t filter -A FORWARD -m mark --mark 2 -j DROP
-m mark --mark
-j MARK --set-mark
[root@www iptables]# iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.1-192.168.0.100 -j MARK --set-mark 1
[root@www iptables]# iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.253 -j MARK --set-mark 2
[root@www iptables]# iptables -t filter -A FORWARD -m mark --mark 1 -j DROP
[root@www iptables]# iptables -t filter -A FORWARD -m mark --mark 2 -j ACCEPT
iptables -A INPUT -m mark --mark 1 -p tcp --dport 80 -j ACCEPT 表示标记1到端口80的都接收,默认在filter表
8. -m multiport 匹配多个端口
--destination-port port1,port2,...,portN 指定多个目的端口
--source-port port1,port2,...,portN 指定多个源端口
例:DROP掉到本机端口 22、23 和 80 的包
iptables -t filter -A INPUT -p tcp -m multiport --destination-ports 22,23,80 -j DROP
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp -m multiport --destination-ports 22,25,110,80 -j ACCEPT
]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --destination-ports 22,25,110,80,53,21 -j DROP
9. -m owner 匹配数据包的创建者(用户、进程、用户组...)只能用于OUTPUT链 并且不是所有包都是有所有者的 比如ping包
--uid-owner 指明发出该包的用户的UID
--gid-owner 指明发出该包的用户组的GID
--pid-owner 指明发出该包的进程的PID
]# iptables -t filter -A OUTPUT -m owner --uid-owner pg -j DROP
su - pg
访问其它主机的80,22等,都不允许,因为产生的访问包所有者被匹配为pg身份
一般仅能用在 OUTPUT,限制本地发出的包 ,但有些协议不支持就是说不是所有包都有 所有者 的(icmp,它没有创建者)
注意:甚至可以限制 root ( uid = 0 )。
]# iptables -t filter -A OUTPUT -p tcp --dport 21 -m owner --uid-owner 0 -j DROP
例:凡是uid为500的用户发出的数据包,都DROP掉,即不允许他与外界通信
iptables -t filter -A OUTPUT -m owner --uid-owner 500 -j DROP
]# iptables -t filter -A OUTPUT -p tcp --dport 21 -m owner --uid-owner 1011 -j DROP
不想让普通帐号访问web服务器,也可是组
写法:iptables -A OUTPUT -m owner --uid-owner `id -u hello` -j DROP 如果用户为hello就丢弃,不让其访问(id -u hello 打印帐号UID)
访问其他主机的 80 22
10. -m state 匹配IP包的状态,用于对数据包的状态进行追踪
需要安装模块 ip_conntrack
所有包的状态被保存在文件: /proc/net/ip_conntrack
状态 NEW 表明这个包要开启一个新的连接,或者和另外一个包相关连(不管什么协议都一样,对 UDP 协议来说是第一个包,对 icmp 协议是 icmp-request 包)
状态 ESTABLISHED 表示一个连接已经建立了
状态 RELATED 表示这个包开启了一个新的连接,但与前一个开启的连接相关联(比如 被动方式连接的 FTP 、icmp 的报错)
状态 INVALID 表示这个包不能被识别,它不是 NEW 状态,但这个包不和任何一个已经建立的连接相关联,这种包是十分可疑的,一般要 DROP
以 TCP 的3次握手建立连接为例:
| -- syn seq=num1 --> | NEW
ESTABLISHED | <-- ack=num1 seq=num1+1 -- |
| -- seq=num1+2 ack=num1+1 --> | ESTABLISHED
| ... | 之后两端传输的数据包就都是 ESTABLISHED 状态了
!! 数据传输的模式:主动模式(端口模式) 和 被动模式,主动模式的 FTP 是数据端口是 20 ,而被动模式的则是1024以上的随机端口
例:通过状态来限制 icmp 包
iptables -t filter -A INPUT -s 192.168.0.0/24 -p icmp -m state --state NEW -j ACCEPT
例:通过包的状态来控制ftp服务
因为ftp是默认被动连接的,所以需要通过包的状态来设置ftp的过滤规则
modprobe ip_nat_ftp # 需要安装这个模块,可以基于状态去控制 FTP 服务
]# insmod /lib/modules/2.6.18-128.el5xen/kernel/net/ipv4/netfilter/ip_nat_ftp.ko
使本地主机可以通过 lo 接口来访问本地的服务
iptables -I INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -s 192.168.0.0/24 -j ACCEPT # 允许访问 21 端口
iptables -t filter -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -s 192.168.0.0/24 -j ACCEPT # 允许 ftp 随机开启的数据端口
第一次发出来的是NEW包,服务器给你回应的包就为建立包ESTABLISHED
iptables -A INPUT -m --state NEW -j DROP 意思是:例如:0.254和0.28两个IP,这个命令就是0.254能ping通0.28,但0.28不能ping通0.254 ,0.28发出一个新包会被丢弃,是进入,
所以要看INPUT链,0.254是出去,所以要看OUTPUT链。
iptables -A OUTPUT -m state --state NEW -j DROP 0.254向外发出的数据包都被丢弃.即不允许访问别人
iptables -A OUTPUT -m state --state ESTBALISHED -j ACCEPT
第三个状态RELATED 通常和 ESTBALISHED连用,用逗号隔开
第四个状态INVALID 通常和NEW连用
写法:iptables -A OUTPUT -m state --state ESTBALISHED,RELATED -j ACCEPT
INVALID状态
iptables -t filter -A INPUT -m state --state INVALID -j DROP
1、如果从来没发送过ICMP-REQUEST,而收到了一个ICMP-REPLY,这种属于INVALID状态
2、如果从来没有TCP连接过,而收到了一个FIN的标记的数据包
iptables -t filter -A INPUT -p icmp -m state --state NEW -j ACCEPT
11. -m tcp 匹配 TCP header 的标记
--tcp-flags [!] mask comp 匹配标志位
tcp header 共20字节,其中包括一个字节的标记段
一个字节是 8 bit,这个标记段的每个 bit 位都代表一个标记,比如 SYN 和 ACK
它所匹配的其他标志位:
RST 标记 如果服务端没有开启Client要访问的端口,则返回一个 RST 标记的包给 Client
FIN 标记 断开链接时使用
PSH 标记
URG 标记 紧急标记位,服务端当机时,会尽力发送一个带有URG标记的给Client,以通知。
SYN: tcp 3次握手同步位标记 syn洪水攻击 占用系统的资源导致正常的用户无法完成数据的传输
ACK:确认标记位 3次握手 4次挥手 中间发送数据都用到
PSH:信息快速到达接受放收到这个标记 直接交给应用程序 交互的服务应用较多 推位
RST: 重置标记位 访问没有开启的端口的时候 服务器发送ACK 和PST标记重置一下
FIN:仅在非法扫描和4此挥手用
URG:紧急标记位
以后会举例,针对于syn的洪水攻击来写规则
你好 你好 好 3次握手
例:
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
它同时检查 SYN ACK FIN RST 四种标记,并且 SYN 标记置 1 ,其它的标记位(ACK FIN RST)为 0 。只有SYN位设置 其他标记位没有被设置的就匹配
iptables -t filter -A INPUT -p tcp -m tcp SYN,RST,ACK,FIN SYN --dport 80 -j DROP
注意:-m tcp 是被默认加载的,可以不写 -m tcp
-p tcp --tcp-flags
]# iptables -t filter -A INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN --dport 80 -j DROP
-m tcp --tcp-flags SYN,ACK,FIN,PSH SYN
-p tcp --syn
保存 iptables 规则
]# /etc/init.d/iptables save
将当前规则保存到 /etc/sysconfig/iptables: [确定]
规则会被保存在 /etc/sysconfig/iptables ,这样下次开机时,这个文件中的规则会被自动地加载。
[root@ html]# tcpdump -i eth0 -vn src host 192.168.1.2 and dst port 22 and dst host 192.168.1.253 抓包测试
12. -m string 匹配包中数据所包含的字符串
需要 kernel >= 2.6.14
--string str 包中的数据是否包含 str 数据
z对中文字符是无效的
]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 21 -m string --algo bm --string "pg" -j DROP
通过字符串匹配,实现不允许以FTP方式以pg身份连接192.168.0.253
# iptables -t filter -I INPUT -s 192.168.1.8 -p tcp --dport 21 -m string --algo bm --string "USER" -j DROP
# tcpdump -i lo -vn host localhost and port 21 -XROP//抓包测试
13. -m tos 由于匹配 IP 头部信息中的 8 bits 的服务类型标志位 (Type of Service field)在 IP首部(20字节)中有一个自己的位置用来描述数据包的TOS值
[!] --tos value
根据 tos 对服务进行分类,一共5种类型
Minimize-Delay 最小延时服务 16 典型的服务 telnet ssh 交互式服务
Maximize-Throughput 最大吞吐量服务 8 吞吐量是指单位时间内传输的数据量,这个标志位一般用于高速的数据传输,比如 scp ftp http下载wget
Maximize-Reliability 最大可靠性 4 要求数据最为可靠地(不丢包,数据不出现错误)传送过来
Minimize-Cost 最小消费服务 2 使用有限的带宽
Normal-Service 一般服务 0 比如 icmp 包
查看更多的帮助
iptables -m tos -h
8位的 Type of Service field 前三位为使用 中间4位 保留
xxx xxxx x
未用 TOS 0
1000 0 16 D 0X10
0100 0 8 T
0010 0 4 R
0001 0 2 C
0000 0 0 N
例:设定 ssh 服务的功能,只允许scp,不允许ssh
]#iptables -t filter -A INPUT -p tcp --dport 22 -m tos --tos 16 -j DROP
在IP首部(20字节)中有1个字节的位置用来描述数据包的TOS值
TYPE OF SERVICE 服务类型
# iptables -t filter -A INPUT -p tcp -m tos --tos 16 -j DROP
14. -m ttl 匹配IP包的存活时间,一个IP包一旦创建,则 ttl 被赋值为128(跳),每经过一个路由器,则减 1(默认减1,也可能有其他的减值)描述记过几个路由器
--ttl-eq num
ttl 值是 IP header 中的部分。描述记过几个路由器
系统现在的(内存中)的 ttl 值保存在 /proc/sys/net/ipv4/ip_default_ttl 。
可以使用如下的方法,来定义系统默认的 ttl 值,修改 /etc/sysctl.conf ,添加如下内容
net.ipv4.ip_default_ttl = new_value
注意:也就是把 net/ipv4/ip_default_ttl 路径中的 / 换成 . 得到的……
例:不转发 ttl 为 64 的数据包,一般 linux 的包的 ttl 为 64,而 Windows 的为 128
iptables -t filter -A FORWARD -m ttl --ttl-eq 64 -j DROP
iptables -t filter -A INPUT -p icmp -m ttl --ttl-eq -j DROP
]# iptables -A INPUT -p icmp -m ttl --ttl-eq 64 -j DROP
--------
]# iptables -t filter -A FORWARD -m ttl --ttl-eq 128 -j DROP
在 ping 对方时,设定 icmp 包的 ttl 值
ping -t ttl_value IP
ping 192.168.0.253 -t 66 用ttl值ping
]# iptables -t filter -A INPUT -p icmp -m ttl --ttl-eq 64 -j DROP
]# echo "net.ipv4.ip_default_ttl = 128" >> /etc/sysctl.conf
15. -m udp 匹配 UDP 协议
比较典型的UDP服务,syslog ,监听的端口为 514
16 -m time
编译time模块
]# cp /var/ftp/pg/iptables_dir/ipt_time.ko /lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/
]# insmod /lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/ipt_time.ko
]# iptables -t filter -A INPUT -p icmp -m time --timestart 15:23 --timestop 18:00 --days Wed -j DROP//禁止ping
iptables -t filter -A INPUT -p tcp -m time --time start 15:23 --timestop 18:00 --days w ed -j DROP //15:23dao 18:00点禁止访问
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/
ko内核功能模块
so共享模块
=======目标扩展=========
是除 ACCEPT DROP REJECT 之外的处理操作
]# cd /lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/ 模块所在处
-j
TARGET扩展总结:
ACCEPT丢弃
DROP 拒绝
REJECT --reject-with拒绝并且回复信息
MARK --set-mark 标记
LOG 日志
MASQUERADE伪装
MIRROR 反弹数据包,就是将发向本机的数据包中的源地址和目的地址对换,然后发出
1. REJECT 扩展拒绝
REJECT 相当于 丢失+和恢复信息
REJECT --reject-with icmp_error_message
这些 icmp_error_message 不是随便设定的,因为要通过 icmp 回传,这些出错信息都是已经定义好的,出现什么错误就要回传什么 icmp 报错包。
!! icmp 包除了 1 和 8,其他的都是用于错误信息的回应,比如无法访问对应httpd服务,对方就会返回一个 icmp 包,通知相应的错误。
iptables -t filter -A INPUT -p tcp -j REJECT --reject-with icmp-proto-unreachable网络不可达
icmp-host-unreachable 主机不可达
icmp-proto-unreachable 协议不可达
iptables -t filter -A INPUT -p tcp -j REJECT -h 可以查看
]# iptables -t filter -A INPUT -p icmp -j REJECT --reject-with icmp-proto-unreachable
REJECT --reject-with xxxxxx
[root@ html]# iptables -t filter -A INPUT -p icmp -j REJECT -h
[root@ html]# iptables -t filter -A INPUT -p icmp -j REJECT --reject-with icmp-net-unreachable
[root@ html]# iptables -t filter -A INPUT -p tcp --dport 80 -j REJECT --reject-with icmp-net-unreachable
# iptables -t filter -I INPUT -p tcp --dport 80 -j REJECT --reject-with tcp-reset
[root@ html]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 10.10.10.112 -j DNAT --to 192.168.1.2:80
[root@ html]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 10.10.10.112 -j DNAT --to 192.168.1.2:8080
NAT网络地址转换相关的处理动作:
IP地址
端口地址
DNAT/SNAT/MASQUERADE/REDIRECT
做完 NAT 转发数据包之后,unNAT 会对回传的对应数据包作反向处理(处理操作与之前NAT作的相反)
2. SNAT/MASQUERADE
源地址转换,一般用于位于内部网络(私有网络)的主机去连接外部网络的主机,常见的是实现共享上网
C1
C2
C3 --> (192.168.0.1)GW(10.10.10.112) --> internet
...
CN
192.168.0.0/24
例:简单的SNAT
iptable -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 1.1.1.1 # --to-source 可以简写为 --to
如果网关的公网地址是动态分配的,就不能使用 --to 了,必须使用地址伪装 MASQUERADE
iptable -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -j SNAT --to 192.168.2.1 能ping通主机但主机ping不回来,原因是:0.254去ping0.3的时候经POSTROUTING把IP转为2.1了,0.3接收到数据包
但不在同一网段,所以无法ping通
]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.10.10.112
]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 10.10.10.112
]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
3. DNAT
DNAT 的一个重要作用是发布位于内网的服务器
C1
C2
C3 <-- GW <-- internet
192.168.0.253 1.1.1.1
例子:简单的DNAT
iptables -t nat -A PREROUTING -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to-destination 192.168.0.253:80 # --to-destination 可以简写位 --to
注意:DNAT在转换目的地址的同时,也可以指定转换到新的地址的指定端口
注意:同时需要开启IP转发。
例:本地主机 C2 通过域名 www.test.com 访问位于内网的C1的www服务
C0
C1(0.88) --> (0.253)GW(1.253 www.test.com) --> internet
C2(0.77)
iptables -t nat -A OUTPUT -s 192.168.0.0/24 -d xxx.xxx.1.253 --dport 80 -j DNAT --to 192.168.0.88:80
在 OUTPUT 上作地址转换
4. REDIRECT
端口重定向,只能重定向为自己的端口
例:在GW处架设 squid 来代理内网主机上网,这里要把内网 Client 发到网关的访问80端口的包,重定向到网关的3128端口,就是由 squid 监听的端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128
]# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
5. LOG表示记录日志
对端口访问记录日志,用于入侵检测和取证
--log-level 日志级别 日志级别可以去查看 syslog.conf ,不需要指定日志的对象,这里是 kernel
--log-prefix " 日志前缀 " 为日志记录添加上前缀,便于查看,注意这个日志前缀两端最好要加上空格,便于与其他日志信息隔开。
--log-tcp-sequence 记录 tcp 序号的选项,还有很多的记录日志的选项,可以去看帮助。
注意:-j LOG 只是用来记录匹配上的包的日志,并不对该包进行处理,所以要在记录日志的包的下面在加上匹配该包的规则。
例:对访问80端口的包记录日志
iptables -t filter -A INPUT -p tcp --syn--dport 80 -j LOG --log-tcp-options --log-ip-options --log-prefix "IPTABLES"
iptables -t filter -A INPUT -p tcp -j DROP # 后面应该紧跟着处理规则,因为上面那条只是用来记录日志的
记录的日志会默认保存在 /var/log/messages 中
nmap -sF 192.168.0.253 扫描开放的端口
日志记录规则下面应该立即加上一条对数据包的ACCEPT或者DROP规则的处理
]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j LOG --log-prefix "22PORT " --log-tcp-options --log-ip-options --log-uid
]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j ACCEPT
----------
iptables -t filter -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID PACK" --log-tcp-options --log-ip-options --log-uid
iptables -t filter -A INPUT -m state --state INVALID -j DROP
!! iptables 中每个 check_point 处理的次序是:mangle nat filter;也可以这样理解,在不同的表中有相同的链时,总是先处理 mangle 表的,之后是 nat 表的,最后才是 filter 表的。
]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j LOG --log-prefix "IPTABLES " --log-tcp-options --log-ip-options --log-uid
]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j DROP
]# grep IPTABLES /var/log/messages
6. mangle
只能在 mangle 表中使用,且标记只能用数字,一般能在 PREROUTING 和 OUTPUT 中使用
先 mangle 再 routing 再 output
-j MARK --set-mark MARK_NUMBER
在匹配时要使用
-m mark --mark MARK_NUMBER
例:在检查点 PREROUTING 为不同网段的包打上标记,然后在检查点 FORWARD 处理打上标记的包
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.1-192.168.0.100 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.200 -j MARK --set-mark 2
iptables -t filter -A FORWARD -m mark --mark 1 -j DROP
iptables -t filter -A FORWARD -m mark --mark 2 -j ACCEPT
使用 sevice iptables save 保存iptables过滤规则
7层过滤 就是在应用层进行过滤
注意:出现错误 Unknown error 4294967295 ,很有可能是因为添加的规则没有加到正确的链上,比如将只能在 OUTPUT 上加的规则加到了 INPUT 上。
对于iptables 的 Bugs,可以去 iptables 的 bug 报告网站去查看。
作业
A -- B
A B 都启动 22 端口
A B 的默认策略都设置为 DROP
A 可以 ssh 到 B,而 B 不可以 ssh 到 A
作业
流量监控,经由网关的的机器的流量
需要在 网关 的 FORWARD 上写
作业
开启 iptables 的情况下配置服务
作业 :
1写一个规则集保护本机,HOST FW
主要针对于INPUT链做检查
对于OUTPUT相对宽松
不对外做服务,只访问外部服务
2 写一个规则 集保护内网,GETWAY FW
内网办公网络 GW 外网
内部服务器(202.1.1.0/24 公网地址)--(202.1.1.11)GW(202.1.2.11)
首先,内网有两个网段A(192。168。1。0)和B(192。168。2。0),A需要能够SNAT上网,B需要SQUID上网(不可上QQ,TAOBAO,KAIXIN网,
不可下载.exe .rm .rmvb .mp3 .mp4)
其次,内网对可以访问内部的服务器群,有HTTP,FTP,CIFS(Samba)。同时外网也可以访问这些服务器
再次,要对洪水攻击进行防范 (tcp syn洪水,ICMP洪水)
137\138\139\445
modprobe connlimit
iptables -t filter -P INPUT DROP
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
iptables -t filter -A INPUT -p tcp --sport 22 -j ACCEPT
iptables -t filter -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
[root@ html]# iptables -t filter -A INPUT -p tcp -m multiport --dports 137,138,139,445 -i eth0 -j ACCEPT
[root@ html]# iptables -t filter -A INPUT -p udp -m multiport --dports 137,138,139,445 -i eth0 -j ACCEPT
内网卡接口
layer7
l7-iptables
squid
arptables
iptables
==================
1 解压成与当前IPTABLES同版本的源码
[root@ src]# tar jxvf iptables-1.4.0.tar.bz2
mv iptables-1.4.0 /usr/src/iptables
[root@ src]# ls iptables -ld
drwxr-xr-x 6 root root 4096 2007-12-22 iptables
[root@ src]# pwd
/usr/src
--------------------
2、生成与当前内核同版本的内核源码
useradd mockbuild
rpm -ivh --nomd5 kernel-2.6.18.src.rpm
[root@ SOURCES]# cd /usr/src/redhat/SPECS/
[root@ SPECS]# ls
kernel-2.6.spec
[root@ SPECS]# rpmbuild -bp --target=$(uname -m) kernel-2.6.spec
生成如下内核源代码:
[root@ html]# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/
[root@ linux-2.6.18.i686]# ln -s /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/ /usr/src/linux
=----------------
3 下载包含那些需要的iptables模块的补丁文件。解压,执行如下命令:
[root@ patch-o-matic-ng-20080214]# ./runme --download
[root@ patch-o-matic-ng-20080214]# ./runme connlimit
[root@ patch-o-matic-ng-20080214]# cd /usr/src/linux
[root@ linux]# make oldconfig
Connections/IP limit match support (IP_NF_MATCH_CONNLIMIT) [N/m/?] (NEW) m
# configuration written to .config
#
[root@ linux]# make modules_prepare
scripts/kconfig/conf -s arch/i386/Kconfig
CHK include/linux/version.h
UPD include/linux/version.h
CHK include/linux/utsrelease.h
UPD include/linux/utsrelease.h
SYMLINK include/asm -> include/asm-i386
CC arch/i386/kernel/asm-offsets.s
GEN include/asm-i386/asm-offsets.h
HOSTCC scripts/genksyms/genksyms.o
SHIPPED scripts/genksyms/lex.c
SHIPPED scripts/genksyms/parse.h
SHIPPED scripts/genksyms/keywords.c
HOSTCC scripts/genksyms/lex.o
SHIPPED scripts/genksyms/parse.c
HOSTCC scripts/genksyms/parse.o
HOSTLD scripts/genksyms/genksyms
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
HOSTCC scripts/kallsyms
HOSTCC scripts/pnmtologo
HOSTCC scripts/conmakehash
[root@ netfilter]# cd /usr/src/linux/net/ipv4/netfilter/
[root@ netfilter]# mv Makefile Makefile.orig
[root@ netfilter]# vim Makefile
[root@ netfilter]# cat Makefile
obj-m := ipt_connlimit.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default: $(MAKE) -C $(KDIR) M=$(PWD) modules
[root@ netfilter]# cd /usr/src/linux
[root@ linux]# make M=net/ipv4/netfilter
屏幕输出如下 :
WARNING: Symbol version dump /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/Module.symvers
is missing; modules will have no dependencies and modversions.
LD net/ipv4/netfilter/built-in.o
CC [M] net/ipv4/netfilter/ipt_connlimit.o
Building modules, stage 2.
MODPOST
CC net/ipv4/netfilter/ipt_connlimit.mod.o
LD [M] net/ipv4/netfilter/ipt_connlimit.ko
[root@ linux]# cp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/
[root@ linux]# insmod /lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko
[root@ linux]# iptables -m connlimit -h
[root@ iptables]# pwd
/usr/src/iptables
[root@ iptables]# make
[root@ iptables]# ls extensions/libipt_time.so
extensions/libipt_time.so
[root@ iptables]# cp extensions/libipt_time.so /lib/iptables/
[root@ linux]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 12:15 --timestop 15:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT
[root@ linux]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
例:iptables -A FORWARD -s 192.168.1.39 -j DROP 阻止来源地址为 192.168.1.39 的数据包通过本机
各服务器的iptables安全设置:
NFS:
portmap 111 nfs 2049 端口号为2049
vim /etc/sysconfig/nfs
MOUNTD_PORT="4002"
STATD_PORT="4003"
LOCKD_TCPPORT="4004"
LOCKD_UDPPORT="4004"
RQUOTAD_PORT="4005"
[root@tea net]# rpcinfo -p
[root@pg ~]# iptables -t filter -A INPUT -p tcp --dport 111 -j ACCEPT
[root@pg ~]# iptables -t filter -A INPUT -p udp --dport 111 -j ACCEPT
[root@pg ~]# iptables -t filter -A INPUT -p tcp --dport 2049 -j ACCEPT
[root@pg ~]# iptables -t filter -A INPUT -p udp --dport 2049 -j ACCEPT
[root@pg ~]# iptables -t filter -A INPUT -p tcp --dport 4002:4005 -j ACCEPT
[root@pg ~]# iptables -t filter -A INPUT -p udp --dport 4002:4005 -j ACCEPT
samba:
nmbd 137/udp 138/udp
smbd 139/tcp 445/tcp
iptables -t filter -A INPUT -p udp --dport 137:139 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 139 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 445 -j ACCEPT
FTP:
modprobe ip_nat_ftp
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
要求:外部网络可以访问内部网络的WEB和DNS
内部网络可以访问外部的DNS,FTP,SSH,SMTP,HTTP/HTTPS,ICMP
内部网络或从本机发起的会话包被IPTABLES进行状态跟踪.
本机接受内部网络和外部网络的ICMP请求.
防火墙配置默认日志记录和丢弃规则,使任何其它数据包以及端口扫描或者没有明确允许的连接被记录并丢弃
防火墙本机只开SSH服务
补充:-j后可跟:1.ACCEPT 2.DROP 3.REJECT 4.LOG 5.子链 (自定义的)
例:iptables -N uplooking 创建一个子链,-N指创建一个新的
iptables -A uplooking -s 192.168.0.0/24 -j DROP 设置这样的一个规则应用它不生效,需要结合下面的规则一起使用
1.iptables -A INPUT -p tcp --dport 23 -j uplooking 整个的意思是创建这个规则使这个网段访问23端口时将被丢弃
删除子链:iptabes -X uplooking 提示无法删除有连接的链
iptables -D INTPUT 1
iptables -F uplooking 删除这里定义的规则
iptables -X uplooking 即可删除了
主机自己访问自己用到nat表OUTPUT
NAT:地址转换
SNAT(改变数据包于源IP)共享上网
开启转换功能:vi /etc/sysctl.conf ip_forward=0改为1 ( 在路由里操作这步)
让文件生效:sysctl -p
POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)
测试:
环境:web服务器 ip 地址 1.2.3.5/24(外网服务器)
路由:可以是个路由器,也可是两个网卡的linux系统192.168.0.254 1.2.3.4/24(公有ip)
客户端:192.168.0.2 指定网关 192.168.0.254
在路由里 添加规则:iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.2.3.4(web服务器地址)
用ADSL拨号就改为伪装MASQUERADE
-->内网访问外网的时候用
客户端去访问web服务器,进入路由通过规则转换ip去web服务器找资源,返回给客户端
返回的时候是自动返回数据包
路由:是源到目的的过程。
私有IP:A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
1.内网访问自己内部的网络只要搭建DNS就可以 网关会自己做判断是往内网和外网发送数据包
如果是 目标地址是外网,通向外网的网关直接指向外网的IP
如果目标地址是内网,内网网关指向内网的IP,
两个网关直接通讯在外网用户访问内网的时候用到
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j SNAT --to 192.168.0.253(内网的网关)
192.168.0.12 |-------------------|
\ | |
\ | 0.253 |
/ | |
/ | |
192.168.0.13 |-------------------
DNAT(改变数据包目的IP)外网通过iptables访问内网
PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)
环境:web服务器 ip 地址 192.168.0.28(内网服务器)指定网关192p.168.0.254
路由:可以是个路由器,也可是两个网卡(即网关)的linux系统192.168.0.254 1.2.3.4/24(公有ip)
客户端:1.2.3.5(公有ip)访问1.2.3.4就可访问 ip地址 为192.168.0.28的web服务器
路由设置:
iptables -t nat -A PRETROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to 192.168.0.28
源地址转换 (主要用于共享上网,POSTROUTING)
-j SNAT --to ip
-j MASQUERADE
目标地址转换(主要用于做内网的服务器的发布,PREROUTING,OUTPUT)
-j DNAT --to ip:port
-j REDIRECT 3128 以透明代理为例子
DNAT
[root@www ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to-destination 192.168.0.188:80
[root@www ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to 192.168.0.188:80
iptables -t nat -A OUTPUT -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to 192.168.0.188:8000
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128
REDIRECT
MASQUERADE
实例1、
配置一个个人防火墙
目的是保护自己 --- filter表中配置---INPUT,OUTPUT
1、不允许其它主机主动访问本机
2、ping允许
3、本机访问其它主机是可行的
iptables -t filter -P INPUT DROP
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID PACK " --log-ip-options --log-tcp-options --log-uid
iptables -t filter -A INPUT -m state --state INVALID -j DROP
iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
iptables -t filter -A INPUT -j LOG --log-prefix "KEYI PACK " --log-level info --log-ip-options --log-tcp-options --log-uid
实例2、
配置一个服务器防火墙
服务器对外提供80端口的服务,并且允许远程维护 ---filter表
iptables -t filter -P INPUT DROP
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p udp --sport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --sport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 2021 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW.ESTABLISHED,RELATED -m multiport --dport 53,80,25,110,143,995,993,69,139,445 -j ACCEPT
iptables -A INPUT -p udp -m state --state NEW.ESTABLISHED,RELATED -m multiport --dport 53,80,25,110,143,995,993,69,139,445 -j ACCEPT
1、要配置不允许root登录2021
2、可能受到攻击
由于站点源代漏洞导致的攻击--SQL注入攻击等等
由于系统软件漏洞导致的攻击
由于tcp的可靠性引起的安全问题---SYN半连接洪水攻击
iptables -t filter -A INPUT -p tcp --syn --dport 80 -m limit --limit 20/sec -j ACCEPT
iptables -t filter -A INPUT -p tcp --syn --dport 80 -j DROP
由于服务器一般是允许其它主机PING---引起ICMP洪水攻击
iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
实例3、
配置一个网关防火墙
1、内网用户通过透明代理上网
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128
iptables -t nat -A POSTROUTING -p udp --dport 53 -j SNAT --to 外_ip
内网用户需要配置好IP,DNS,网关指向 内_ip
2、内网用户可以访问内网的FTP(通过IP访问),WEB(通过域名访问)
3、外网可以访问内网的WEB(通过域名),并且可以VPN连接到网关上
4、关于内网用户的下载问题
结合有限速功能路由
iptables -t filter -I FORWARD -p tcp --syn -s 内网_net --dport 80 -m connlimit --connlimit-above 5 -j REJECT
iptables -t filter -I FORWARD -p tcp --syn -s 内网_net --dport 21 -m connlimit --connlimit-above 5 -j REJECT
iptables -t filter -A FORWARD -s 内网_net -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
实例4、关于内网WEB服务通过DNAT发布,内网通过域名访问WEB的问题
192.168.0.0/24 内网 1.1.1.0/24外网
192.168.0.11 client eth0 Gataway eth1
0.188:80 server 0.253-----1.1.1.1 ----- 1.1.1.2
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to 1.1.1.1
iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to 192.168.0.188:80
------------
iptables -t nat -A OUTPUT -d 1.1.1.1 --dport 80 -p tcp -j DNAT --to 192.168.0.188:80
------------
G: iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -d 192.168.0.188 --dport 80 -o eth0 -j SNAT --to 192.168.0.253
iptables 体系结构
DNAT SNAT
目标地址转换 源地址转换
------- ------ -- ----- -------
| / \ / 路由判断 \ / \ / \ |
->|M PREPOUTING N ---> M ROUTING TABLE N ---> M FORWARD F---> M POSTROUTING N———|--->
| \ / \ / \ / \ / |
------- -------- ----- ------- |
| /\ |
| |
\/ -------------/
---- ---- /
/ \ / OUTPUT \ DNAT
M INPUT F OUTPUT M->N->F也可以作目标地址转换
\ / \ /
---- ----
| /\
| |
\/ |
--------
/ \
Local process
\ /
--------
一般LINUX防火墙(iptalbes)的运用无非是用nat 表(PREROUTING、OUTPUT、POSTROUTING)和filter表(FORWARD、INPUT、OUTPUT)。我们只有知道了数据的流向才能正确的配置
防火墙。现用一个相对比较直观的图形解释数据的走向。(此处只作最基本的iptables数据流走向说明。)
上图是你的家,蓝色的圈是你家院子,有两扇大门①⑥进出,你家有两个房间,分别为eth0和 eth1房间,每个房间有两个门可以进出②③④⑤。旁边是张三和李四的家,
张三家和李四家之间的往返必须要过你家院子。
现假设,eth0网卡IP为:192.168.5.1链接内网,eth1网卡IP为:218.100.100.111链接互连网。
再假设,“张三家”为一个局域网,“李四家”为互连网。进我家院子用PREROUTING,出我家院子用FORWARD,进我家门用INPUT,出我家门用 OUTPUT。
(当我们的操作是征对服务器本身而言的话,如SSH操作,此时肯定会用到PREROUTING、INPUT和OUTPUT,当数据只是通过服务器去访问别的机器时会用到PREROUTING和FORWARD。)
又假设,默认这六个门都是关的。生成如下代码。
*nat
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L –v
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L –v
COMMIT
1、 局域网用户通过服务器共享上网
(即从张三家到李四家)
1)首先进①号门,再从⑥号门走出。
-A PREROUTING –p tcp --dport 80 –j ACCEPT #允许TCP 80端口通过服务器
-A FORWARD –p tcp --dport 80 –j ACCEPT #允许TCP80 端口转发
-A FORWARD –p tcp --sport 80 –j ACCEPT #允许接收对方为TCP80端口反回的信息
2)其次,由于我们上网打的是域名,为此有一个公网DNS服务器为我们服务,那当然也要允许内网机器与DNS服务器的数据转发。DNS用UDP 53或者 TCP 53端口。
两者用其一个就行。
-A PREROUTING –p udp --dport 53 –j ACCEPT
-A FORWARD –p udp --dport 53 –j ACCEPT
-A FORWARD –p udp --sport 53 –j ACCEPT
3)再次,由于局域网的地址在公网上是不被允许的,所以在出公网前应该把其地址转为服务器地址进行伪装。
-A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111
2、 允许局域网和公网可以访问服务器的SSH
假设SSH采用默认端口TCP 22 。此要求相当于要进我的家的TCP 22号门,为此我们首先要进我家院子,然后再进我家门,最后走出我家门这样的过程。此操作是征对服务器本身的操作。
-A PREROUTING –p tcp --dport 22 –j ACCEPT
-A INPUT –p tcp --dport 22 –j ACCEPT
-A OUTPUT –p tcp --sport 22 –j ACCEPT
3、 允许内网机器可以登录MSN和QQ。
(MSN 和QQ默认是不允许登录的)QQ一般来说可以从TCP 80、8000、443及UDP 8000、4000登录,而MSN可以从TCP 1863、443登录。我们登录MSN和QQ的过程就象上网一样,
也是去访问远程服务器的指定端口,故而我们只用数据转发即可。
-A PREROUTING –p tcp --dport 1863 –j ACCEPT
-A PREROUTING –p tcp --dport 443 –j ACCEPT
-A PREROUTING –p tcp --dport 8000 –j ACCEPT
-A PREROUTING –p udp --dport 8000 –j ACCEPT
-A PREROUTING –p udp --dport 4000 –j ACCEPT
-A FORWARD –p tcp --dport 1863 –j ACCEPT
-A FORWARD –p tcp --sport 1863 –j ACCEPT
-A FORWARD –p tcp --dport 443 –j ACCEPT
-A FORWARD –p tcp --sport 443 –j ACCEPT
-A FORWARD –p tcp --dport 8000 –j ACCEPT
-A FORWARD –p tcp --sport 8000 –j ACCEPT
-A FORWARD –p udp --dport 8000 –j ACCEPT
-A FORWARD –p udp --sport 8000 –j ACCEPT
-A FORWARD –p udp --dport 4000 –j ACCEPT
-A FORWARD –p udp --sport 4000 –j ACCEPT
4、 让内网机器可以收发邮件。
接收邮件是访问远程服务器的TCP 110端口,发送邮件是访问TCP25端口。用数据转发即可。
-A PREROUTING –p tcp --dport 110 –j ACCEPT
-A PREROUTING –p tcp --dport 25 –j ACCEPT
-A FORWARD –p tcp --dport 110 –j ACCEPT
-A FORWARD –p tcp --sport 110 –j ACCEPT
-A FORWARD –p tcp --dport 25 –j ACCEPT
-A FORWARD –p tcp --sport 25 –j ACCEPT
5、 内部机器对外发布WEB。
要把内网机器192.168.5.179的WEB对外发布的话,相当于是从外网访问内网。与第1步操作的局域网共享上网相同,只是访问的方向改变了。不是从内网访问外网,
而是从外网访问内网。
当公网访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。当内网机器访问服务器218.100.100.111时,防火墙把它映射到内网的
192.168.5.179的TCP80上。
-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80
-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 –dport 80 –j DNAT –to-destination 192.168.5.179:80
以上两句必须写在 –A PREROUTING –p tcp --dport 80 –j ACCEPT 前面。)
TCP 80端口的转发在第1步就已做过,此处就不用重复制作了。另外在
-A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 之后加上一句:
-A POSTROUTING –p tcp --dport 80 –j ACCEPT
为什么要加这句话呢,我的理解是这样的,
公网访问 http://218.100.100.111时:(假设公网上用户的IP为199.199.199.199,端口12345为随机的产生的。)
数据源 : ip:199.199.199.199 sport:12345
数据目标: ip:218.100.100.111 dport 80
此时,通过-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 告诉199.199.199.199,您要访问的真正
地址应该是192.168.5.179:80,
然后我们通过-A POSTROUTING –p tcp --dport 80 –j ACCEPT 目标地址218.100.100.111:80伪装成 192.168.5.179:80 。
数据源 : ip:199.199.199.199 sport:12345
数据目标: ip:192.168.5.179 dport 80
当192.168.5.179返回数据时:
数据源 : ip:192.168.5.179 sport:80
数据目标: ip:199.199.199.199 dport 12345
数据经过 -A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 后,
数据源 : ip:218.100.100.111 sport:80
数据目标: ip:199.199.199.199 dport 12345
6、 完整的iptables配置
*nat
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
-F
-Z
-X
-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80
-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 --dport 80 –j DNAT –to-destination 192.168.5.179:80
-A PREROUTING –p tcp --dport 80 –j ACCEPT
-A PREROUTING –p udp --dport 53 –j ACCEPT
-A PREROUTING –p tcp --dport 22 –j ACCEPT
-A PREROUTING –p tcp --dport 1863 –j ACCEPT
-A PREROUTING –p tcp --dport 443 –j ACCEPT
-A PREROUTING –p tcp --dport 8000 –j ACCEPT
-A PREROUTING –p udp --dport 8000 –j ACCEPT
-A PREROUTING –p udp --dport 4000 –j ACCEPT
-A PREROUTING –p tcp --dport 110 –j ACCEPT
-A PREROUTING –p tcp --dport 25 –j ACCEPT
-A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111
-A POSTROUTING –p tcp --dport 80 –j ACCEPT
-L –v
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-F
-Z
-X
-A INPUT –p tcp --dport 22 –j ACCEPT
-A OUTPUT –p tcp --sport 22 –j ACCEPT
-A FORWARD –p tcp --dport 80 –j ACCEPT
-A FORWARD –p tcp --sport 80 –j ACCEPT
-A FORWARD –p udp --dport 53 –j
描述:M为mangle表 N为nat表 F为filter表 --dport 基本上访问的是自己的端口
PREPOUTING:位于 nat 表,用于修改目的地址(DNAT) ROUTING TABLE:路由表 FORWARD:filter表中的转发链 POSTROUTING:位于 nat 表,
用于修改源地址 (SNAT)
INPUT:filter表中的输入链 OUTOUT:filter表中的输出链 Local process:本地进程
Mangle表中包含其他两个表的链,有5个
1.进入的访问先检查M里的PREPOUTING再检查N里的,没有匹配的规则就进入routing table,若没有匹配的IP就转发个M里的POSTROUTING再检查N里的,
直接转发出去
2.进入的访问先检查M里的PREPOUTING再检查N里的,没有匹配的规则就进入routing table,有匹配的IP,检查M里的INPUT链再检查F里的,查看规则
3.OUT从M->N->F那里出发
练习题:
保护自己个人----filter表中配置 ---INPUT,OUTPUT
1.不允许其他主机主动访问本机
2.ping不允许
3.本机访问其他主机是可行的
yum install iptraf 网络流量的查看工具
ping -i 0.000001 192.168.0.253 icmp洪水攻击
防止icmp洪水攻击
iptables -A INPUT -p icmp -m --icmp-type echo-requset -m limit --limit 1/second -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type echo-requset -j ACCEPT
半连接池占满
解决系统资源
1.连接池放大
2.缩小超时时间
3.限制SYN标记的包
iptables -A INPUT -p tcp --syn --dport 80 -m limit --limit 20/sec -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 80 -j DROP
由于系统软件漏洞导致的攻击
由于站点源代码漏洞导致的攻击---SQL注入攻击
3次握手完成时间一般为1妙 主要看宽带大小1秒=1000毫秒
配置一个网关防火墙
1.内网用户通过透明代理上网
2.内网 用户可以问内网的FTP(通过IP访问),WEB(通过域名访问
3.外网可以访问内网的WEB
设置缺省策略为INPUT 拒绝全部,但:
允许你对你自己的ip地址(192和127)进行任何访问.
只允许某1 人telnet 你,即某台主机
允许某人每分钟ping你10次.
允许您主动访问任何人.
test1 用户可以使用的自己的ip地址作测试用途,但不能访问其他的任何ip
其它用户可以访问任意地址
对于我的电脑,不论怎样改变ip地址,都不能使用你的pop3服务器.但可以使用其他服务.
对所有访问您23端口的动作进行日志
习题答案:
#!/bin/bash
for i in filter nat mangle
do
iptables -t $i -F
iptables -t $i -X
iptables -t $i -Z for循环清除所有表的规则
done
#iptables -F 清除所有规则 这三个这对filter表进行操作
#iptables -X 清除自定义链
#iptables -Z 清零
iptables -P INPUT DROP 缺省的都是最后执行的
iptables -A INPUT -s 192.168.0.28 -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s 192.168.0.128 -p tcp --dport 23 -j ACCEPT
iptables -A INPUT -s 192.168.0.128 -p icmp -m limit --limit 10/m -j ACCEPT
iptables -A INPUT -m state --state ESTBALISHED,RELATED -j ACCEPT 我发出的包是NEW包,回应后要给的是建立包状态所以只要写这条即可。
iptables -A OUTPUT -m owner --uid-owner`id -u test1` -j DROP
iptables -A INPUT -p tcp --dport ! 110 -m mac --mac-source 12:34:56:78:90:AF -j ACCEPT
iptables -A INPUT -p tcp --dport 23 -j LOG
写完后用service iptables save 保存
把iptables服务在第五级别开启,系统启动后就会开启/etc/sysconfig/iptables文件里的规则
一些列子:
iptables -t fiter -A INPUT -s 192.168.1.3 -p icmp --imcp-type echo-reply -j ACCEPT
iptables -t fiter -A INPUT -s 192.168.1.3 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -t filter -A INPUT -s 192.168.1.3 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -t filter -A INPUT -s 192.168.1.19 -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p icmp -j ACCEPT
tcp_wrapper:简单的安全
配置文件:
/etc/hosts.allow
/etc/hosts.deny
支持tcpwrapper的服务:vsftp sendmail portmap ssh xinetd
查看命令是否支持tcpwrapper:
ldd /usr/sbin/vsftpd |grep libwrap <-----含有libwrap.so.o库则表示支持tcpwrapper
配置文件的格式:
服务名称:IP或主机名或域名 [EXCEPT] <------多个服务用逗号分隔
vsftpd:10.1.1.0/255.255.255.0 <----10.1.1.0/24网段
vsftpd:10.1.1 <----10.1.1.0/24网段
vsftpd:station160.cluster.com <-----主机名
vsftpd:.cluster.com <-----该域下的所有主机
vsftpd:ALL <-----全部
telnetd:10.1.1.:spawn echo `date %c %d >> /var/log/telnetd.log <-----只要10网段的访问我,则该记录日志。
服务名称可以在服务的配置文件中获取,如telnet可查看/etc/xinet.d/krb5-telnet (%c:显示IP地址。%d:显示服务的名字。spawn后跟要执行的命令)
系统判断的优先级:
-->hosts.allow -->hosts.deny--->
先判断hosts.allow,如果有匹配则可以通过访问,如果没有匹配则检查hosts.deny,有匹配则拒绝,如果还是没有匹配,则通过访问。这两个文件要同时使用。
sync ??
RELATED关联状态
FTPDATA 传输
icmp的不可达消息
PING不给回应网络不可达 iptanles
没有开启的UDP端口
NEW状态新的包第一次发的包
ESTABLISHED 连接态 回应的包
RELATED (FTP)衍生态关联状态
INVALID 无效
iptables -A INPUT -p-m state --state RELATED,ESTABLISHED -j ACCEPT //PING不给回应网络不可达
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
iptables -A FORWARD -d 192.168.0.254 -m limit --limit 10/s -j ACCEPT 设置每秒最多转发10个包
iptables -A FORWARD -d 192.168.0.254 -j DROP 上边命令后一定要跟这一句,也就是说,上边超过10个包以后抛弃由这个命令来执行
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
//--syn 第一次建立连接
iptables -A INPUT -p tcp -m multiport --dports 22,25,80,110,143 -j ACCEPT
服务端:
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT--reject-with tcp-reset
nc -l 9999
客户端
telnet serverIP 9999
test 《---手工输入
FIN 4次挥手完成的包
[]#nmap -s(扫描)P(ping)
[]# nmap -sF(FTP) 192.168.0.253扫描打开的端口
iptables -t filter -A INPUT -m state --state INVALID - j DROP
nopub 不依靠控制台
nopub ./var/ftp/iptables.sh &
inmod 加载模块
dmeg