博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NAT 相關
阅读量:4286 次
发布时间:2019-05-27

本文共 6594 字,大约阅读时间需要 21 分钟。

轉載自 

6. 

So now we know how to select the packets we want to mangle. To complete our rule, we need to tell the kernel exactly what we want it to do to the packets.

6.1 

You want to do Source NAT; change the source address of connections to something different. This is done in the POSTROUTING chain, just before it is finally sent out; this is an important detail, since it means that anything else on the Linux box itself (routing, packet filtering) will see the packet unchanged. It also means that the `-o' (outgoing interface) option can be used.

Source NAT is specified using `-j SNAT', and the `--to-source' option specifies an IP address, a range of IP addresses, and an optional port or range of ports (for UDP and TCP protocols only).

 

## Change source addresses to 1.2.3.4.# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4## Change source addresses to 1.2.3.4, 1.2.3.5 or 1.2.3.6# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6## Change source addresses to 1.2.3.4, ports 1-1023# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

 

Masquerading

There is a specialized case of Source NAT called masquerading: it should only be used for dynamically-assigned IP addresses, such as standard dialups (for static IP addresses, use SNAT above).

You don't need to put in the source address explicitly with masquerading: it will use the source address of the interface the packet is going out from. But more importantly, if the link goes down, the connections (which are now lost anyway) are forgotten, meaning fewer glitches when connection comes back up with a new IP address.

 

## Masquerade everything out ppp0.# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

 

6.2 

This is done in the PREROUTING chain, just as the packet comes in; this means that anything else on the Linux box itself (routing, packet filtering) will see the packet going to its `real' destination. It also means that the `-i' (incoming interface) option can be used.

Destination NAT is specified using `-j DNAT', and the `--to-destination' option specifies an IP address, a range of IP addresses, and an optional port or range of ports (for UDP and TCP protocols only).

 

## Change destination addresses to 5.6.7.8# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8## Change destination addresses to 5.6.7.8, 5.6.7.9 or 5.6.7.10.# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10## Change destination addresses of web traffic to 5.6.7.8, port 8080.# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \        -j DNAT --to 5.6.7.8:8080

 

Redirection

There is a specialized case of Destination NAT called redirection: it is a simple convenience which is exactly equivalent to doing DNAT to the address of the incoming interface.

 

## Send incoming port-80 web traffic to our squid (transparent) proxy# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \        -j REDIRECT --to-port 3128

 

Note that squid needs to be configured to know it's a transparent proxy!

6.3 

There are some subtleties to NAT which most people will never have to deal with. They are documented here for the curious.

Selection Of Multiple Addresses in a Range

If a range of IP addresses is given, the IP address to use is chosen based on the least currently used IP for connections the machine knows about. This gives primitive load-balancing.

Creating Null NAT Mappings

You can use the `-j ACCEPT' target to let a connection through without any NAT taking place.

Standard NAT Behavior

The default behavior is to alter the connection as little as possible, within the constraints of the rule given by the user. This means we won't remap ports unless we have to.

Implicit Source Port Mapping

Even when no NAT is requested for a connection, source port translation may occur implicitly, if another connection has been mapped over the new one. Consider the case of masquerading, which is rather common:

 

  1. A web connection is established by a box 192.1.1.1 from port 1024 to www.netscape.com port 80.
  2. This is masqueraded by the masquerading box to use its source IP address (1.2.3.4).
  3. The masquerading box tries to make a web connection to www.netscape.com port 80 from 1.2.3.4 (its external interface address) port 1024.
  4. The NAT code will alter the source port of the second connection to 1025, so that the two don't clash.

 

When this implicit source mapping occurs, ports are divided into three classes:

  • Ports below 512
  • Ports between 512 and 1023
  • Ports 1024 and above.

 

A port will never be implicitly mapped into a different class.

What Happens When NAT Fails

If there is no way to uniquely map a connection as the user requests, it will be dropped. This also applies to packets which could not be classified as part of any connection, because they are malformed, or the box is out of memory, etc.

Multiple Mappings, Overlap and Clashes

You can have NAT rules which map packets onto the same range; the NAT code is clever enough to avoid clashes. Hence having two rules which map the source address 192.168.1.1 and 192.168.1.2 respectively onto 1.2.3.4 is fine.

Furthermore, you can map over real, used IP addresses, as long as those addresses pass through the mapping box as well. So if you have an assigned network (1.2.3.0/24), but have one internal network using those addresses and one using the Private Internet Addresses 192.168.1.0/24, you can simply NAT the 192.168.1.0/24 source addresses onto the 1.2.3.0 network, without fear of clashing:

 

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \        -j SNAT --to 1.2.3.0/24

 

The same logic applies to addresses used by the NAT box itself: this is how masquerading works (by sharing the interface address between masqueraded packets and `real' packets coming from the box itself).

Moreover, you can map the same packets onto many different targets, and they will be shared. For example, if you don't want to map anything over 1.2.3.5, you could do:

 

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \        -j SNAT --to 1.2.3.0-1.2.3.4 --to 1.2.3.6-1.2.3.254

 

Altering the Destination of Locally-Generated Connections

The NAT code allows you to insert DNAT rules in the OUTPUT chain, but this is not fully supported in 2.4 (it can be, but it requires a new configuration option, some testing, and a fair bit of coding, so unless someone contracts Rusty to write it, I wouldn't expect it soon).

The current limitation is that you can only change the destination to the local machine (e.g. `j DNAT --to 127.0.0.1'), not to any other machine, otherwise the replies won't be translated correctly.

转载地址:http://jzpgi.baihongyu.com/

你可能感兴趣的文章
把项目从Python2.x移植到Python3.x的经验总结
查看>>
如何在python下安装xgboost
查看>>
xgboost特征选择
查看>>
kaggle数据挖掘竞赛初步--Titanic<数据变换>,kaggle--titanic
查看>>
XGBoost-Python完全调参指南-参数解释篇
查看>>
【scikit-learn】scikit-learn的线性回归模型
查看>>
广告点击率预测 [离线部分]
查看>>
广告点击率预估中的特征选择
查看>>
数据科学入门,使用 xgboost 初试 kaggle
查看>>
sklearn的train_test_split
查看>>
xgboost入门与实战(实战调参篇) 标签: xgboostpythonkaggle机器学习
查看>>
[scikit-learn] 特征二值化编码函数的一些坑
查看>>
使用sklearn优雅地进行数据挖掘
查看>>
Python SciPy Sparse模块学习笔记
查看>>
Python的字符串
查看>>
Kaggle实战(二)
查看>>
特殊矩阵(8):Vandermonde 矩阵
查看>>
机器学习简易入门(四)- logistic回归
查看>>
python解决字典中的值是列表问题的方法
查看>>
Python:操作dict时避免出现KeyError的几种方法
查看>>