Metadata-Version: 2.1
Name: pycgnat
Version: 1.0.0
Summary: Python module for generating CGNAT rules using netmap
Home-page: https://github.com/williamabreu/py-cgnat
Author: William Abreu
Author-email: contato@williamabreu.net
License: MIT License
Keywords: netmap cgnat rfc6598 routeros
Platform: any
Classifier: Environment :: Console
Classifier: Intended Audience :: System Administrators
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: System :: Networking :: Firewalls
Classifier: Topic :: Utilities
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE

# py-cgnat

Python module for generating CGNAT rules using netmap

## Brief

This is a Python library and CLI program for generating firewall rules to deploy Carrier-Grade NAT, besides translating a given IP and port to its private address and vice versa. The methodology consists in building netmap rules at 1:32 public-private ratio, mapping a range of 2.000 ports for each client. Works for any netmask, since that follow the 1:32 ratio:

| Private prefix | Public prefix | N. of clients  |
| :------------: |:-------------:| :-------------:|
| ... | ... |  ... |
| /20 | /25 | 4096 |
| /21 | /26 | 2048 |
| /22 | /27 | 1024 |
| /23 | /28 |  512 |
| /24 | /29 |  256 |
| /25 | /30 |  128 |
| /26 | /31 |   64 |
| /27 | /32 |   32 |

-----------------

## Supported Platforms

- MikroTik RouterOS

## Requirements

- Python 3.7+

-----------------

## How to install it?

Installation can just being done with ```pip```:
```bash
pip install pycgnat
```

## How to use it?

### 1. Command Line Interface

For **generating** the rules, you can print it in console or save it to a file:
```bash
pycgnat 100.64.0.0/20 203.0.113.0/25 gen routeros filename.rsc
pycgnat 100.64.0.0/20 203.0.113.0/25 gen routeros
```

For **translating** a private IP to its public one, use the ```direct``` option:
```bash
pycgnat 100.64.0.0/20 203.0.113.0/25 trans --direct 100.64.2.15
pycgnat 100.64.0.0/20 203.0.113.0/25 trans -d 100.64.2.15
```

For **translatig** a public IP and port to its private IP correspondent, use the ```reverse``` option:
```bash
pycgnat 100.64.0.0/20 203.0.113.0/25 trans --reverse 203.0.113.20:13578
pycgnat 100.64.0.0/20 203.0.113.0/25 trans -r 203.0.113.20:13578
```

The CLI includes useful **help** command (supported by ```argparse``` framework), so just type:
```bash
pycgnat --help
pycgnat -h
```

### 2. Python library

You can use the functionalities directly in Python lang. Just **import** the wanted module to your program:
```python
from pycgnat.translator.reverse import cgnat_reverse

dic = cgnat_reverse(privnet, pubnet, IPv4Address('203.0.113.20'), 13578)
print(dic['private_ip'])
```

The full ```pycgnat```'s documentation is written in the source-code.

## Future works

- Add support for other platfoms (I'm using MikroTik for while, so this is the reason for only supporting it at first version).

## Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

## License
[MIT](https://choosealicense.com/licenses/mit/)


