iptables防火墙配置详解

iptables简介

filter,nat和mangle三张表。

(1)filter表负责过滤数据包,包括的规则链有,input,output和forward;

(2)nat表则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;

(3)mangle表则主要应用在修改数据包内容上,用来做流量整形的,默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;

input匹配目的IP是本机的数据包,

forward匹配流经本机的数据包,

prerouting用来修改目的地址用来做DNAT,

postrouting用来修改源地址用来做SNAT。

iptables主要参数

-A 向规则链中添加一条规则,默认被添加到末尾

默认是filter

-D从规则链中删除规则,可以指定序号或者匹配的规则来删除

-R进行规则替换

默认被插入到首部

-F清空所选的链,重启后恢复

-N新建用户自定义的规则链

-X删除用户自定义的规则链

-p用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,

-s指定源地址

-d指定目的地址

-i进入接口

-o流出接口

-j采取的动作,accept,drop,snat,dnat,masquerade

--sport源端口

--dport目的端口,端口必须和协议一起来配合使用

有链名必须大写,表名必须小写,动作必须大写,匹配必须小写。

iptable配置实例

iptable基本操作

iptables -L 列出iptables规则

iptables -F 清除iptables内置规则

iptables -X 清除iptables自定义规则

设定默认规则

在iptables规则中没有匹配到规则则使用默认规则进行处理

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP

配置SSH规则

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT 

如果你把OUTPUT 设置成DROP,就需要加上这个规则,否则SSH还是不能登录,因为SSH服务职能进不能出。

只允许192.168.0.3的机器进行SSH连接

iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT

可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.

允许loopback回环通信


IPTABLES -A INPUT -i lo -p all -j ACCEPT   IPTABLES -A OUTPUT -o lo -p all -j ACCEPT


目的地址转换,映射内部地址


iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10


源地址转换,隐藏内部地址


iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1   iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10


地址伪装,动态ip的NAT


iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

snat是把源地址转换为固定的IP地址或者是地址池,而masquerade在adsl等方式拨号上网时候非常有用,因为是拨号上网所以网卡的外网IP经常变化,这样在进行地址转换的时候就要在每次都要修改转换策略里面的ip,使用masquerade就很好的解决了这个问题,他会自己去探测外网卡获得的ip地址然后自动进行地址转换,这样就算外网获得的ip经常变化也不用人工干预了。

开启转发功能


iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 只允许已建连接及相关链接对内转发   ptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 允许对外转发


过滤某个MAC


iptables -A FORWARD -m mac --mac -source MAC地址 -j DROP


报文经过路由后,数据包中原有的MAC信息会被替换,所以在路由后的iptables中使用mac匹配没有意义。

数据包整流


iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT   iptables -A FORWARD -d 192.168.0.1 -j DROP


多端口匹配

用以一次匹配多个端口


iptables -A INPUT -p tcp -m muliport --dport s 21,22,25,80,110 -j ACCEPT


丢弃非法连接


iptables -A INPUT -m state --state INVALID -j DROP   iptables -A OUTPUT -m state --state INVALID -j DROP   iptables-A FORWARD -m state --state INVALID -j DROP


存储于恢复iptables规则


iptables-save > somefile   iptables-restore < somefile


iptables的基本语法规则参考:

1、查看现有的iptables规则:


sudo iptables -L


2、允许已建立的连接接收数据:


sudo ptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


开放常见端口22


sudo iptables -A INPUT -p tcp -i eth0 --dport ssh(22) -j ACCEPT   
sudo iptables -A INPUT -p tcp -i eth0 --dport telnet(23) -j ACCEPT   
sudo iptables -A INPUT -p tcp -i eth0 --dport www(80) -j ACCEPT


4、对每一个报文,iptables依次测试每一条规则,看报文于规则是否相匹配。一旦找到一条匹配的规则, 就根据此规则中指定的行动,对报文进行处置,而对后面的规则不再进行测试。因此,如果我们在规则表的 末尾添加一条规则,让iptables丢弃所有报


sudo iptables -A INPUT -j DROP


5、仍有一个问题,就是环回接口也被阻断了。刚才添加DROP规则的时候其实就可以使用-i eth0来解决这一

问题。然而我们也可以为环回接口添加一条新规则来解决这个问题。但是不能将新规则追加到末尾,因为前

一条规则已经把所有报文都丢弃了,而应该把它插到DROP规则前面,即规则表中第五行的位置(即DROP之前)


iptables -I INPUT 5 -i lo -j ACCEPT


sudo iptables -L -v查看详细详细

iptables-save > /etc/iptables.up.rules(保存当前iptables的设置)

可以vi编辑 /etc/iptables.up.rules

编辑后 iptables-restore < /etc/iptables.up.rules

8、这样设置的iptables每次开机后就失效了,开机自动配置

a. iptables-save > /etc/iptables.up.rules   
b. vi /etc/network/interfaces(最后-s 手动选择截图区域或者窗口两行为我们自己所加的)   auto eth0   iface eth0 inet dhcp   pre-up iptables-restore < /etc/iptables.up.rules   post-down iptables-restore < /etc/iptables.down.rules


9、清楚iptables规则

sudo iptables -F

10、丢弃所有来自127.0.0.1的ICMP包(eg:ping)


sudo iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP


11、有时一个包太大,不可能适合所有线路。这样的话,包会被分成片,然后当作多个包发送。最终重组这些分片来重建整个包


sudo iptables -A OUTPUT -f -d 192.168.1.1 -j DROP(丢弃任何发往192.168.1.1的分片)


12、有时只允许单向的TCP连接会很有用。例如,你可能会允许连接到外部WWW服务器,但不会允许来自那个服务器的连接。 最简单的举动可能是阻止来自那个服务器的包,可惜,TCP连接需要包双向传送(才能正常工作)。

解决办法是,只阻挡那些用来请求连接的包。这些包称为SYN包(OK,从技术上说,它们的SYN标志被设置,而没有设置RST和ACK标志,不过我们简单的称为SYN包)。通过只阻止这种包,我们就可以阻止来自那些地方的连接企图。'--syn'标志是这样用的:只对指定了TCP协议的规则有效。例如,指定来自192.168.1.1的连接请求。


sudo iptables -A INPUT -p TCP -s 192.168.1.1 --syn