### NAT 和代理的概念
#### 1. NAT (Network Address Translation)
NAT是一种用于在不同地址空间之间进行地址转换的技术。其核心作用在于允许内网设备通过一个公网IP地址与外部网络通信,同时隐藏内网设备的真实IP地址。
- **静态NAT**:一对一映射关系,将内部专用IP地址永久映射到公共IP地址。
- **动态NAT**:一对多映射关系,在有限数量的公共IP地址池中分配给多个内部IP地址使用。
- **端口地址转换(NAPT)**:允许多个内部主机共享单个公共IP地址,通过不同的端口号区分各个连接请求。
#### 2. 代理服务器
代理服务器作为客户端和目标服务器之间的中介,能够代表客户端发起请求并返回响应数据。它可以分为正向代理和反向代理两种主要形式:
- **正向代理**:为客户端提供访问互联网的服务,通常用来绕过某些限制或者匿名上网。
- 客户端配置指向代理服务器,由代理服务器代替客户端发出请求。
- **反向代理**:位于服务器前端,对外部用户提供统一入口,保护后端真实服务器不被直接暴露于外网环境之中。
- 外界只看到反向代理的存在,实际业务逻辑处理交给了背后的若干台服务器完成。
---
### 配置方法
#### NAT 配置示例(基于 Linux)
以下是利用 `iptables` 实现基本 NAT 功能的一个例子:
```bash
# 开启 IP 转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 设置 SNAT(源地址转换),使内网机器可以通过指定的公网 IP 访问外界
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# 如果需要 DNAT(目的地址转换),可以这样设置
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.0.10:8080
```
以上命令实现了简单的 NAT 配置,其中 `-s` 参数指定了内网子网范围,`MASQUERADE` 则让出口流量伪装成 NAT 设备自身的公网 IP 地址。
#### 正向代理配置示例(Squid)
安装 Squid 并编辑 `/etc/squid/squid.conf` 文件来定义一些必要的参数:
```conf
http_port 3128 # 指定监听端口
visible_hostname proxy.example.com # 可见名称
cache_mgr admin@example.com # 管理员邮箱
acl localnet src 192.168.0.0/16 # ACL 来限定哪些 IP 可以使用此代理
http_access allow localnet # 允许本地网络内的用户访问
http_access deny all # 默认拒绝其他所有人
```
重启服务即可生效:
```bash
systemctl restart squid
```
对于反向代理而言,则常采用 Nginx 或 Apache HTTP Server 进行搭建。这里给出一段典型的 Nginx 配置片段:
```nginx
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server; # 将请求转发至后台服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
---
### 总结比较
| 特性 | NAT | 代理服务器 |
|-------------------|------------------------------------|-------------------------------------|
| 工作层次 | 网络层 | 应用层 |
| 主要用途 | 解决 IP 地址不足 | 提供安全性和性能优化等功能 |
| 是否改变原始数据包中的内容 | 是 | 否 |
| 常见实现方式 | iptables | Squid、Nginx |
尽管两者都能起到一定程度上的隔离效果,但从本质上讲它们服务于完全不一样的需求场景。