iptables -t 表名 -A 规则链名 <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

-A:向规则链中添加条目;

-D:从规则链中删除条目;

-I:向规则链中插入条目;

-L:显示规则链中已有的条目;

表名包括:

raw:高级功能,如:网址过滤。

mangle:数据包修改(QOS),用于实现服务质量。

nat:地址转换,用于网关路由器。

filter:包过滤,用于防火墙规则。

规则链名包括:

INPUT链:处理输入数据包。

OUTPUT链:处理输出数据包。

PORWARD链:处理转发数据包。

PREROUTING链:用于目标地址转换(DNAT)。

POSTOUTING链:用于源地址转换(SNAT)。

动作包括:

ACCEPT:接收数据包。

REJECT:丢弃数据包返回错误。

DROP:丢弃数据包不返回错误。

REDIRECT:重定向、映射、透明代理。

SNAT:源地址转换。

DNAT:目标地址转换。

MASQUERADE:IP伪装(NAT),用于ADSL。

LOG:日志记录。

清除已有iptables规则

iptables -F

iptables -X

iptables -Z

设置chain默认策略

iptables -P INPUT DROP

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

开放指定的端口

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许已建立的或相关连的通行 (重要规则,必须要有)

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT 允许本地回环接口(即运行本机访问本机)

iptables -A OUTPUT -j ACCEPT 允许所有本机向外的访问

iptables -A INPUT -p tcp --dport 22 -j ACCEPT --dport 8000:10000 端口范围 允许访问22端口

iptables -A INPUT -j reject 禁止其他未允许的规则访问

iptables -A FORWARD -j REJECT 禁止其他未允许的规则访问 屏蔽IP

iptables -I INPUT -s 123.45.6.7 -j DROP 屏蔽单个IP的命令

iptables -I INPUT -s 123.0.0.0/8 -j DROP 封整个段即从123.0.0.1到123.255.255.254的命令

查看已添加的iptables规则

iptables -L -n -v

删除规则

iptables -nL --line-number

显示每条规则链的编号

iptables -D FORWARD 2

删除FORWARD链的第2条规则,编号由上一条得知。如果删除的是nat表中的链,记得带上-t nat

iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited

删除规则的第二种方法,所有选项要与要删除的规则都相同才能删除,否则提示iptables: No chain/target/match by that name.

丢弃非法连接

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

2.1 端口转发

首先要开启端口转发器必须先修改内核运行参数ip_forward,打开转发:

# echo 1 > /proc/sys/net/ipv4/ip_forward //此方法临时生效

# vi /ect/sysctl.conf //此方法永久生效

# sysctl -p

本机端口转发

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

根据 iptables防火墙原理详解 可知,实际上在数据包进入INPUT链之前,修改了目标地址(端口),于是不难理解在开放端口时需要设置的是放行8080端口,无需考虑80:

# iptables -A INPUT -s 172.29.88.0/24 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT

此时外部访问http的80端口便可自动转到8080(浏览器地址栏不会变),而且又具有很高的性能,但如果你通过服务器本地主机的curl或firfox浏览器访问http://localhost:80或http://doman.com:80都是不行(假如你有这样的奇葩需求),这是因为本地数据包产生的目标地址不对,你需要额外添加这条 OUTPUT 规则:

iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8080

下面的规则可以达到同样的效果:

iptables -t nat -A PREROUTING -p tcp -i eth0 -d $YOUR_HOST_IP --dport 80 -j DNAT --to $YOUR_HOST_IP:8080

iptables -t nat -A OUTPUT -p tcp -d $YOUR_HOST_IP --dport 80 -j DNAT --to 127.0.0.1:8080

iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j DNAT --to 127.0.0.1:8080

异机端口转发

有些情况下企业内部网络隔离比较严格,但有一个跨网段访问的情况,此时只要转发用的中转服务器能够与另外的两个IP(服务器或PC)通讯就可以使用iptables实现转发。(端口转发的还有其他方法,请参考 linux服务器下各种端口转发技巧 )

要实现的是所有访问 192.168.10.100:8000 的请求,转发到 172.29.88.56:80 上,在 192.168.10.100 是哪个添加规则:

iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.10.100 --dport 8000 -j DNAT --to-destination 172.29.88.56:80

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.10.100

或者

iptables -t nat -A PREROUTING -d 192.168.10.100 -p tcp --dport 8000 -j DNAT --to 172.29.88.56:80

iptables -t nat -A POSTROUTING -d 172.29.88.56 -p tcp --dport 80 -j SNAT --to-source 192.168.10.100

需要注意的是,如果你的FORWARD链默认为DROP,上面所有端口转发都必须建立在FORWARD链允许通行的情况下:

iptables -A FORWARD -d 172.29.88.56 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -s 172.29.88.56 -p tcp -j ACCEPT

2.2 记录日志

为22端口的INPUT包增加日志功能,插在input的第1个规则前面,为避免日志信息塞满/var/log/message,用--limit限制:

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

vi /etc/rsyslog.conf 编辑日志配置文件,添加kern.=notice /var/log/iptables.log,可以将日志记录到自定义的文件中。

service rsyslog restart #重启日志服务

2.3 防止DoS攻击

SYN洪水是攻击者发送海量的SYN请求到目标服务器上的一种DoS攻击方法,下面的脚本用于预防轻量级的DoS攻击:

ipt-tcp.sh:

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

保存与恢复

iptables-save > iptales.bak

cat iptables.bak | iptables-restore

/etc/init.d/iptables save (重启后也不会消失)

centos 7

yum install -y iptables iptables-services

/usr/libexec/iptables/iptables.init save

results matching ""

    No results matching ""