最近研究了一下Linux平台的网络IP转发和端口映射方面的东西,作了一点笔记。在学习时,查了很多资料,有的写的不是很清楚明白,而自己对这方面了解又不多,花的时间还是不少的。
一、网络转发
环境:某设备,双网卡,Fedora 18系统(即Linux路由器,IP都是网关),
网络环境:A网段为172.17.X.X,B网段为100.100.100.X。
目的:直接使用IP地址的形式来访问到跨网段的IP。比如,在A网段的172.17.17.168*问到100.100.100.101。
配置:将Linux配置成为一台路由器,即可实现跨网段访问。
1、“路由器”的配置
在该设备上配置IP地址、网关(即作为路由器的机器)。
第一个网口连接到A网,地址如下(连此网口的设备网关为下面的IP):
ifconfig em1 172.17.17.188 netmask 255.255.0.0
第二个网口连接到B网,地址如下(连此网口的设备网关为下面的IP):
ifconfig p1p1 100.100.100.254 netmask 255.255.255.0
route add -net 100.100.100.0/24 gw 100.100.100.254 dev em1
route add -net 172.17.0.0/16 gw 172.17.17.188 dev p1p1
使能转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables转发:
iptables -A FORWARD -p ip -s 100.100.100.0/24 -j ACCEPT
保存:
service iptables save
重启
service iptables restart
2、客户端配置
B网络为其它的Linux设备,其IP配置为100.100.100.X网络,网关IP为100.100.100.254。路由信息如下:
root@latelee:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
255.255.255.255 * 255.255.255.255 UH 0 0 0 eth0
100.100.100.0 * 255.255.255.0 U 0 0 0 eth0
100.100.101.0 100.100.100.254 255.255.255.0 UG 0 0 0 eth0
default 100.100.100.254 0.0.0.0 UG 0 0 0 eth0
A网络有一台虚拟机,其IP配置为172.17.X.X网络,网关为172.17.17.188。
如下:
latelee@ubuntu:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:cd:22:76
inet addr:172.17.17.168 Bcast:172.17.17.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fecd:2276/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:290610 errors:0 dropped:0 overruns:0 frame:0
TX packets:1600 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:25810466 (25.8 MB) TX bytes:173097 (173.0 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:339 errors:0 dropped:0 overruns:0 frame:0
TX packets:339 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:31654 (31.6 KB) TX bytes:31654 (31.6 KB)
在A网络的虚拟机上测试B网络的连通性:
latelee@ubuntu:~$ ping 100.100.100.101
PING 100.100.100.101 (100.100.100.101) 56(84) bytes of data.
64 bytes from 100.100.100.101: icmp_req=1 ttl=128 time=2.16 ms
64 bytes from 100.100.100.101: icmp_req=2 ttl=128 time=2.41 ms
^C
--- 100.100.100.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 2.165/2.289/2.414/0.133 ms
可以ping通,说明已经完成了路由功能。至于telnet、ftp、web界面,只要系统支持,当然也是正常的。
3、其它
fedora不知从什么版本开始,把经典的网卡设备eth0改名了(不专门使用fedora,没去研究,但ubuntu是没有变化的),从我的测试情况看,第一个(eth0)网络设备叫em1,第二个设备叫p1p1。
起初测试时,并不能实现跨网段访问,后来发现,是因为我的笔记本电脑同时开了wifi连接公网(为了方便上网、找资料)。一旦开了wifi就不能访问了。可能是同时有2个网关,ping的时候跑到另外一个去了。不是网络专业的,没研究那么深。
二、端口映射
环境:某设备,双网卡,ubuntu 14.04系统(要实现映射功能),第一个网卡连公网,IP为172.17.17.188。
网络环境:A网段是公网,172.17.X.X,B网段为内网,IP段:100.100.100.X。
目的:实现端口映射。比如,在A网段的172.17.17.168虚拟机*问上面提到的设备(称“转发机器”)172.17.17.188的8080端口,则可以直接访问到IP为100.100.100.101的80端口。
查看Linux转发是否使能:
cat /proc/sys/net/ipv4/ip_forward
如显示0,则不使能,需要使能
echo 1 > /proc/sys/net/ipv4/ip_forward
上面命令只是临时生效,要永久生效,在ubuntu系统修改/etc/sysctl.conf文件,把ip_forward的注释打开就行了
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
将转发机器8080映射到设备的80端口
iptables -t nat -A PREROUTING -d 172.17.17.188 -p tcp --dport 8080 -j DNAT --to-destination 100.100.100.101:80
iptables -t nat -A POSTROUTING -d 100.100.100.101 -p tcp --dport 80 -j SNAT --to 172.17.17.188
iptables -A FORWARD -o eth0 -d 100.100.100.101 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 100.100.100.101 -p tcp --sport 80 -j ACCEPT
(
注,只用下面2条命令好像也可以:
iptables -t nat -A PREROUTING -m tcp -p tcp -d 172.17.17.188 --dport 8022 -j DNAT --to 100.100.100.101:80
iptables -A FORWARD -m tcp -p tcp -d 100.100.100.101 --dport 80 -j ACCEPT
)
保存iptables配置(注:好像不要这步也行,网上说这步是保存配置,重启时生效,但我试了是不生效的)
iptables-save
查看效果
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere 100.100.100.101 tcp dpt:http
ACCEPT tcp -- 100.100.100.101 anywhere tcp spt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
如果要清空iptables,可以使用下面的几个命令:
iptables -F
iptables -X
iptables -Z
上面提到的是web端口,测试时在浏览器中输入转发机器的IP地址(而不是最终的目的机器的IP地址)和端口即可访问。如果是映射telnet的23端口,则可以用telnet命令去连接设备。
李迟,记于2014年10月20日中午