iptables
Iptables名词和术语
四表:filter(INPUT,FORWARD,OUTPUT),NAT(OUTPUT,PREROUTING,POSTROUTING)MANGLE RAW
五链:(chains):INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
容器:
包含或被包含的关系
Policy(规则)-->Chain(链)-->Table(表)--netfilter/iptables
采用的是数据包过滤的机制,会对请求的数据包的包头数据进行分析,按照规则从上到下匹配 iptables主要工作在OSI七层的二、三、四层, iptables也可以工作在七层上(squid +iptables) |
||
Filter表 | 默认表,主要和主机自身相关,真正负责防火墙功能的(过滤流入主机的数据包) | |
INPUT | 负责过滤所有进入主机的数据包(最主要) | |
OUTPUT | 处理所有源地址都是本机地址的数据包(过滤流出主机的数据包) | |
FORWARD | 负责流经主机的数据包 net.ipv4.ip_forward | |
Nat表 | 主要负责网络地址之间的转换,即来源和目的ip和port的转换。可以做企业网关,DMZ,端口映射等 | |
OUTPUT | 和从主机发出去的数据包有关,改变数据包的目的地址 | |
PREROUTING | 在数据包到达防火墙时进行路由判断之前的的规则,作用是改变数据包的目的地址,目的端口等,用于企业路由(zebra)或网关(iptables),端口映射等 | |
POSTROUTING | 离开防火墙时进行路由判断之后执行的规则,用来改变数据包的源地址和源端口,出网时,源地址改成了公网地址,即共享上网 | |
Mangle表 | 主要负责修改数据包中特殊的路由标记,如TTL,TOS,MARK等 | |
INPUT/ OUTPUT/ FORWARD/ PREROUTING POSTROUTING |
iptables --help
[root@node85 ~]# iptables --help iptables v1.4.7 Usage: iptables -[ACD] chain rule-specification [options] iptables -I chain [rulenum] rule-specification [options] iptables -R chain rulenum rule-specification [options] iptables -D chain rulenum [options] iptables -[LS] [chain [rulenum]] [options] iptables -[FZ] [chain] [options] iptables -[NX] chain iptables -E old-chain-name new-chain-name iptables -P chain target [options] iptables -h (print this help information) Commands: Either long or short options are allowed. --append -A chain Append to chain --check -C chain Check for the existence of a rule --delete -D chain Delete matching rule from chain --delete -D chain rulenum Delete rule rulenum (1 = first) from chain --insert -I chain [rulenum] Insert in chain as rulenum (default 1=first) --replace -R chain rulenum Replace rule rulenum (1 = first) in chain --list -L [chain [rulenum]] List the rules in a chain or all chains --list-rules -S [chain [rulenum]] Print the rules in a chain or all chains --flush -F [chain] Delete all rules in chain or all chains 清除所有规则 --zero -Z [chain [rulenum]] Zero counters in chain or all chains 计数器清0 --new -N chain Create a new user-defined chain --delete-chain -X [chain] Delete a user-defined chain 删除用户自定义链 --policy -P chain target Change policy on chain to target --rename-chain -E old-chain new-chain Change chain name, (moving any references) Options:(centos5 非加在后面) [!] --proto -p proto protocol: by number or name, eg. `tcp' [!] --source -s address[/mask][...] source specification [!] --destination -d address[/mask][...] destination specification [!] --in-interface -i input name[+] network interface name ([+] for wildcard) --jump -j target target for rule (may load target extension) --goto -g chain jump to chain with no return --match -m match extended match (may load extension) --numeric -n numeric output of addresses and ports [!] --out-interface -o output name[+] network interface name ([+] for wildcard) --table -t table table to manipulate (default: `filter') --verbose -v verbose mode --line-numbers print line numbers when listing --exact -x expand numbers (display exact values) [!] --fragment -f match second or further fragments only --modprobe=<command> try to insert modules using this command --set-counters PKTS BYTES set the counter during insert/append [!] --version -V print package version.
iptables默认加载的是内核的模块 [root@node85 ~]# lsmod |egrep "nat|filter|ipt" ipt_REJECT 2351 2 iptable_filter 2793 1 ip_tables 17831 1 iptable_filter [root@node85 ~]# lsmod | grep ip ipv6 335589 266 ipt_REJECT 2351 2 nf_conntrack_ipv4 9154 2 nf_defrag_ipv4 1483 1 nf_conntrack_ipv4 nf_conntrack 79206 2 nf_conntrack_ipv4,xt_state iptable_filter 2793 1 ip_tables 17831 1 iptable_filter
可加载模块 modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state
实践案例:禁止ssh 22端口
语法: iptables -t [table] -[AD] chain rule-specification [options]
#iptables -t filter -A INPUT -p tcp --dport 22 -j DROP 禁止ssh 22端口远程登录 #iptables -A INPUT -p tcp --dport 22 -j DROP (同上等价,默认filter表)
#iptables -L -n --line-number -t filter 显示规则序号
-t 指定表
-A 追加
-p 指定协议
--dport 指定目的端口
-j 采取的方式
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息.iptables -t filter -A INPUT -p tcp --dport 80 -j DROP 会造成找不到网页,不会造成404
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
SNAT 源地址转换。在进入路由层面的route之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决NAT上网问题
MASQUERADE 是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
DNAT 目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。
REDIRECT 是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
LOG 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
解决办法(误设禁止ssh规则)
①进到虚拟机 iptables -F 清除所有的规则
②自己有远程管理卡清理
③机房人员帮忙清理
④定时任务 ,定时清理配置防火墙的时候每5分钟执行一次
⑤登录tty清除
⑥iptables -t filter -D INPUT -p tcp --dport 22 -j DROP
⑦/etc/init.d/iptabales stop
删除规则方法
1、service iptables restart
2、iptables -F
3、iptables -D INPUT -p tcp --dport 80 -j drop
4、iptables -D INPUT rulenumber (--line-number)
实践案例:封IP
# iptables -I INPUT -i eth0 -s 192.168.0.11 -p tcp --dport 80 -j DROP
-i 指定接口
-s 指定源地址 (也可以指定网段 -s 192.168.0.0/24)
-p tcp 指定协议
--dport 端口
# iptables -L -n --line-number -t filter Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 192.168.0.11 0.0.0.0/0 tcp dpt:80
实践案例:禁ping
# iptables -t filter -I INPUT -p icmp --icmp-type 8(或any) -i eth0 -s 192.168.0.103 -j DROP #不允许192.168.0.103 ping
案例学习
匹配协议 #iptables -A INPUT -p tcp -s 192.168.0.103 -j DROP #指定地址 #iptables -A INPUT ! -p tcp -s 192.168.0.103 -j DROP #指定地址
匹配主机源IP #iptables -A INPUT -s 192.168.0.103
#iptables -A INPUT ! -s 192.168.0.103
匹配网段 #iptables -A INPUT -s 10.0.0.0/24
#iptables -A INPUT -s ! 10.0.0.0/24
匹配3306端口 #iptables -A INPUT -p tcp --dport 3306
匹配单一端口封源端口DNS封堵 #iptables -A INPUT -p tcp --sport 53 #iptables -A INPUT -p udp --dport 53 冒号隔开封范围 #iptables -A INPUT -p tcp --sport 22:80
#iptables -I INPUT -p tcp --dport 21,22,23,24 ===>错误语法
#iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24
#iptables -I INPUT -p tcp --dport 3306:8809
匹配指定的网络接口
#iptables -A INPUT -i eth0
#iptables -A FORWARD -o eth0
常用服务的iptables设置
##nagios监控
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 5666 -j ACCEPT
##mysql
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 3306 -j ACCEPT
##snmp
iptables -A INPUT -s 192.168.0.0/24 -p UDP --dport 161 -j ACCEPT
##rsync
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 873 -j ACCEPT
##nfs2049,portmap 111
iptables -A INPUT -s 192.168.0.0/24 -p udp -m multiport --dport 111,892,2049 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m multiport --dport 111,892,2049 -j ACCEPT
##icmp
iptables -A INPUT -s 192.168.0.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
匹配网络状态
匹配网络状态 (FTP服务是特殊的,需要配状态连接,21端口连接,20端口传数据) -m state --state NEW: 已经或将启动新的连接 ESTABLISHED: 已建立的连接 RELATED: 正在启动新连接 INVALID: 非法或无法识别的 允许关联的状态包通过(web服务不要使用) #允许关联的状态包 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 比喻:看电影出去WC或者接个电话,回来也得允许进去
控制包的速率设置时间段和并发
-m limit 限制指定时间包的允许通过数量及并发数 --limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时
--limit-burst [n]:在同一时间内允许通过的请求"n"为数字,不指定默认为5
本机地址:172.16.14.1,允许172.16.0.0/16网络ping本机,但限制每分钟请求不能超过20,每次并发不能超过6个 #iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT #iptables -A OUTPUT -s 172.16.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
完整定义一个防火墙案例
1、清空之前的部署。 iptables -F iptables -X iptables -Z
2、让自己的SSH 的端口通过(源地址)连接CRT的ifconfig的地址即可、 iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT ADSL拨号的网操作以下命令 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 3、设置本机lo的通讯规则 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT 4、设置默认的防火墙禁止和允许 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP 5、开启信任的IP网段(内部的网段) #允许IDC LAN /WAN和办公网IP的访问,及对外合作机构的访问 iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEP ←办公室固定的IP段 iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT ←IDC机房的内网网段 iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT ←其他机房的内网网段 iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT ←IDC机房的外网网段 iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT ←其他IDC机房的外网网段
6、WEB服务允许业务服务端口对外访问(允许http服务无条件通过) #web server iptables -A INPUT -p tcp --dport 80 -j ACCEPT
7、允许icmp类型协议通过 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #对外允许ping iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT #看需求 如果对内开启,对外不开就用下面的形式。 iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT #对内用户能ping通 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #允许外面的人ping通可以不设定 8、允许关联的状态包通过 (web服务不要使用ftp服务。)有的话添加以下内容、 #others RELATED FTP 协议 #允许关联数据包 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许关联的包进入 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许关联的包出去
保存配置
#/etc/init.d/iptables save
或 #iptables-save >/etc/sysconfig/iptables
防止DoS攻击(http://seanlook.com/2014/02/26/iptables-example/)
SYN洪水是攻击者发送海量的SYN请求到目标服务器上的一种DoS攻击方法,下面的脚本用于预防轻量级的DoS攻击: iptables -N syn-flood (如果您的防火墙默认配置有“ :syn-flood - [0:0] ”则不许要该项,因为重复了) iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 2/s --limit-burst 5 -j RETURN iptables -A syn-flood -j REJECT # 防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃 # 需要iptables v1.4.19以上版本:iptables -V iptables -A INPUT -p tcp --syn -i eth0 --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
#用Iptables抵御DDOS (参数与上相同) iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT iptables -A FORWARD -p icmp -m limit --limit 2/s --limit-burst 10 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -s ! 172.29.73.0/24 -j DROP
部署企业及IDC机房上网配置网关 局域网共享的两条命令方法: 方法1:适合于有固定外网地址的: iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 10.0.0.7 (1)-s 192.168.0.0/24 办公室或IDC内网网段。 (2)-o eth0 为网关的外网卡接口。 (3)-j SNAT --to-source 10.0.0.19 是网关外网卡IP地址。 方法2:适合变化外网地址(ADSL): iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE 伪装。 实战企业上网的网关服务器 1)网关服务器A,首先是能上网,然后setup添加一块网卡,设置内网10.0.0.7 2)客户服务器B,setup配置IP为10.0.0.8 网关为10.0.0.7,还需要配置DNS3) 3)关服务器上编辑文件/etc/sysctl.conf将设置成:net.ipv4.ip_forward = 1 4)将默认的防火墙转发规则开启:iptables -P FORWARD ACCEPT 5)加载内核模块并查看:lsmod |egrep ^ip modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state 查看:lsmod | grep ^ip 6)在网关服务器上配置: iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to-source 192.168.1.129 【iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE伪装(ADSL)】 7)/etc/init.d/iptables save 8)访问外网映射到内网的服务器上 iptables -t nat -A PREROUTING -d 内IP -p tcp --dport 80 -j DNAT --to-destination 内IP:端口 iptables的生产常用场景: 1)实现服务器本身防火墙功能,使用filter表。 iptables -A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j ACCEPT 2)实现局域网上网网关,使用nat表,(POSTROUTING)网关上也可以同时用filter表做防火墙。 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7 3)实现NAT功能,如:由外部IP映射到内部服务器IP(包括端口),使用nat表,PREROUTING的链。 iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.8:9000 4)其他。。。略。 企业应用场景: 1) 把访问外网IP及端口的请求映射到内网某个服务器及端口(企业内部)。 2) 硬件防火墙,把访问LVS/nginx外网VIP及80端口的请求映射到IDC 负载均衡服务器内部IP及端口上(IDC机房的操作) 映射多个外网ip上网: iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j SNAT 124.42.60.11 -124.42.60.16
iptables 的内核优化 dmesg里面显示 ip_conntrack: table full, dropping packet.的错误提示.如何解决。 C64: net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 优化常常出现以下的错误: http://oldboy.blog.51cto.com/2561410/1336488 1、5.8版本上 error: "net.ipv4.ip_conntrack_max"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_max"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_established"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait"is an unknown key error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait"is an unknown key 这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack 解决办法: modprobe ip_conntrack echo "modprobe ip_conntrack">> /etc/rc.local
2、6.4版本上 error: "net.nf_conntrack_max"isan unknown key error: "net.netfilter.nf_conntrack_max"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_established"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_time_wait"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_close_wait"isan unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_fin_wait"isan unknown key 这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack 解决办法: modprobe nf_conntrack echo "modprobe nf_conntrack">> /etc/rc.local
6.4版本上 error: "net.bridge.bridge-nf-call-ip6tables"isan unknown key error: "net.bridge.bridge-nf-call-iptables"isan unknown key error: "net.bridge.bridge-nf-call-arptables"isan unknown key 这个错误是由于自动处理可载入的模块bridge没有自动载入,解决办法是自动处理开载入的模块ip_conntrack 解决办法: modprobe bridge echo "modprobe bridge">> /etc/rc.local