James Bryant

【转】浅谈iptables 入站 出站以及NAT实例

0
阅读(1387)

转自:http://www.cnblogs.com/harlanzhang/p/6188952.html
iptbales默认ACCEPT策略,也称通策略,这种情况下可以做拦截策略,还有种叫堵策略,然后开放通的规则。(我偏向堵策略,自己需要开放什么在开,以下例子也是在此基础上的)

iptables 一些参数名称:

四表五链:fifter表、NAT表、Mangle表、Raw表 。 INPUT链、OUTPUT链、FORWARD链、PREROUTING链、POSTROUTING链

  INPUT链 – 处理来自外部的数据。
  OUTPUT链 – 处理向外发送的数据。
  FORWARD链 – 将数据转发到本机的其他网卡设备上。 

  PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。(NAT表需要开启linux路由 net.ipv4.ip_forward = 1)
  POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
  OUTPUT链 – 处理本机产生的数据包。

iptables 新建时情况所有记录

iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X

开放22 SSH端口

iptables -A INPUT -p tcp -p tcp --dport 22 -j ACCEPT (允许外部访问本机的22端口)

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (有进就有出,IP包是来回的)

例如一条比较完整的SSH端口限制:(意思为:从eth0进来的SSH访问,除了公司192.168.16.0/24不限制,其他的地址都限制为每个ip最多5个SSH连接,且只为NEW和ESTABLISHED的连接,其他的都拒接)

iptables -A INPUT -i eth0 -s ! 192.168.16.0/24 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -m connlimit --connlimit-above 5 -j REJECT

----

iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT (允许本机去ssh其他的服务器的22端口)

iptables -A INPUT -p tcp --sport 22 -j ACCEPT

设置默认规则为DROP

iptables -P INPUT DROP

iptables -P OUTPUT DROP

此时占时不要service iptables save,先用客户端ssh连接一下服务器,看看可以连接吗?如果不行最起码还可以重启,这样规则没保存重启是不生效,如果保存了发现不通就麻烦一些了!

当发现可以SSH的时候,我们就可以继续下面的步骤了!

打开回环地址,为了本地访问,如本地访问数据库之类

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

打开服务器的ping功能,我觉得有必要打开,可以检测服务器状况

iptables -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT (此2条规则是允许本机ping外网的ip,不包括域名,其中8是icmp的请求,0是icmp的响应)

iptables -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

----

iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT (此2条规则是允许外部ping本机)

iptables -A OUTPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT

允许内部ping外部的域名

iptables -A INPUT -p udp --sport 53 -j ACCEPT

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

允许外部访问本机的80服务,且只允许新连接的和已经连接的会话(状态检测)

iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

允许外部访问我本地多个端口 如 8080,8081,8082,且只允许是新连接,已经连接的和已经连接的在延伸出新连接的会话

iptables -A INPUT -p tcp -m multiport --dport 8080,8081,8082 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp -m multiport --sport 8080,8081,8082 -m state --state ESTABLISHED -j ACCEPT

允许外部访问本机81端口,且本机初始只允许有200个连接,超过了此数量,然后每秒新增加2个连接,如果访问超过此限制则拒接 (此方式可以限制一些攻击)

iptables -A INPUT -p tcp --dport 81 -m limit --limit 2/s --limit-burst 200 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 81 -j ACCEPT

限制除用户192.168.16.99以外的IP连接数为50 (相当于可以给自己开特权^_^)

iptables -A FORWARD -p tcp -s !192.168.16.99 -m connlimit --connlimit-above 50 -j REJECT

TCP匹配扩展协议--tcp-flags

iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK,RST SYN (表示 SYN,FIN,ACK,RST的标识都检查,但只匹配SYN标识)

iptables -A INPUT -p tcp --syn (如果这是为了匹配SYN标识位也可以写成这样,选项—syn相当于”--tcp-flags SYN,RST,ACK SYN”的简写。)

实例:

//nmap-xmas

iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP (检查所以的标识位,匹配到FIN URG PSH的丢弃)

//nmap-push

iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP (检查所以的标识位,匹配到SYN RST ACK FIN URG的丢弃)

// Null

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP (检查所以的标识位,没标志位的丢弃)

iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP(检查 SYN,RST标识位,匹配到 SYN,RST的丢弃,SYN是建立连接,RST是重置连接,所以这样的包是有问题的)

iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP (检查 SYN,FIN标识位,匹配到 SYN,FIN的丢弃,SYN是建立连接,FIN是结束连接,所以这样的包是有问题的)

iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

SNAT 和 DNAT

SNAT:

假如我要让公司192.168.10.0/24段的地址都通过linux服务器的eth0 :123.123.123.123上网

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 123.123.123.123

DNAT

GATEWAY eth0:123.123.123.123 eth1:192.168.10.1 内网主机:192.168.10.10

要使访问123.123.123.123的80 自动跳到192.168.10.10的80端口上

iptables -t nat -A PREROUTING -p tcp -d 123.123.123.123 --dport 80 -j DNAT --to-destination 192.168.10.10:80

iptables -t nat -A POSTROUTING -p tcp -d 192.168.10.10 --dport 80 -j SNAT --to-source 192.168.10.1 (内网之间进行nat才加上)

第一条:将外部数据包的目的地址改到内网主机的指定端口
第二条:转发前,将外部源地址改为内网本地地址

Baidu
map