iptables

filter表

根据已配置好的规则操作本机的包(INPUT)、转发的包(FORWARD)、本机发出的包(OUTPUT);最终决定是否放行(ACCEPT)、丢弃(DROP)、拒绝(REJECT)、产生告警日志(LOG)。

nat表

根据配置好的规则,在包刚刚到达FW时修改目的地址(PREROUTING)、本机产生包修改目的地址(OUTPUT)、离开转发系统前修改源地址(POSTROUTING);最终实现网络SNAT、REDIRECT、DNAT

mangle表

主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

iptables工作的netfilter框架挂载点转发流程

netfilter

  • 1.数据包从网络A经过网卡中断送入内核协议栈,首先进入prerouting挂载点,路由前的操作可加入到此挂载点完成,如图的对目的地址的修改,修改后的地址会跟进修改后的地址会继续进入转发路由查找但是查找路由的目的地址变成了目的NAT后的地

  • 2.经过转发路由查找,如果是发给本机的报文,交给本机的应用程序处理;在具体的应用程序处理之前
    会经过input挂载点,如图你可以进行上本机的报文限制,直接在input挂载点丢弃报文,使其无法到达具体的应用程序。

  • 2-1.应用程序在处理完成后,根据本机路由表酱数据发出,在本机报文发出前,会经过output挂载点,此处你的策略只针对于本机发出报文有效。如果你想修改本机发出报文的源地址,你需要在此实现。

  • 3.经过转发路由查找,如果是转发的报文,在具体的转发报文之前,你可以通过在forward挂载点操作进行过滤等动作。

  • 4.无论是转发报文还是本机发出的报文,它们最终会经过postrouting挂载点,送到最终物理发包流程;也就是说postrouting是数据包离开本netfilter协议栈的最后一个流程,你可以在这个流程中修改源IP地址。

iptables基本命令

iptablecmd

  • [-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
  • -A:新增一条规则,到该规则链列表的最后一行
  • -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
  • -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
  • -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
  • -P:设置某条规则链的默认动作
  • -nL:-L、-n,查看当前运行的防火墙规则列表
  • chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
  • [规则编号]:插入、删除、替换规则时用,–line-numbers显示号码
  • [-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
  • [-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等
  • [-s 源IP地址]:源主机的IP地址或子网地址
  • [–sport 源端口号]:数据包的IP的源端口号
  • [-d目标IP地址]:目标主机的IP地址或子网地址
  • [–dport目标端口号]:数据包的IP的目标端口号
  • -m:extend matches,这个选项用于提供更多的匹配参数,如:
  • -m state –state ESTABLISHED,RELATED
  • -m tcp –dport 22
  • -m multiport –dports 80,8080
  • -m icmp –icmp-type 8
  • <-j 动作="">:处理数据包的动作,包括ACCEPT、DROP、REJECT等

    iptables命令

iptables -nL 查看当前iptables filter规则

iptables -nL 等价于iptables -nL -t filter

iptables -nL -t nat查看nat规则

iptables -nL –line-number 显示规则链编号

iptables -D FORWARD 2删除FORWARD链第二条规则

iptables -A INPUT -j REJECT –reject-with icmp-host-prohibited拒绝所有报文,并回应主机已被封锁

–reject-with icmp-net-prohibited 拒绝数据包回应一条icmp改造主机被封锁
–reject-with tcp-reset 拒绝数据包 tcp回应rst
–reject-with icmp-net-prohibited 拒绝数据包回应一条icmp告知网络禁止

实现在外界和本机访问主机的80端口就相当于访问8080端口

1
2
iptables -t nat -A PREROUTING -p -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -p tcp -m --dport 80 -j REDIRECT --to-ports 8080

设置input默认丢包,forward和output默认放通

1
2
3
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -m state –state NEW,ESTABLISHED

1
iptables -I INPUT 3 -p icmp -m state --state NEW -j ACCEPT

背景:策略放在主机A, 默认策略是INPUT丢包,没有安全策略情况下,主机A和主机B可以相互ping通
测试结果:执行上述命令后效果为:主机A ping主机B ping不通;主机B ping主机A能通一个包

1
iptables -I INPUT 3 -p icmp -m state --state ESTABLISHED -j ACCEPT

背景:策略放在主机A, 默认策略是INPUT丢包
测试结果:主机A ping主机B能ping通,主机B ping主机A并不能ping通

1
iptables -I INPUT 3 -p icmp -m state --state RELATED -j ACCEPT

背景:策略放在主机A, 默认策略是INPUT丢包
测结果:主机A和主机B均不通

1
iptables -I INPUT 3 -s 10.30.10.141 -p tcp  -m state --state NEW -j ACCEPT

背景:策略放在主机A, 默认策略是INPUT丢包,没有安全策略情况下,主机A和主机B可以相互ssh连接
测试结果:主机A无法 telnet 主机B(10.30.10.141) 22端口, 主机B telnet 主机A 可完成三次握手

1
iptables -I INPUT 3 -s 10.30.10.141 -p tcp  -m state --state ESTABLISHED -j ACCEPT

背景:策略放在主机A, 默认策略是INPUT丢包,没有安全策略情况下,主机A和主机B可以相互ssh连接
测试结果:主机A可正常ssh主机B,主机B无法ssh主机A

1
iptables -I INPUT 3 -s 10.30.10.141 -p tcp  -m state --state NEW,ESTABLISHED -j ACCEPT

背景:策略放在主机A, 默认策略是INPUT丢包,没有安全策略情况下,主机A和主机B可以相互ssh连接
测试结果:主机A和主机B可以相互ssh连接

其它说明
指定要匹配包的的状态,当前有4种状态可用:INVALID,ESTABLISHED,NEW和RELATED。

  • INVALID意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题。
  • ESTABLISHED意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送
  • RELATED说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。比如,FTP data transfer,ICMP error 和一个TCP或UDP连接相关。
  • NEW状态可以理解成允许首包建立会话,这里首包不适一个包的意思(icmp是第一个包的意思、TCP是三次握手的意思)。

10.30.0.0/16 网断允许访问本机的80和443端口

1
iptables -A INPUT -s 10.30.0.0/16 -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT

10.30.10.0/24网段所有报文均不允许访问本机tcp的80端口,直接丢弃数据包

1
iptables -A INPUT -s 10.30.10.0/24 -p tcp -m tcp --dport 80 -j DROP

完全信任主机10.30.10.30

1
iptables -A INPUT -s 10.30.10.30 -j ACCEPT

放行lo口所有规则并且插入到规则2位置

1
iptables -I INPUT 2 -i lo -j ACCEPT

当有人连接22端口时候产生日志,并对日志写入进行限制

1
iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG

iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT –to 10.30.10.30

目的NAT,访问202.110.123.100,最终相当于访问10.30.10.30

iptables -A POSTROUTING -o eth0 -s 1.1.1.1 -j SNAT –to 202.110.123.200

源NAT,1.1.1.1内网机器上外网,其报文源地址全部变成 202.110.123.200

iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT –to NASQUERADE

源NAT,1.1.1.1内网机器上外网,其报文根据接口情况进行变更

ubuntun iptables规则开机启动

步骤1:将规则保存到

1
iptables-save > /etc/iptables.up.rules

步骤2:系统启动时候加载这些配置,vim /etc/network/interfaces;在最后一行加入

1
2
3
4
5
root@controller:~# cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
pre-up iptables-restore < /etc/iptables.up.rules