前提知识
-
任何主机若要与非同网络中的主机通信,则必须将报文发送到默认网关;
-
对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
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.22iptables -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-eth0DEVICE="eth0"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=172.16.251.178NETMASK=255.255.0.0GATEWAY=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 1Djason.com. IN SOA dns.jason.com. admin.jason.com (2014032920 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimum@ NS dnsdns A 172.16.251.178www A 172.16.251.182# vi /var/named/jason.com.outer_net$TTL 1Djason.com. IN SOA dns.jason.com. admin.jason.com (2014032920 ; serial1D ; refresh1H ; retry1W ; expire3H ) ; minimum@ NS dnsdns A 172.16.251.178www 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-eth0DEVICE="eth0"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=172.16.251.236NETMASK=255.255.0.0GATEWAY=172.16.0.1# vi /etc/sysconfig/network-scripts/ifcfg-eth1DEVICE="eth1"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=3.3.3.1NETMASK=255.255.255.0DNS1=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-eth0DEVICE="eth0"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=172.16.251.176NETMASK=255.255.255.0GATEWAY=172.16.251.236DNS1=172.16.251.178# vi /etc/resolv.confnameserver 172.16.251.178 |
Outer Client配置
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# vi /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE="eth0"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=3.3.3.3NETMASK=255.255.255.0GATEWAY=3.3.3.1DNS1=3.3.3.1# vi /etc/resolv.confnameserver 3.3.3.1 |
DNS解析测试
HTTP访问测试
大功告成,哦也!