标签归档:iptables

Iptables 实例收藏

#!/bin/sh
#
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
###########################INPUT链###################################
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
#允许内网samba,smtp,pop3,连接

iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
#允许dns连接

iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
#允许外网vpn连接

iptables -A INPUT -s 192.186.0.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃

iptables -A INPUT -s 192.186.0.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃

iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: "
iptables -A INPUT -p icmp -j DROP
#禁止icmp通信-ping 不通

iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
#内网转发

iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
#防止SYN攻击 轻量

#######################FORWARD链###########################
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 192.168.0.0/24 -m multiport --dports 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.0.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT
#允许 vpn客户走vpn网络连接外网

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP
#星期一到星期六的8:00-12:30禁止qq通信

iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP
#星期一到星期六的8:00-12:30禁止qq通信

iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP
#星期一到星期六的13:30-20:30禁止QQ通信

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP
#星期一到星期六的8:00-12:30禁止qq网页

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "qq.com" -m time --timestart 13:00 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP
#星期一到星期六的13:30-20:30禁止QQ网页

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "ay2000.net" -j DROP
iptables -I FORWARD -d 192.168.0.0/24 -m string --string "宽频影院" -j DROP
iptables -I FORWARD -s 192.168.0.0/24 -m string --string "色情" -j DROP
iptables -I FORWARD -p tcp --sport 80 -m string --string "广告" -j DROP
#禁止ay2000.net,宽频影院,色情,广告网页连接 !但中文 不是很理想

iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP
#禁止BT连接

iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24

#######################################################################
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
#打开转发
#######################################################################
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
#打开 syncookie (轻量级预防 DOS 攻击)
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null
#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)
sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)
#######################################################################
iptables -I INPUT -s 192.168.0.50 -j ACCEPT
iptables -I FORWARD -s 192.168.0.50 -j ACCEPT
#192.168.0.50是我的机子,全部放行!
############################完#########################################

Iptables – 记录日志

Iptables工作在内核。

Iptable可以使用LOG来记录日志,但是还需要syslog服务能处理它。

系统日志配置

CentOS5 — syslog, /etc/syslog.conf
CentOS6 — rsyslog,/etc/rsyslog.conf

1. 在rsyslog.conf 添加配置
/etc/rsyslog.conf中添加不同的日志级别(默认warn(=4))

kern.warning     /var/log/iptables.log
kern.debug       /var/log/iptables.log
kern.info        /var/log/iptables.log

kern.*           /var/log/iptables.log

重启服务:/etc/init.d/rsyslogd restart

2. 日志滚动(可选)

vim /etc/logrotate.d/syslog
#添加
/var/log/iptables

3. 在Iptables添加日志选项

iptables -A INPUT  -j LOG --log-prefix "iptables"

保存配置

iptables-save
iptables-restart

Iptables – NAT实验

Host3中添加默认路由:

# 如果配置IP时已经配置了网关,这个步骤忽略
route add defalut gw 172.16.109.129

在Host3中ping Router1的172.16.195.131是不通,那是因为响应数据没有返回路由。

Router1中添加默认网关(响应数据)

route add default gw 172.16.195.132

在Host3中ping Router1的172.16.195.131是可以正常通信。

在Router2中添加:(把来源是172.16.109.0/24的数据包来源改为172.16.195.132)

iptables -t nat -A POSTROUTING -o eht0 -s 172.16.109.0/24 -j SNAT --to 172.16.195.132

如果在Router1中拦截目标为172.16.195.132的数据包,那么Host3中ping Router1的172.16.195.131将无法得到响应。因为这个时候发送的响应包目标就是172.16.195.132。

iptables -A OUTPUT -d 172.16.195.132 -j REJECT

在Host3中ping 172.16.195.131,数据无法响应,说明响应地址为172.16.195.132,数据被拦截(也说明了源地址被修改)。

由于被修改了源地址,那么响应数据包目标都是172.16.195.132,对于172.16.195.131来说,是内网通信,不需要在Router1上设置网关(原来需要设置网关把数据送回来)。

