iptables/netfilter网络防火墙实现及实战分析

前提知识

任何主机若要与非同网络中的主机通信,则必须将报文发送到默认网关;

对Linux而言,IP地址是属于主机(内核中)的,不属于网卡,只要属于当前主机的IP地址间,都可直接响应,不称为转发

私有地址在路由器上是不允许被路由的

防火墙的类型与作用的链

主机防火墙:一般使用INPUT,OUTPUT链来过滤进入和发出的报文

网络防火墙:一般使用PREROUTING,FORWARD,POSTROUTING链来转发经过的报文

不同网络间主机通信的方式

路由:

对于Linux主机,设定/proc/sys/net/ipv4/ip_forward的值为1,即开启了路由功能,可以作为模拟路由器使用

注:但真实的路由器还应该存在生成路由表的机制,一般是基于路由协议(如RIP2,OSPF)动态学习的,在此不作讨论

NAT:

工作于网络层和传输层,也可分为静态NAT和动态NAT

Basic NAT:静态NAT;NAT服务器上有一个外网地址池,内网连接时直接分配一个外网IP使用,很不灵活

NAPT:动态NAT,Network Address Port Translation,即网络端口地址转换,也可分为SNAT和DNAT

SNAT:源地址转换;适用于内网主机访问互联网,原理图如下:

DNAT:目标地址转换;适用于让互联网主机访问本地内网中的某主机上的服务,原理图如下:

iptables/netfilter基于SNAT和DNAT原理实现报文转发

-j SNAT --to-source SIP

规则添加:在POSTROUTING链上

-j MASQUERADE

用于外网IP是ADSL拨号上网时生成的动态IP,MASQUERADE模式能自行查找能访问互联网的外网IP,并完成SNAT

-j DNAT --to-destination DIP[:Port]

支持端口映射

规则添加:在PREROUTING链上

实例:

1

2

# 将外网对172.16.100.7:22022的访问转发至内网的192.168.20.12.22

iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 22022 -j DNAT --to-destination 192.168.20.12.22

iptables/netfilter实战解析

需求分析

架构设计

配置部署

DNS Server配置

网络配置

1

2

3

4

5

6

7

8

9

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"

BOOTPROTO="static"

NM_CONTROLLED="no"

ONBOOT="yes"

TYPE="Ethernet"

IPADDR=172.16.251.178

NETMASK=255.255.0.0

GATEWAY=172.16.251.236

DNS主配置文件:/etc/named.conf

1

2

3

4

5

6

7

8

# named.conf中需修改的部分

listen-on port 53 { 127.0.0.1; 172.16.251.178;};

allow-query     { any; };

recursion no;

#zone "." IN {

#   type hint;

#   file "named.ca";

#};

DNS辅助配置文件:/etc/named.rfc1912.zones

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

acl inter_net {

172.16.251.0/24;

};

view inter_net {

match-clients { inter_net; };

zone "." IN {

type hint;

file "named.ca";

};

zone "jason.com" IN {

type master;

file "jason.com.inter_net";

};

};

view outer_net {

match-clients { any; };

zone "jason.com" IN {

type master;

file "jason.com.outer_net";

};

};

区域数据文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# vi /var/named/jason.com.inter_net

$TTL 1D

jason.com. IN SOA dns.jason.com. admin.jason.com (

2014032920 ; serial

1D ; refresh

1H ; retry

1W ; expire

3H ) ; minimum

@ NS dns

dns A 172.16.251.178

www A 172.16.251.182

# vi /var/named/jason.com.outer_net

$TTL 1D

jason.com. IN SOA dns.jason.com. admin.jason.com (

2014032920 ; serial

1D ; refresh

1H ; retry

1W ; expire

3H ) ; minimum

@ NS dns

dns A 172.16.251.178

www A 3.3.3.1

启动named服务

1

2

3

chown root.named jason.com.inter_net

chown root.named jason.com.outer_net

service named restart

Web Server配置

1

2

3

4

配置一个虚拟主机,监听端口8080

在DocumentRoot目录下创建一简单的测试文件test.html,内容随意,如

“Hello Mageedu”

启动httpd服务即可

Firewall配置

网络配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"

BOOTPROTO="static"

NM_CONTROLLED="no"

ONBOOT="yes"

TYPE="Ethernet"

IPADDR=172.16.251.236

NETMASK=255.255.0.0

GATEWAY=172.16.0.1

# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE="eth1"

BOOTPROTO="static"

NM_CONTROLLED="no"

ONBOOT="yes"

TYPE="Ethernet"

IPADDR=3.3.3.1

NETMASK=255.255.255.0

DNS1=3.3.3.1

注:因为3.3.3.1和3.3.3.3都是模拟的外网IP地址,故对应的网卡应处于同一信道内,且不能和内网的通信信道一致,故在用虚拟机测试时,可将对应内网IP的网卡的网络方式改为桥接,而对应外网IP的网卡的网络方式改为自定义,如vmnet2

添加iptables规则

1

2

iptables -t nat -A PREROUTING -d 3.3.3.1/32 -p udp --dport 53 -j DNAT --to-destination 172.16.251.178

iptables -t nat -A PREROUTING -d 3.3.3.1/32 -p tcp --dport 8080 -j DNAT --to-destination 172.16.251.182

Inter Client配置

1

2

3

4

5

6

7

8

9

10

11

12

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"

BOOTPROTO="static"

NM_CONTROLLED="no"

ONBOOT="yes"

TYPE="Ethernet"

IPADDR=172.16.251.176

NETMASK=255.255.255.0

GATEWAY=172.16.251.236

DNS1=172.16.251.178

# vi /etc/resolv.conf

nameserver 172.16.251.178

Outer Client配置

1

2

3

4

5

6

7

8

9

10

11

12

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"

BOOTPROTO="static"

NM_CONTROLLED="no"

ONBOOT="yes"

TYPE="Ethernet"

IPADDR=3.3.3.3

NETMASK=255.255.255.0

GATEWAY=3.3.3.1

DNS1=3.3.3.1

# vi /etc/resolv.conf

nameserver 3.3.3.1

DNS解析测试

HTTP访问测试

大功告成,哦也!

本文转自 xxrenzhe11 51CTO博客,原文链接:http://blog.51cto.com/xxrenzhe/1386677,如需转载请自行联系原作者

上一篇:quidway secpath 下的防火墙配置
下一篇:自动添加端口添加至Windows防火墙脚本