荣耀之链论坛

 找回密码
 立即注册
搜索
查看: 4188|回复: 5

iptables

[复制链接]

1325

主题

2372

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10262
发表于 2015-5-6 16:51 | 显示全部楼层 |阅读模式
我重新认识了iptables
转发 POSTROUTING PREROUTING 这3个地方的功能不一样
转发就是单纯的路由
POSTROUTING主要是地址伪装,也就是SNAT
PREROUTING主要是端口映射或者说叫DNAT
这3个东西可以结合使用
单独开转发仅仅只是让防火墙能转发数据包,要实现其他功能还需要其他操作
开转发,同时服务器设置了网关,然后防火墙设置PREROUTING端口映射就可以实现IP透传 这个时候服务器是不能上网的
开转发,同时服务器设置了网关,然后防火墙设置单接口POSTROUTING 就能让服务器访问外网 之后如果防火墙设置PREROUTING端口映射也能实现IP透传
开转发,服务器不设置网关,然后防火墙设置全接口POSTROUTING 然后防火墙设置PREROUTING端口映射 就可以让外面的客户端访问服务器被映射的端口,这个时候服务器看到的IP就是防火墙的LAN口IP(这就是我以前一直使用的方式,其实这个方式是错误的)

FORWARD在PREROUTING之后
数据包进来先匹配PREROUTING,如果匹配了就进入FORWARD如果不匹配就进入INPUT

最后放上iptables开启IP透传的教程
第一步:开启转发
第二步:PREROUTING开启端口映射
第三步:内部服务器的网关指向防火墙的LAN口
仅仅这3步就可以了
效果就是服务器通过netstat -ant命令看到的IP是客户端的真实IP

如果这个时候还需要服务器能上网,则只需要把服务器的IP增加到POSTROUTING里面
比如iptables -t nat -A POSTROUTING -s 192.168.0.2 -o eth0 -j MASQUERADE


甚至如果软路由单网卡多IP
默认IP被DDOS黑洞了,这个时候可以手动修改SNAT 让内部的服务器走另外一个IP出去(这个情况适用于内部的服务器需要访问外网的情况,比如我的乐趣魔力就必须访问外网才可以正常使用)
比如iptables -t nat -R POSTROUTING 1 -s 192.168.80.31 -o eth1 -j SNAT --to-source 192.168.11.218
#这个就是我本地虚拟机测试,路由器有217和218这2个IP,默认是217,218是我后来手动添加的,模拟临时购买IP
我手动把217模拟黑洞了,然后内部的客户端就无法上网了,然后我手动指定了SNAT的ip 内部的客户端就可以上网了







下面这张图是数据包的路径
https://baike.baidu.com/pic/IPTA ... f7de3fe9925bd317dcd





iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -j DROP

iptables -t filter -I INPUT 3 -p tcp --dport 3389 -j ACCEPT

iptables -t filter -I INPUT 3 -p tcp --dport 3306 -j ACCEPT



iptables -t filter -A FORWARD -j DROP

iptables -t filter -A OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -t filter -A OUTPUT -j DROP

iptables -t filter -I OUTPUT 3 -p tcp --sport 3389 -j ACCEPT


iptables -t filter -I OUTPUT 3 -p tcp --sport 3306 -j ACCEPT

上面这几条的配置意思是
只能访问服务器的80和22端口
中间这个转发是服务器作为路由器使用的时候才有用,不过以防万一全部阻止
服务器只有80和22端口可以与外部通信

写玩以后要保存
service iptables save
(如果不保存重启服务器或者重启计算机以后规则就没有了)

实测这样写没有问题,网站访问正常,WinSCP连接正常



iptables -F INPUT(不指定表名时默认清空filter表)
iptables -t nat -F (清空nat 表)
iptables -t raw -X (清空raw表中用户自定义的所有规则链)


允许防火墙ping通过
iptables -t filter -I INPUT 1 -p icmp -j ACCEPT
iptables -t filter -I OUTPUT 1 -p icmp -j ACCEPT
把这两条规则插入进去成为第一条规则


查看编号
iptables -nL --line-number
删除第10行
iptables -D INPUT 10

iptables -I 3 INPUT -i lo0 -j ACCEPT会出现在INPUT链中第三条规则
回复

使用道具 举报

1325

主题

2372

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10262
 楼主| 发表于 2016-10-3 23:01 | 显示全部楼层
/etc/sysconfig/iptables
回复 支持 反对

使用道具 举报

1325

主题

2372

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10262
 楼主| 发表于 2017-6-12 01:36 | 显示全部楼层
端口转发

iptables -F

iptables -t nat -F

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -j MASQUERADE

iptables -t nat -I PREROUTING 1 -p tcp --dport 1123 -j DNAT --to 121.196.204.1:9040
iptables -t nat -I PREROUTING 1 -p tcp --dport 1124 -j DNAT --to 121.196.204.1:9040

service iptables save

service iptables status
exit

限制连接数
iptables -A INPUT -m connlimit --connlimit-above 5 -j DROP  #允许每个IP连接5个