iptables -D OUTPUT -d 172.16.195.132 -j REJECT
route del default

Host3上ping 172.16.195.131,数据正常响应。说明响应数据目标是172.16.195.132。

由于修改了源地址,响应时到达Router2,这时Router2必须把目标地址对应回去,Ping得到响应就已经说明自动进行了DNAT。

在实际的环境中,Router2可能有多个出口网卡(多WAN),或一个WAN上分配了多个IP(虚拟WAN),这个时候出去的IP就有多个,这时需要做修改:

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.109.0/24 -j SNAT --to-source 172.16.195.132-172.16.195.142

WAN上的IP可能不是静态分配的,比如是通过拨号产生的,所以分配的IP地址会发送变化,所以以上的做法无法满足这个情况,需要使用MASQUERADE:

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.109.0/24 -j MASQUERADE

这里的MASQUERADE是指伪装,具体来说就是把源IP改为eth0网卡一样的地址(出口接口),这样就实现了动态绑定。

DNAT

DNAT是修改目标地址,修改地址时还可以修改端口号。所以一般的应用场景是内网IP或端口映射到外网IP或端口。
在Router1上添加映射关系:

iptables -t nat -A PREROUTING -d 172.16.108.129 -p tcp -m tcp --dport 80 -j DNAT --to-destination 162.16.195.130:80 

当访问172.16.108.129的80端口时,修改目标为162.16.195.130的80端口,这样数据就进入到162.16.195.130这个机器。

如果不指定端口号,那么就是针对地址,目标地址可以指定一个段:

iptables -t nat -A PREROUTING -d 172.16.108.129 -j DNAT --to-destination 162.16.195.130-162.16.195.140 

访问到达172.16.108.129的数据包,表修改为162.16.195.130-162.16.195.140段中的其中一个IP,这个场景用法,加上转发时使用规则(主要设置权重),那就可以做一个简单的负载均衡集群。

REDIRECT
REDIRECT也是NAT的内容,不过REDIRECT修改的是目标端口号(也涉及到修改数据包地址),由于只是修改目标端口号,所以它是本机端口转发。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j redirect --to-ports 8080

主要注意的是这里的端口转发,端口自然是要开放的,否则数据无法进来,端口转发不过是把某个端口的数据改为另一个端口而已。

SNAT是数据出去时修改源地址,所以应该是NAT表的POSTROUTING链中进行。DNAT和REDIRECT都是在进入进入时对目标地址或端口进行修改,所以需要在NAT表的PREROUTING链中进行。

Iptables工作原理与实践

Iptables默认有5条链,这些链按照表(table)来进行组织:

表:
	raw			数据跟踪
	mangle		数据表修改
	nat			网络地址转换
	filter		包过滤(用最多)
链:
	prerouting
	input
	forward
	output
	postrouting

表链对应关系:
	raw
		prerouting
		output
		postrouting
	mangle
		prerouting
		input
		forward
		output
		postrouting
        nat
		prerouting
		output
		postrouting
	filter
		input
		forward
                output

链表对应(看上图)

数据包经过的链是在内核空间中进行的。数据包只会经过链,表是提供功能的分类,举例说就是如果要操作地址端口映射,需要操作nat表,nat表只能往prerouting,output,postrouting这三个链上添加规则,如果要操作包过滤,需要操作filter表,filter表只能往input,forward,output的链上添加规则。

比如这里都往output链上添加了规则,就需要区分优先级,规则总是根据表定位链然后往链上附加规则的,所以规则是属于什么链和什么表是已知的。按照表优先级:raw – manage – nat – filter,所以通过nat表添加到output链上的规则,优于通过filter表添加到output链上的规则。

另外,表是根据功能划分的,比如需要操作地址转换,必须通过nat表操作,通过其它表是无法操作(表现为某些命令选项不能用,或者说是某些命令选项是针对特定表的)

数据包进入时会到达内核空间,首先执行prerouting链上的规则,然后判断数据包的目标是否是本机,如果是就进入input链,否则就进入forward链。

# CentOS 7 中关闭默认的firewall防火墙,和iptables冲突
systemctl stop firewalld.service
systemctl disable firewalld.service

