几个 iptables 使用技巧

避免封锁自己

/sbin/iptables-save > /root/iptables-work
/sbin/iptables-save > /root/iptables-works-`date +%F`
/sbin/iptables-restore < /root/iptables-works-2018-09-11 # 利用文件恢复
# 策略顶部
iptables -A INPUT -p tcp --dport 22 -j DROP
# 将源地址为 10.0.0.0/8、 目的地址是 192.168.100.101、目的端口号是 22 (--dport 22 ) 的 TCP(-p tcp )数据包通通丢弃掉
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -d 192.168.100.101 -j DROP
# -I 表示则策略首部插入规则,-A 表示在策略尾部追加规则
iptables -I INPUT -s <your IP> -j ACCEPT # 加入白名单

设置策略

# 设置默认规则为丢弃
# Set a default policy of DROP
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

# Accept any related or established connections
-I INPUT  1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-I OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow all traffic on the loopback interface
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# Allow outbound DHCP request
-A OUTPUT –o eth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT

# Allow inbound SSH
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW  -j ACCEPT

# Allow outbound email
-A OUTPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW  -j ACCEPT

# Outbound DNS lookups
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT

# Outbound PING requests
-A OUTPUT -o eth0 -p icmp -j ACCEPT

# Outbound Network Time Protocol (NTP) requests
-A OUTPUT -o eth0 -p udp --dport 123 --sport 123 -j ACCEPT

# Outbound HTTP
-A OUTPUT -o eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

COMMIT

限制 IP 地址范围

 -> [email protected] ~ ☺  # host -t a www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 14.215.177.38
www.a.shifen.com has address 14.215.177.39

使用 IP Range To CIDR 转换

iptables -A OUTPUT -p tcp -i eth0 -o eth1 -d 14.215.177.38/31 -j DROP

按照时间规定限制

# 指定在中午12点(--timestart 12:00)到下午 1 点(--timestop 13:00)之间允许(-j ACCEPT)到 www.baidu.com (-d 14.215.177.38/31)的 http 以及 https (-m multiport --dport http,https)的访问
iptables –A OUTPUT -p tcp -m multiport --dport http,https -i eth0 -o eth1 -m time --timestart 12:00 –timestop 13:00 –d 14.215.177.38/31 -j ACCEPT

按照时间拒绝所有

# 设置凌晨 2 点到 3 点之间拒绝所有的 TCP 和 UDP 访问, 进行维护
# 禁止(-j DROP)在凌晨2点(--timestart 02:00)到凌晨3点(--timestop 03:00)之间的 TCP 和 UDP (-p tcp and -p udp)的数据进入(-A INPUT)访问
iptables -A INPUT -p tcp -m time --timestart 02:00 --timestop 03:00 -j DROP
iptables -A INPUT -p udp -m time --timestart 02:00 --timestop 03:00 -j DROP

限制连接数量

# 单个主机在一分钟之内新建立(-p tcp -syn)超过 20 个(-connlimit-above 20)到你的 web 服务器(--dport http,https)的连接,服务器将拒绝(-j REJECT)建立新的连接,然后通知对方新建连接被拒绝(--reject-with-tcp-reset)
iptables –A INPUT -p tcp -syn -m multiport --dport http,https -m connlimit --connlimit-above 20 –j REJECT -–reject-with-tcp-reset

监控 iptables 规则

# 查看规则被访问了多少次
iptables -L -v -n -line-numbers
# 哪条规则从来没有被访问过,这些可以被清除掉
# 两个数字 0 之间不是 Tab 键,而是 5 个空格
iptables -nvL | grep -v "0     0"
# 监控正在发生什么
# 动态监视 iptables 中的活动,并仅显示正在遍历的规则
watch --interval=5 'iptables -nvL | grep -v "0     0"'

使用FWLogwatch生成日志报告

一个实例

iptables -F #清空所有默认规则
iptables -X #清空所有自定义规则
iptables -Z #所有计数器归0

iptables -P INPUT ACCEPT # 先允许所有,不然有可能会杯具

iptables -A INPUT -s IP1,IP2,IP3,网段1,网段2 -j ACCEPT # 允许IP和网段访问

iptables -A INPUT -i lo -j ACCEPT # 允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT        # 开放22端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT    # 允许ping
iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT # 允许接受本机请求之后的返回数据 RELATED

iptables -P INPUT DROP            # 其他入站一律丢弃
iptables -P OUTPUT ACCEPT         # 所有出站一律绿灯
iptables -P FORWARD DROP          # 所有转发一律丢弃

iptables -A INPUT -p tcp -s 12.34.56.78 -j ACCEPT    # 如果要添加内网ip信任(接受其所有TCP请求)
iptables -P INPUT DROP                                # 过滤所有非以上规则的请求
iptables -I INPUT -s ***.***.***.*** -j DROP        # 要封停一个IP,使用下面这条命令
iptables -D INPUT -s ***.***.***.*** -j DROP        # 要解封一个IP,使用下面这条命令

iptables -A INPUT -s IP1,IP2,IP3,网段1,网段2 -j DROP # 不允许IP和网段访问