限制每秒发包数量
iptables -A OUTPUT -p tcp --sport 9900 -m limit --limit 250/s --limit-burst 500 -j ACCEPT


增加自己的规则
然后有匹配的包就走这个规则
下面是是一个端口转发的例子
iptables -N CC9040-9044
iptables -I FORWARD 1 -p tcp --dport 9040:9044 -j CC9040-9044 #必须用FORWARD,用nat就不行
iptables -t nat -I PREROUTING 1 -p tcp --dport 9040:9044 -j DNAT --to 121.196.204.1:9040 #转发表转发这个端口的数据

iptables -I CC9040-9044 1 -s 192.168.11.179 -j ACCEPT #允许这个IP进入转发表

iptables -A CC9040-9044 -j DROP #所有9040-9044并且没有匹配到的数据包就直接丢弃了


查看iptables的规则
iptables -L -n   #一定要加-n 不然遇到forward链会反查dns,速度很慢



-A 添加到最后
-I INPUT 1 添加为第一个原来的第一个就变为第二个
-R INPTU 1 修改第一个的规则

-j ACCEPT  #自定义规则就算是accept了也会返回主链继续匹配
-j DROP
-j REFECT #丢弃以后再返回给目标一个数据包,一般用于企业内部,方便网管排查网络问题
-j RETURN  #return退出的是当前CHIAN,如果当前CHIAN是别的CHAIN调用的子CHIAN,那么返回到调用点下一条规则处开始执行(在子chain里面return和accept等价)#如果当前CHIAN不是子CHAIN,那么就以默认策略执行(如果默认是DROP那就是匹配到就DROP)



  1. 进入的数据包的匹配规则是:
  2. 先FORWARD,如果没有匹配,就进入INPUT,如果匹配了就进入PREROUTING

  3. 出去的包的匹配规则看源
  4. 如果是从PREROUTING进来的就先走PREROUTING,然后走OUTPUT。如果是从INPUT进来的就直接从OUTPUT出去


  5. 结论:FORWARD在PREROUTING之前
复制代码

上面这段话是我几年前得出的错误结论,TMD网上的一些教程真的害死人下面的百度百科的结论是正确的
https://baike.baidu.com/pic/IPTA ... f7de3fe9925bd317dcd















下面的这个是网上看的http://sookk8.blog.51cto.com/455855/321242/
防范DDOS攻击脚本
#防止SYN攻击 轻量级预防
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
#防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

#用Iptables抵御DDOS (参数与上相同)
iptables -A INPUT  -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
回复 支持 反对

使用道具 举报

1325

主题

2372

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10262
 楼主| 发表于 2017-6-12 01:46 | 显示全部楼层
谈一下如何利用iptables限制速度
http://www.chinaunix.net/old_jh/4/538785.html

根据MTU来限制 MTU的单位是byte

当然,用这种方法可以比tc更灵活,可以基于IP、PORT去进行控制,也可以针对INPUT/OUTPUT/FORWARD进行限制

这样唯一不好的是,不一定每个packet都是1500 Bytes,这样的限制只是一个大概,并非精确,一般速度均有所偏差
回复 支持 反对

使用道具 举报

1325

主题

2372

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10262
 楼主| 发表于 2017-6-17 20:22 | 显示全部楼层
一次由ip_conntrack跟踪连接库满导致的大量丢包现象排除~~
http://storysky.blog.51cto.com/628458/243835/

刚上线不久的一台服务器,晚上高峰时有很多客户反映连不上服务器,通过在本地测试发现有的连接可以连上但有的不行,赶紧连上服务器查看日志,发现大量如下错误...

kernel: ip_conntrack: table full, dropping packet.
kernel: printk: 1 messages suppressed.
kernel: ip_conntrack: table full, dropping packet.
kernel: printk: 2 messages suppressed.
kernel: ip_conntrack: table full, dropping packet.
kernel: printk: 1 messages suppressed.

ip_conntrack 这个东西是连接跟踪数据库(conntrack database),代表NAT机器跟踪连接的数目(不过只要打开iptables就会开始跟踪)如果这个东西满了结果可想而知
赶紧查看当前的值发现很快就能到2万多
wc -l /proc/net/ip_conntrack
23722 /proc/net/ip_conntrack

看看最大值限制
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
65536
访问稍大一点就会突破这个值

保留时间是多久?
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
432000
默认是5天,没必要这么久

先临时调大看看效果
echo 655350 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
echo 10800 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
改完后观察了一段时间,发现服务器连接正常,没有再发生类似情况

修改/etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_max = 655360
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 10800
sysctl -p 立即生效

OK问题排除,在上线前没有估计好服务器的访问量,从而忽略了对一些内核参数的修改。这点需要我以后多注意。
本文出自 “story的天空” 博客,请务必保留此出处http://storysky.blog.51cto.com/628458/243835
回复 支持 反对

使用道具 举报

1325

主题

2372

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10262
 楼主| 发表于 2018-5-13 16:03 | 显示全部楼层
/usr/libexec/iptables/iptables.init save

阿里云的centos保存命令是是iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

荣耀之链

GMT+8, 2025-6-18 02:58 , Processed in 0.014106 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表