1. 关于iptables。

Iptables是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。当一条网络连接试图在你的系统中建立时,iptables会查找其对应的匹配规则。如果找不到,iptables将对其采取默认操作。

iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

如图可以知道:

1)这4个表的优先级别:raw > mangle > nat > filter 
2)每个表中包含的链 

  • raw表有2个链:prerouting、output
  • mangle表有5个链:prerouting、postrouting、input、output、forward
  • nat表有3个链:prerouting、postrouting、output
  • filter表中有3个链:input、output、forward

最常用的链:input(进入)、output(出去)、forward(转发),而prerouting与postrouting用于网络地址转换(NAT) 

2. filter表规则链的类型。

输入(INPUT),转发(FORWARD),输出(OUTPUT)

INPUT:这条链用来过滤目的地址是本机的连接。例如,如果一个用户试图使用SSH登陆到你的PC/服务器,iptables会首先匹配其IP地址和端口到iptables的输入链规则。

FORWARD:这条链用来过滤目的地址和源地址都不是本机的连接。例如,路由器收到的绝大数数据均需要转发给其它主机。如果你的系统没有开启类似于路由器的功能,如NATing,你就不需要使用这条链。

检测系统是否需要转发链:

上图是对一台已经运行了几个星期的服务器的截图。这台服务器没有对输入和输出做任何限制。从中可以看到,输入链和输出链已经分别处理了11GB和17GB的数据,而转发链则没有处理任何数据。这是因为此服务器没有开启类似于路由器的转发功能。

OUTPUT:这条链用来过滤源地址是本机的连接。例如,当你尝试ping howtogeek.com时,iptables会检查输出链中与ping和howtogeek.com相关的规则,然后决定允许还是拒绝你的连接请求。

注意:当ping一台外部主机时,看上去好像只是输出链在起作用。但是请记住,外部主机返回的数据要经过输入链的过滤。当配置iptables规则时,请牢记许多协议都需要双向通信,所以你需要同时配置输入链和输出链。人们在配置SSH的时候通常会忘记在输入链和输出链都配置它

3. 链的默认行为。

如果匹配不到规则,iptables该怎么做。

设置默认行为:

[root@tp ~]# iptables -p INPUT DROP
[root@tp ~]# iptables -p OUTPUT ACCEPT
[root@tp ~]# iptables -p FORWARD DROP

查看iptables各种类型链的默认行为:

添加规则:

有上图可以看出,INPUT类型的默认是DROP,所以我们要编写ACCEPT(通过)的链

#开放22端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#对指定的IP开放22端口
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT

#只允许特定的IP可以ping
[root@tp ~]# iptables -A INPUT -p icmp -s 192.168.66.123 -j ACCEPT

4. iptables中的一些规则:

iptables -F  # 清除所有的chain中的所有rule,但保留chain
iptables -F -t nat  #清除nat table中chain的所有rule


iptables -P INPUT DROP  #给INPUT链添加默认行为


iptables -A INPUT rule  #给INPUT链添加rule,在结尾追加


iptables -I INPUT rulenum rule  #在rule编号为rulenum的后面插入该规则


iptables -D INPUT rulenum   #删除某条规则

动态规则:

1、有四种动态参数:
NEW:当你在使用UDP、TCP、ICMP等协议时,发出的第一个包的状态就是“NEW”

ESTABLISHED:当你在使用TCP、UDP、ICMP等协议时:假设你的主机发出的第一个包成功穿越防火墙,那么接下来你的主机 发出和接收 到的包的状态都是“ESTABLISHED”。

RELATED:当连接建立后,又有相关的连接建立(典型的是ftp的passive模式,由client发起到server的数据连接,这个端口是由server指定的,但由client发起)

INVALID:状态为INVALID的包就是状态不明的包,也就是不属于前面3中状态的包,这类包一般会被视为恶意包而被丢弃。 

用法:

iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

上面两条命令,拒绝所有NEW的外来包(外来主机请求建立连接的包)。但允许自己发出的连接收到外来的数据(ESTABLISHED)

再加上:

iptables -A INPUT -p tcp -dport 21 -j ACCEPT
iptables -A INPUT -p udp -dport 21 -j ACCEPT

则表示可以允许外界访问21端口(FTP,并假设采用passive模式),结合上面的状态,则允许外界主动发起到自己的ftp数据连接———可能是任意端口。

所以,一般,先写上动态规则,然后再写静态规则,就可以做到处理一些像FTP Passive模式这种不知道用户会访问哪个端口的情况。

drop非法连接:

[root@tp ~]# iptables -A INPUT     -m state --state INVALID -j DROP
[root@tp ~]# iptables -A OUTPUT    -m state --state INVALID -j DROP
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP

允许所有已经建立的和相关的连接

[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

用子网掩码禁止IP段:

/sbin/iptables -A INPUT -i eth1 -p tcp -s 219.142.118.0/24 --dport 80 -j ACCEPT

# 或者

/sbin/iptables -A INPUT -i eth1 -p tcp -s 219.142.118.0/255.255.255.0 --dport 80 -j ACCEPT

 

一个防火墙实例:

#!/bin/sh
echo "starting forward..."
if [ -e /proc/sys/net/ipv4/tcp_ecn ]
then
echo 0 > /proc/sys/net/ipv4/tcp_ecn
fi
echo 1  > /proc/sys/net/ipv4/tcp_syncookies
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j ACCEPT
/sbin/iptables -A INPUT -i eth2 -j ACCEPT
/sbin/iptables -A INPUT -s 118.194.48.38 -j ACCEPT

/sbin/iptables -A INPUT -s 192.168.66.168 -p tcp --dport 22 -j ACCEPT

/sbin/iptables -A INPUT -s 172.28.4.88 -p tcp --dport 10050 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 81 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 3690 -j ACCEPT

/sbin/iptables -A INPUT -s 172.28.6.68 -m state --state NEW -p tcp --dport 4000 -j ACCEPT


/sbin/iptables -A INPUT -s 172.28.6.68 -m state --state NEW -p tcp --dport 3306 -j ACCEPT


/sbin/iptables -A INPUT -s 172.28.6.68 -m state --state NEW -p tcp --dport 6379 -j ACCEPT




#ping
/sbin/iptables -A INPUT -p icmp -s 192.168.66.0/23 -j ACCEPT


/sbin/iptables -P INPUT DROP

 

防火墙的操作:

service iptables start / stop /status

iptables-save > /etc/rc.d/forward  将防火墙导出保存为文件

#添加开机启动
vim /etc/rc.local

#加下面这行

sh /etc/rc.d/forward

 

参考:

http://blog.chinaunix.net/uid-20485483-id-82944.html

http://www.poluoluo.com/server/201403/265782.html