# CentOS 7 安装iptables服务
yum install iptables
yum install iptables-services

# CentOS 7 中启动服务 
systemctl start iptables.service
systemctl enable iptables.service

# CentOS 7 以下版本
service iptables restart
chkconfig iptables on

Iptables启动总时会读取/etc/sysconfig/iptables文件,需要注意表的默认策略,可以使用iptables -F刷新所有规则,然后使用iptales-save保存(会在/etc/sysconfig下面产生iptables.old, iptables文件)

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

这是默认配置,INPUT和FORWARD和OUTPUT默认都是ACCEPT,如果修改过就需要注意。后面的中括号表示经过这个链的数据包和字节数。默认的规则是运行已经建立了链接的数据进来,允许icmp协议,允许lo接口数据进来,运行链接22端口,其它的全部禁止。建议先把规则去掉。

命令使用格式:

#格式
iptables -t table command chain parameter target

###########
table
	raw
	mangle
	nat
	filter
command
	-A 在指定链尾巴添加规则(append)
	-D 删除匹配的规则
	-I 在指定位置插入规则(iptables -t filter -I INPUT 1 --dport 80 -j ACCEPT)
	-R 替换匹配的规则
	-L 显示列表规则(--list)
	-n 地址和端口号以数字方式显示
	-F 刷新规则(--flush)
	-Z 将指定链或所有链的计数器清零
	-N 创建自定义链(iptables -N allowed)
	-X 删除自定义链
	-E 更改自定义链的名称(iptables -E allowed disallowed,从什么改为什么)
	-P 修改默认策略(对自定义链不起作用 iptales -P OUTPUT DROP)
chain
	INPUT
	FORWARD
	OUTPUT
	PREROUTING
	POSTROUTING
parameter
	-p	
		TCP
		UDP
		ICMP
		/etc/protocols中定义的列表
		all
	-s
		网络名称
		主机名称
		子网(192.168.0.0/24, 192.168.0.0/255.255.255.0)
		IP地址
	-d
		网络名称
		主机名称
		子网(192.168.0.0/24, 192.168.0.0/255.255.255.0)
		IP地址	
	-i	--匹配入口网卡(只能在PREROUTING INPUT FORWARD)
		接口名称(etho)
		以+结尾的接口名称
	-o	--匹配出口网卡(FORWARD POSTROUTING OUTPUT)
		接口名称(etho)
		以+结尾的接口名称
	--sport
		服务名称
		端口号
		端口范围(1024:65535)
	--dport
		服务名称
		端口号
		端口范围(1024:65535)
	--icmp-type
		ICMP类型(用iptables -p icmp -h可查看)
	--tcp-flags mask xxx
		匹配TCP标记,mask表示检查范围,xxx表示匹配mask中的哪些标记
		(iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT)
target
	-j ACCEPT
	-j DROP
	-j REJECT
	-j REDIRECT 目标端口转换(iptables -t nat -D PREROUTING -p tcp -dport 8080 -i eth2.2 -j REDIRECT -to 80)
	-j MASQUERADE
	-j LOG 
	-j DNAT 目标地址转换 (iptables -t nat -A PREROUTING -d 202.202.202.202 -j DNAT -to-destination 192.168.1.100)
	-j SNAT 源地址转换(iptables -t nat -A POSTROUTING -d 192.168.1.100 -j SNAT -to 192.168.1.1)
	-j MIRROR 
	-j QUEUE 
	-j RETURN 
	-j MARK 将数据包打上标记(iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60)

定义表的链的默认策略
默认策略针对链,也针对表。同样根据优先级来执行。默认测试只有ACCEPT和DROP,可以理解为链中的规则不符合时,执行什么策略(接受或丢弃)。 对应一个链对应对个表的情况,如果默认策略不同,可能遇到问题。默认情况设置的是ACCEPT,而且一般只需要针对filter表中的链进行操作。

iptables -t filter -P INPUT 

使用实例:

#1 显示filter表链与链规则(默认不指定表就是filter表)
iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

# 2 查看NAT表
iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination