Linux下iptables总结

linux下防火墙iptables

工作于网络或主机边缘,对进出本网络或本主机的网络报文安装事先设定好的匹配规则进行检查,对能够被规则所匹配的报文按照规则定义的处理机制进行处理的组件

通常情况下iptables/netfilter默认大策略为以下两种情况:

拒绝所有 放开合法
放行所有 拒绝违法

1、iptables规则具有4大规则功能表

filter:包过滤,用于防火墙规则,可以对应input,forward,output三个链
nat:地址转换,用于网关路由器,可以对应prerouting,postrouting,output三个链
         snat dnat pat(端口转换)
mangle:数据包修改(QOS),用于实现服务质量,input,forward,prerouting,postrouting,output五个链均可以用
raw:高级功能,如:网址过滤, prerouting,output两个链可以使用

2、iptables具有5大规则链

prerouting:用于目标地址转换(DNAT)

input:处理输入数据包,如果数据包的目的地址是本机,则系统将数据包送往Input链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。

forward:处理转发数据包,如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往Forward链。如果通过规则检查,则该包被发给相应的本地进程处理; 如果没有通过规则检查,系统就会将这个包丢掉。

output:处理输出数据包,如果数据包是由本地系统进程产生的,则系统将其送往Output链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这包丢掉。

postrouting:用于源地址转换(SNAT)

3、iptables的规则属性

1、网络层协议属性 ip 协议
2、传输层协议属性 tcp udp icmp

4、常见命令参数

-L == --list
    -n:数字格式显示ip和port
    --line-numbers:显示链中规则的行号
    -x:显示精确值,不要做单位换算
     -t:(filter|nat|mangle|raw)

    小写字母选项:用来定义匹配标准以及其他

管理链:
-F:清空链
     iptables -t filter -F INPUT

-P:设定默认策略
     iptables -t filter -P INPUT DROP (ACCEPT)

-N:新建一条自定义链
    iptables -N FILTER_WEB
-X:删除自定义的空链
-Z:计算器清零
    iptables -Z
-E:重新命名自定义链

管理规则:
-A:追加规则
-I (n):指定位置,插入规则为第n条
-D (n):删除第n条
-R( n):替换第n条

编写规则语法
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
目标动作:
         drop 丢弃
         reject 拒绝
         accept 接受
         return 
         redirect 端口重定向
         dnat 目标地址转换
         snat 源地址转换
         MASGUEGRADE IP伪装(NAT),用于ADSL
         log 日志记录
         mark
自定义链
匹配标准
通用匹配
              -s|--src|--source [!]IP
              -d|--dst|--destinaton [!] IP

eg:

iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -j ACCEPT

-i incoming_interface:指定数据报文流入接口与INPUT、 PREROUTING 、FORWARD链一起用

eg:

iptables -t filter -A INPUT -s 192.168.217.0/24 -d 192.168.217.134 -i eth0 -j ACCEPT

-o outing_interface:指定数据报文流出接口与OUTPUT 、PREROUTING、 FORWARD链一起用
-p {tcp|udp|icmp}
eg:增加规则,允许tcp协议通过网卡到达主机内部
iptables -t filter -A INPUT -s 192.168.217.0/24 -d 192.168.217.134 -p tcp -j ACCEPT
eg:修改第二条规则为放行tcp协议
iptables -t filter -R INPUT 2 -s 192.168.217.0/24 -d 192.168.217.134 -p tcp -j ACCEPT

iptables -I INPUT 1 -s 192.168.217.0/24 -p tcp -dport 22 -j ACCEPT

 

5、扩展匹配
隐含扩展
-p tcp
--sport
--dport
--tcp-flags
--tcp-flags SYN,ACK,RST FIN SYN
ALL
NONE
--tcp-flags ALL SYN,FIN
--syn == --tcp-flags SYN,ACK,RST FIN SYN
-p udp
--sport
--dport
例如:本机dns服务器,要为本地客户端做递归查询,iptables的INPUT.OUTPUT默认为DROP,本机地址为192.168.21.34
iptables -A INPUT -d 192.168.21.134 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.21.134 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.21.34 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -d 192.168.21.134 -p udp --sport 53 -j ACCEPT
-p icmp
--icmp-type
请求:8
响应:0
允许自己能ping通别人 以及允许别人能ping通自己需要四条规则

允许icmp包从192.168.21.134出去
iptables -A OUTPUT -s 192.168.217.0/24 -d 192.168.21.134 -p icmp --icmp-type 8 -j ACCEPT
允许icmp响应包进入192.168.21.134
iptables -A INPUT -s 192.168.21.134 -d 192.168.217.0/24 -p icmp --icmp-type 0 -j ACCEPT

允许别人icmp包进来
iptables -A INPUT -s 192.168.21.134 -d 192.168.217.0/24 -p icmp --icmp-type 8 -j ACCEPT
允许别人进来后出去
iptables -A OUTPUT -s 192.168.217.0/24 -d 192.168.21.134 -p icmp --icmp-type 0 -j ACCEPT


显式扩展
-m sate --state NEW ESTABLISHED RELATED INVALID
第一次发起的请求为NEW,之后都称为ESTABLISHE,RELATED不止一个协议的应用

SSH示例
iptables -I INPUT 1 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT 1 -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT


所有建立连接的报文允许从本地出去
iptables -I OUTPUT 1 -s 172.16.100.1 -m state --state ESTABLISHED -j ACCEPT

iptables放行ftp服务
需要装载:nf_conntrack_ftp模块,可以使用modprobe命令,也可编辑/etc/sysconfig/iptables-config文件
INPUT OUTPUT 默认为drop
iptables -A INPUT -d 172.16.100.1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.1 -m state --state RELATED,ESTABLISHED -j ACCEPT


多端口匹配,可以指定15个以内的离散端口
-m mulitport
--source-ports
--destination-ports
--ports
在input链上,插入规则为第二条规则,同时允许新链接tcp报文的21 22 80端口进入
iptables -I INPUT 2 -s 172.16.100.1 -p tcp -m state --state NEW -m multiport --destination-ports 21,22,80 -j ACCEPT

-m iprange:指定匹配的ip地址范围,如172.16.100.1-172.16.109.254
--src-range 172.16.100.1-172.16.109.254
--dst-range 172.16.100.1-172.16.109.254


-m limit
--limit 12/min 5s时间放行一个
--limit-burst 2 一次放行2个

eg:插入规则为第二条该规则允许每次放入2个新连接,之后每5秒放进一个新连接
iptables -I INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -m sate --state NEW -m limit --limit 12/min --limit-burst 2 -j ACCEPT
eg:一分钟只允许指定ping包的个数进入本机

-m string
--string ""
--algo {bm|kmp}

-m time
--datestart
--datestop

--timestart
--timestop

--weekdays
--monthdays

-m connlimit
--connlimit-above [num] 连接数限制
默认规则为DROP时
来自172.16.0.0/16网络访问80端口的数量不超过5个
iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -m connlimit ! --connlimit-above 5 -j ACCEPT

-m hashlimit,limit

recent模块抵御dos攻击,建立一个列表保存所有访问过的指定的服务的客户端IP
300秒内连续访问3次将拒绝访问,需要等待5分钟后才能打开新的连接
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptableS -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
备注
--name 后面的SSH是记录访问tcp 22端口的新连接 记录名称为SSH
--update 是指每次建立连接都更新列表
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
iptables的记录连接信息位置为 /proc/net/xt_recent/SSH

iptables记录访问日志
iptables -A INPUT -p udp -j LOG --log-prefix "IPTABLES UDP-IN: "
iptables -A INPUT -p tcp -j LOG --log-prefix "IPTABLES TCP-IN: "
iptables -A INPUT -j LOG --log-prefix "IPTABLES PROTOCOL-X-IN: "

