服务器 发布日期:2024/12/29 浏览次数:1
Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的安全自由的**基于包过滤的防火墙工具**,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。特别是它可以在一台非常低的硬件配置下跑的非常好
Iptables是Linux2.4及2.6内核中集成的服务。其功能与安全性比其**ipfwadm,ipchains**强大的多,iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,iptables也可以支持**7层控制**(squid代理+iptables)
容器:包含和被包含的关系"https://img.jbzj.com/file_images/article/202002/202029155342598.png" alt="" />
iptables工作流程小结
Filter表 是真正的防火墙功能"https://img.jbzj.com/file_images/article/202002/202029155440337.png" alt="" />
对于filter表的控制是我们实现本机防火墙的重要手段,特别是对INPUT链的控制"https://img.jbzj.com/file_images/article/202002/202029155449396.png" alt="" />
提示: iptables主要由2个作用,第一是防火墙,第二是路由。"color: rgb(255, 0, 0);">NAT功能:"color: rgb(255, 0, 0);">Filter功能:
即防火墙FILTER INPUT FORWARD"htmlcode">
iptables默认已经安装 [root@web02 ~]# iptables -V iptables v1.4.7 [root@web02 ~]# rpm -qa iptables iptables-1.4.7-16.el6.x86_64 [root@web02 ~]# /etc/init.d/iptables status iptables: Firewall is not running.
查看iptables规则
[root@web02 ~]# iptables -nL Chain INPUT (policy ACCEPT)
表示针对input链 ACCEPT是默认规则,默认是运行通过的
target prot opt source destination input链下面具体的规则 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
如果没有指定表,默认就是filfer表
iptables默认加载的内核模块 [root@web02 ~]# lsmod |egrep "nat|filter|ipt" ipt_REJECT 2351 2 iptable_filter 2793 1 ip_tables 17831 1 iptable_filter
加载如下模块到linux内核
modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack 连接跟踪 modprobe ip_conntrack_ftp 连接跟踪 modprobe ip_nat_ftp modprobe ipt_state
再次过滤,查看生效情况
[root@web02 ~]# lsmod |egrep "nat|filter|ipt" nf_nat_ftp 3443 0 nf_conntrack_ftp 11953 1 nf_nat_ftp iptable_nat 5923 0 nf_nat 22676 2 nf_nat_ftp,iptable_nat ipt_REJECT 2351 2 nf_conntrack_ipv4 9154 5 iptable_nat,nf_nat nf_conntrack 79206 6 nf_nat_ftp,nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4,xt_state iptable_filter 2793 1 ip_tables 17831 2 iptable_nat,iptable_filter
清空所有的规则,只留下默认规则
[root@web02 ~]# iptables -F [root@web02 ~]# iptables -X [root@web02 ~]# iptables -Z
iptables -F 清除所有规则"htmlcode">
[root@web02 ~]# netstat -lntup|grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1329/sshd tcp 0 0 :::22 :::* LISTEN 1329/sshd
命令如下:
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
-A 添加规则到指定链的结尾,最后一条"https://img.jbzj.com/file_images/article/202002/202029155600043.png" alt="" />
清除规则可以使用iptables -F"https://img.jbzj.com/file_images/article/202002/202029155625652.png" alt="" />
提示:需要写上链和序列号
温馨提示:恢复刚才断掉的SSH连接"htmlcode">
[root@web02 ~]# iptables -A INPUT -p tcp --dport 80 -j DROP [root@web02 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
按照iptables匹配规则,首先会先匹配第一行,依次向下。这样设置拒绝就没有用"htmlcode">
[root@web02 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
还可以通过序列号插入iptables 命令
[root@web02 ~]# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT [root@web02 ~]# iptables -nL --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
[root@web02 ~]# iptables -A INPUT -s 10.0.0.0/24 -j DROP
-s指定源地址"htmlcode">
[root@web02 ~]# iptables -A INPUT ! -s 10.0.0.0/24 -j DROP
案例:控制22端口 eth0网卡进来的数据
iptables -A INPUT -p tcp --dport 22 -i eth0 ! -s 10.0.0.0/24 -j DROP iptables -A INPUT -p tcp --dport 22 -i eth0 ! -s 192.168.1.1 -j DROP
封掉3306端口
iptables -A INPUT -p tcp --dport 3306 -j DROP
匹配指定的协议
iptables -A INPUT -p tcp iptables -A INPUT -p udp
匹配指定协议外的所有协议
iptables -A INPUT ! -p tcp
``匹配单一端口**
iptables -A INPUT -p tcp --sport 22 源端口 iptables -A INPUT -p udp --dport 22 目的端口
匹配端口范围:
iptables -A INPUT -p tcp --sport 22:80 iptables -A INPUT -p tcp --dport 21,22,23 -j DROP---->错误语法 iptables -I INPUT -p tcp -m multiport --dport 22,23,24,25 -j DROP iptables -I INPUT -p tcp -m multiport ! --dport 22,23,24,25 -j DROP iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT iptables -I INPUT -p tcp --dport 18:80 -j DROP <----最佳方法
匹配ICMP类型
iptables -A INPUT -p icmp-type 8
icmp中有很多类型,其中8代表ping"htmlcode">
iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
因为icmp类型很多可以使用any,icmp的所有类型全禁
iptables -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
企业场景禁ping
iptables -A INPUT -p icmp --icmp-type 8 -s 10.0.0.0/24 -j ACCEPT
匹配网络状态
-m state --state
NEW:已经或启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
FTP服务是特殊的,需要配状态连接
允许关联的状态包通过(Web服务不要使用FTP服务)"htmlcode">
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
限制指定时间包的允许通过数量及并发数
-m limit --limit n/{second/minute/hour}
指定时间内的请求速率“n”为速率,后面为时间分别为:秒、分、时
--limit-burst [n]
在同一时间内允许通过的请求“n”为数字,不指定默认为5
iptables -I INPUT -s 10.0.1.0/24 -p icmp --icmp-type 8 -m limit --limit 5/min --limit-burst 2 -j ACCEPT
生产环境配置主机防火墙的两种模式"htmlcode">
[root@web02 ~]# iptables -F [root@web02 ~]# iptables -X [root@web02 ~]# iptables -Z
1.设置允许SSH登录端口
[root@web02 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCETP [root@web02 ~]# iptables -A INPUT -p tcp -s 10.0.0.1/24 -j ACCEPT
2.设置允许本机lo通信规则
[root@web02 ~]# iptables -A INPUT -i lo -j ACCEPT [root@web02 ~]# iptables -A OUTPUT -o lo -j ACCEPT
3.设置默认规则
[root@web02 ~]# iptables -P INPUT DROP [root@web02 ~]# iptables -P OUTPUT ACCEPT [root@web02 ~]# iptables -P FORWARD DROP
查看规则(现在的服务器是最安全的)
[root@web02 ~]# iptables -nL --line-number Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 ACCEPT tcp -- 10.0.0.0/24 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4.开启信任的IP网段"htmlcode">
iptables -A INPUT -s 124.23.62.96/27 -p all -j ACCEPT #办公室固定IP段 iptables -A INPUT -s 192.168.2.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.82.24.0/24 -p all -j ACCEPT #IDC机房的外网网段 iptables -A INPUT -s 203.82.23.0/24 -p all -j ACCEPT #其他IDC机房的外网网段
现在还只是我们可以访问,对外还无法访问"htmlcode">
iptables -A INPUT -p icmp -m icmp-type any -j ACCEPT
提示:如果不想开,就不执行此命令
iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT
6.允许关联的状态包通过(Web服务不要使用FTP服务)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
提示:以上配置就是合格服务器应该配置的
默认使用iptables并没有永久保存,重启失效。"htmlcode">
/etc/init.d/iptables save
保存到/etc/sysconfig/iptables 下面
显示如下格式
[root@web02 ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Mon Aug 15 01:33:44 2016 *nat :PREROUTING ACCEPT [1413:153792] :POSTROUTING ACCEPT [132:8834] :OUTPUT ACCEPT [132:8834] COMMIT # Completed on Mon Aug 15 01:33:44 2016 # Generated by iptables-save v1.4.7 on Mon Aug 15 01:33:44 2016 *filter :INPUT DROP [1798:662465] :FORWARD DROP [0:0] :OUTPUT ACCEPT [288:21100] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 10.0.0.0/24 -p tcp -j ACCEPT -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT COMMIT # Completed on Mon Aug 15 01:33:44 2016
第二种方法:
[root@web02 ~]# iptables-save >/etc/sysconfig/iptables
推荐使用第一种方式
测试:我通过其他服务器扫描我们配置的防火墙"htmlcode">
[root@web02 ~]# yum -y install nmap
使用如下:更多可以使用nmap --help
[root@web02 ~]# nmap 10.0.0.8 -p 1-65535 Starting Nmap 5.51 ( http://nmap.org ) at 2016-08-15 04:28 CST Nmap scan report for 10.0.0.8 Host is up (0.0000070s latency). Not shown: 65532 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 3306/tcp open mysql Nmap done: 1 IP address (1 host up) scanned in 14.21 seconds
(1)确定的规则;"htmlcode">
-A INPUT -p tcp -m tcp --dport 873 -j ACCEPT /etc/init.d/iptables reload
或者改配置的同时命令在执行,也是永久生效。"htmlcode">
iptables -I INPUT -s 10.0.0.1 -j DROP #粗,范围大,外部攻击者 Iptables -I INPUT -s 10.0.0.1 -j DROP iptables -I INPUT -p tcp -s 10.0.0.1 --dport 80 -j DROP #细,范围小。内部
自动封IP:分析Web或应用日志或者网络连接状态封掉垃圾IP"htmlcode">
#!/bin/bash #this is a server firewall created by oldboy 17:03 2006-7-26 # e_mail:31333741@qq.com # qqinfo:49000448 # function: a server firewall # version:1.1 ################################################ # oldboy trainning info. # QQ 1986787350 70271111 # site: http://www.etiantian.org # blog: http://oldboy.blog.51cto.com # oldboy trainning QQ group: 208160987 45039636 ################################################ #define variable PATH IPT=/sbin/iptables #Remove any existing rules $IPT -F $IPT -X $IPT -Z #setting default firewall policy $IPT --policy OUTPUT ACCEPT $IPT --policy FORWARD DROP $IPT -P INPUT DROP #setting for loopback interface $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT #setting access rules #one,ip access rules,allow all the ips of $IPT -A INPUT -s 10.0.10.0/24 -p all -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT ##下面的是重复的,作为知识点保留,单个服务的配置 #second,port access rules #nagios $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 5666 -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 5666 -j ACCEPT #db $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 3307 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 3307 -j ACCEPT #ssh difference from other servers here. $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -p tcp --dport 22 -j ACCEPT #http $IPT -A INPUT -p tcp --dport 80 -j ACCEPT #snmp $IPT -A INPUT -s 10.0.0.0/24 -p UDP --dport 161 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p UDP --dport 161 -j ACCEPT #rsync $IPT -A INPUT -s 10.0.0.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp -m tcp --dport 873 -j ACCEPT #icmp #$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT #others RELATED $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
企业案例:写一个脚本解决DOS攻击生产案例"htmlcode">
[root@db02 scripts]# cat test_6.sh #!/bin/sh # [ -f /etc/init.d/functions ] && . /etc/init.d/functions IP_file="/server/scripts/ddos.txt" IP_filter_command="iptables -I INPUT -j DROP -s" IP_recover_command="iptables -D INPUT -j DROP -s" function IP_check(){ grep "EST" ${IP_file}|awk -F "[ |:]+" '{print $6}'|sort |uniq -c|sort -rn -k1 > /server/scripts/ip.txt } function IP_filter(){ exec < /server/scripts/ip.txt while read line do IP_count=`echo $line|awk '{print $1}'` IP=`echo $line|awk '{print $2}'` IP_fil=`iptables -L -n|grep "\b${IP}\b"|wc -l` if [ ${IP_count} -gt 25 -a ${IP_fil} -eq 0 ];then ${IP_filter_command} ${IP} echo "${IP}" /server/scripts/ip_filtered.txt action "Filter ${IP}" /bin/true fi done } function IP_recover(){ exec < /server/scripts/ip.txt while read line do IP_count=`echo $line|awk '{print $1}'` IP=`echo $line|awk '{print $2}'` IP_fil=`iptables -L -n|grep "\b${IP}\b"|wc -l` if [ ${IP_count} -le 25 -a ${IP_fil} -eq 1 ];then ${IP_recover_command} ${IP} echo "${IP}" /server/scripts/ip_filtered.txt action "Recover ${IP}" /bin/true fi done } function main(){ case "$1" in filter) IP_check echo "$(date +%F-%H:%M:%S) filtered by $(whoami)" /server/scripts/ip_filtered.txt IP_filter ;; recover) IP_check echo "$(date +%F-%H:%M:%S) recovered by $(whoami)" /server/scripts/ip_filtered.txt IP_recover ;; *) echo "USAGE:$0 {filter|recover}" exit 1 esac } main $*
技巧:具备外网IP的服务器不对外的服务最好要做源地址限制。对外提供的服务,不能做源地址限制,例如:80 端口"https://img.jbzj.com/file_images/article/202002/202029155643197.png" alt="" />
共享上网设置"htmlcode">
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7
(1)-s192.168.1.0/24 办公室或IDC内网网段。"htmlcode">
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE #伪装。
配置如下
第一步:外网服务器配置
[root@lb01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.5 [root@lb01 ~]# iptables -t nat -L -n
开启内核转发
net.ipv4.ip_forward = 1 vim /etc/sysctl.conf sysctl -p #生效
需要上网服务器设置"htmlcode">
route add default gw 172.16.1.5#此处写提供外网的IP地址 vim /etc/resolv.conf
添加 nameserver 223.5.5.5"https://img.jbzj.com/file_images/article/202002/202029155650499.png" alt="" />
route -n 检查
案例2:实现把访问10.0.0.5:80的请求转到172.16.1.8:80
[root@web02 ~]# iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8:80 [root@web02 ~]# iptables -P FORWARD DROP
1、Linux主机防火墙(表:FILTER 控制链:INPUT)"htmlcode">
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7
3、外部地址和端口,映射为内部地址和端口(表:NAT 控制的链:PREROUTING)
iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.8:9000
企业案例:实现外部IP 124.42.34.112 一对一映射到内部server 10.0.0.8"htmlcode">
-A POSTROUTING -s 10.0.0.0/255.255.240.0 -d 124.42.34.112 -j SNAT --to-source 10.0.0.254 -A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8 -A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112
1)局域网共享上网(适合做企业内部局域网上网网关,以及IDC机房内网的上网网关[nat POSTROUTING])"htmlcode">
iptables -A PREROUTING -i eth0 -d 211.167.253.109 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.10.6:9025
5)结合zebra配置企业级路由器
iptables -t nat -A POSTROUTING -s 10.0.0.1/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 iptables -t nat -A POSTROUTING -s 172.16.1.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.103-124.42.60.106 #iptables -t nat -A postrouting -S 192.168.1.0/22 -o eth0 -j SNAT --to-source 10.0.0.241-10.0.0.249
问题:"htmlcode">
net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 #5、dmesg里面显示ip_conntrack: table full, dropping packet.的错误提示.如何解决。 #以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。 c58: net.ipv4.ip_conntrack_max = 25000000 net.ipv4.netfilter.ip_conntrack_max=25000000 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120 ################################################################ 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
调整内核参数/etc/sysctl.conf后,需执行/sbin/sysctl -p使得修改生效。"gtx-trans" style="position: absolute; left: 27px; top: 10948.8px;">