双网卡:
路由机
eth0:114.114.114.114(公网ip) eth1:192.168.1.1(内网ip)
pc1
eth0:192.168.1.2(内网ip) eth1(拨号ip)
pc2
eth0:192.168.1.3(内网ip) eth1(拨号ip)
1.配置路由机网卡信息
vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eth1 UUID=85290fec-9166-4a02-90c3-711bf55d1ae2 DEVICE=eth1 ONBOOT=yes HWADDR=00:0c:29:27:64:b8 IPADDR=192.168.1.1
此网卡只配置IP,不配置网关
2.配置pc1网卡
vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eth0 UUID=d79660a0-4225-4f0e-96b1-4d61fc05a17c DEVICE=eth0 ONBOOT=yes HWADDR=00:0c:29:97:6a:4b IPADDR=192.168.1.2 NETMASK=255.255.255.0 GATEWAY=192.168.1.1
pc2配置与pc1类似,保证2台pc机与网关能互相ping通
此时pc1 pc2还不能访问外网,需要路由机做iptables规则
1.查看机器的转发功能时候打开
cat /proc/sys/net/ipv4/ip_forward
若返回1则表示已经打开
返回0则:
echo "1" > /proc/sys/net/ipv4/ip_forward
此规则及时生效,但重启后就失效了,需要在配置文件里添加
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 #每个消息队列的最大字节限制 kernel.msgmax = 65536 #每个消息的最大size kernel.shmmax = 68719476736 #内核参数定义单个共享内存段的最大值 kernel.shmall = 4294967296 #控制共享内存页数
iptables做nat转发规则
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 114.114.114.114
将192.168.1.0网段转发至路由机的公网IP(静态)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
将所有网段转发至路由机公网ip(动态)
现在2台pc机就能访问外网了,如果不能访问则检查下dns配置
内部端口映射
iptables -t nat -A PREROUTING -d 114.114.114.114/32 -p tcp -m tcp --dport 26688 -j DNAT --to-destination 192.168.1.2:22
把192.168.1.2的22端口映射到外部26688端口
找台外网机器访问下114.114.114.114的26688端口,就可以直接进入pc1
删除规则:把-A改为-D
iptables -t nat -D PREROUTING -d 114.114.114.114/32 -p tcp -m tcp --dport 26688 -j DNAT --to-destination 192.168.1.2:22
映射失效
最后保存下iptables配置
/usr/sbin/iptables-save
但是当pc1拨号时也会导致端口映射失效,类似双网卡默认对外路由的问题,通过路由机访问的IP会默认走拨号端口,需要做下ip伪装,将通过访问内网的公网地址伪装成网关地址从而实现内网通信
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
单网卡:
下面以CentOS为例,说明单网卡NAT代理的配置。
点击(此处)折叠或打开
点击(此处)折叠或打开
开启 NAT 转发之后,只要本机可以上网,不论是单网卡还是多网卡,局域网内的其他机器可以将默认网关设置为已开启 NAT 转发的服务器 IP ,即可实现上网。
# 开启 NAT 转发
firewall-cmd --permanent --zone=public --add-masquerade
# 开放 DNS 使用的 53 端口,UDP
# 必须,否则其他机器无法进行域名解析
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 检查是否允许 NAT 转发
firewall-cmd --query-masquerade
# 禁止防火墙 NAT 转发
firewall-cmd --remove-masquerade
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。
# 将80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1
# 将80端口的流量转发至192.168.0.1的8080端口
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080
控制端口/服务:
firewall-cmd --add-service=mysql # 开放mysql端口
firewall-cmd --remove-service=http # 阻止http端口
firewall-cmd --list-services # 查看开放的服务
firewall-cmd --add-port=3306/tcp # 开放通过tcp访问3306
firewall-cmd --remove-port=80tcp # 阻止通过tcp访问3306
firewall-cmd --add-port=233/udp # 开放通过udp访问233
firewall-cmd --list-ports # 查看开放的端口
是否开启IP伪装:
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --add-masquerade # 允许防火墙伪装IP
firewall-cmd --remove-masquerade# 禁止防火墙伪装IP
端口转发:
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.0.1 # 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口