6、练习INPUT和OUTPUT
     1、限制本地主机的web服务器在周一不允许访问,且新增请求的速率不允许超过100个每秒,web字符包含admin字符的页面不允许访问,
web服务仅允许响应报文离开本机
iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED, -j ACCEPT
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m time --weekdays Tue,Wed,Thu,Fri,Sat,Sun -m --limit 100/sec -m string --algo kmp ! --string "admin" -m state --state NEW -j ACCEPT
iptables -I OUTPUT 1 -m state --state ESTABLISHED,RELATED, -j ACCEPT

     2、在工作时间,即周一到周五的8:30-17:30,开放本机的ftp服务给172.16.0.0的网络中主机访问数据下载请求次数每秒钟不超过5个
iptables -I INPUT 1 -m state --state ESTABLISHED, -j ACCEPT
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 21 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 08:30:00 --timestop 17:30:00 -j ACCEPT
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp -m state --state RELATED -m limit 5/min -j ACCEPT
iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT

    3、开放本机的ssh服务给172.16.x.1-172.16.x.100网络中的主机,新请求速率每分钟不得超过2个,仅允许响应报文通过其服务端口离开本机
iptables -A INPUT -m iprange --src-range 172.16.100.1-172.16.100.100 -m limit --limit 2/min -p tcp --dport 22 -d 172.16.100.1 -i eth0 -m state --state NEW -j ACCEPT

    4、拒绝tcp状态标志位为1及全部为0的报文访问本机
iptables -N clean_in
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -f 172.16.100.1 -j RETURN
iptables -I INPUT 1 -D 172.16.100.1 -j clean_in

    5、允许本地请求本地
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT 或 iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT 或 iptables -A OUTPUT -o lo -j ACCEPT


    6、允许本地主机ping别的主机,别的主机不允许ping本地主机
iptables -A INPUT -m state --state ESTABLISHED, -j ACCEPT
iptables -A OUTPUT -s 172.16.100.1 -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

7、nat表
大并发不适合nat模式

SNAT:代理内部客户端访问外部网络。在iptables上的POSTROUTING
-j SNAT --to-source IP
-j MASGUEGRADE
服务器地址为192.168.10.10(模拟内网地址)
nat服务器,两块网卡,一个网卡地址为192.168.10.11(模拟内网地址),一个网卡地址为172.16.100.1 (模拟外网地址)
web服务器的地址为172.16.100.17(模拟外网地址)
一、如何通过192.168.10.10(模拟内网地址)服务器访问172.16.100.17(模拟外网地址)
方法一
1、开启ip_forward为1
2、iptables -P FORWARD ACCEPT
3、iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

方法二
分别在192.168.10.10上、172.16.100.17写路由

二、仅允许192.168.10.10服务器访问172.16.100.17的web服务
iptables -P FORWARD DROP
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -d 192.168.10.0/24 -p tcp --sport 80 -j ACCEPT

 

DNAT:将内部服务器发布至外部网络(外部访问内部服务应用,此场景下ftp比较麻烦) 在iptable上的PREROUTING
-j DNAT --to-destination IP
外部通过访问192.168.10.254(模拟外网地址)的80取代 直接访问172.16.100.17(模拟内网地址)的80
即在192.168.10.254的80到172.16.100.17的80做映射关系
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 192.168.10.254 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.17

iptables -P FORWARD DROP
iptables -t nat -A PREROUTING -d 192.168.10.254 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.17
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -d 172.16.100.17 -p tcp --dport 80 -m state --state NEW -j ACCEPT

8、规则保存生效

service iptables save
保存到/etc/sysconfig/iptables中
iptables-save > /path/to/iptables.rules

生效文件中的规则
iptables-restore < /path/to/iptables.rules

eg:ubuntu下操作

iptables-save > /etc/init.d/iptables.up.rules
echo "pre-up iptables-restore < /etc/init.d/iptables.up.rules" >>/etc/network/interfaces

posted @ 2017-09-12 15:03  wclwcw  阅读(620)  评论(0编辑  收藏  举报