diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21fb2a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/clat.8 diff --git a/Makefile b/Makefile index bdca32e..0c2f68d 100644 --- a/Makefile +++ b/Makefile @@ -1,29 +1,66 @@ +# clatd Makefile +# +# Copyright (C) 2025 Daniel Gröber +# +# SPDX-License-Identifier: MIT + DESTDIR= PREFIX=/usr SYSCONFDIR=/etc +BINDIR = $(PREFIX)/sbin -APT_GET:=$(shell which apt-get) -DNF_OR_YUM:=$(shell which dnf || which yum) -SYSTEMCTL:=$(shell which systemctl) -TAYGA:=$(shell which tayga) +SYSTEMCTL = systemctl -all: +CLATD = $(DESTDIR)$(BINDIR)/clatd +MANPAGE = $(DESTDIR)$(PREFIX)/share/man/man8/clatd.8 +SYSTEMD_SYSSERVICEDIR = $(DESTDIR)$(SYSCONFDIR)/systemd/system +NM_DISPATCHER = $(DESTDIR)$(SYSCONFDIR)/NetworkManager/dispatcher.d/50-clatd + +Q = @ + +all: clatd.8 +.ONESHELL: + +clatd.8: clatd.pod + pod2man \ + --name clatd \ + --center "clatd - CLAT, SIIT-DC and IPv6-only with many XLAT engines" \ + --section 8 \ + $< $@ + +clean: + -rm clatd.8 + +start: install + $(SYSTEMCTL) --system daemon-reload + $(SYSTEMCTL) --system -f --now enable clatd.service + +stop: + $(SYSTEMCTL) --system disable --now clatd.service + +uninstall: stop + -rm $(SYSTEMD_SYSSERVICE)/clatd.service \ + $(SYSTEMD_SYSSERVICE)/clatd@.service \ + $(NM_DISPATCHER) install: - # Install the main script - install -D -m0755 clatd $(DESTDIR)$(PREFIX)/sbin/clatd - # Install manual page if pod2man is installed - pod2man --name clatd --center "clatd - a CLAT implementation for Linux" --section 8 README.pod $(DESTDIR)$(PREFIX)/share/man/man8/clatd.8 && gzip -f9 $(DESTDIR)$(PREFIX)/share/man/man8/clatd.8 || echo "pod2man is required to generate manual page" - # Install systemd service file if applicable for this system - if test -x "$(SYSTEMCTL)" && test -d "$(DESTDIR)$(SYSCONFDIR)/systemd/system"; then install -m0644 scripts/clatd.systemd $(DESTDIR)$(SYSCONFDIR)/systemd/system/clatd.service && $(SYSTEMCTL) daemon-reload; fi - if test -e "$(DESTDIR)$(SYSCONFDIR)/systemd/system/clatd.service" && test ! -e "$(DESTDIR)$(SYSCONFDIR)/systemd/system/multi-user.target.wants/clatd.service"; then $(SYSTEMCTL) enable clatd.service; fi - # Install NetworkManager dispatcher script if applicable - if test -d $(DESTDIR)$(SYSCONFDIR)/NetworkManager/dispatcher.d; then install -m0755 scripts/clatd.networkmanager $(DESTDIR)$(SYSCONFDIR)/NetworkManager/dispatcher.d/50-clatd; fi + install -D -m0755 clatd $(CLATD) + install -D -m0644 clatd.8 $(MANPAGE) + install -D -m0644 scripts/*.service $(SYSTEMD_SYSSERVICEDIR)/ + install -D -m0755 scripts/clatd.networkmanager $(NM_DISPATCHER) + +DEB_PACKAGES = \ + perl libnet-ip-perl libnet-dns-perl libjson-perl \ + iproute2 nftables tayga + +RPM_PACKAGES = \ + perl perl-IPC-Cmd perl-Net-IP perl-Net-DNS perl-File-Temp perl-JSON \ + iproute nftables installdeps: - # .deb/apt-get based distros - if test -x "$(APT_GET)"; then $(APT_GET) -y install perl-base perl-modules libnet-ip-perl libnet-dns-perl libjson-perl iproute2 nftables tayga; fi - # .rpm/DNF/YUM-based distros - if test -x "$(DNF_OR_YUM)"; then $(DNF_OR_YUM) -y install perl perl-IPC-Cmd perl-Net-IP perl-Net-DNS perl-File-Temp perl-JSON iproute nftables; fi - # If necessary, try to install the TAYGA .rpm using dnf/yum. It is unfortunately not available in all .rpm based distros (in particular CentOS/RHEL). - if test -x "$(DNF_OR_YUM)" && test ! -x "$(TAYGA)"; then $(DNF_OR_YUM) -y install tayga || echo "ERROR: Failed to install TAYGA using dnf/yum, the package is probably not included in your distro. Try enabling the EPEL repo and try again, or install TAYGA directly from source."; exit 1; fi + $(Q)prog_exists () { command -v $$@ >/dev/null 2>&1; } + { PKGS='$(DEB_PACKAGES)'; PKG=apt; prog_exists $$PKG; } || \ + { PKGS='$(RPM_PACKAGES)'; PKG=dnf; prog_exists $$PKG; } || \ + { PKGS='$(RPM_PACKAGES)'; PKG=yum; prog_exists $$PKG; } || \ + { PKG=false; echo 'ERROR: Failed to detect system package manager.'>&2;} + $(DRY) $$PKG install -y $$PKGS diff --git a/README.md b/README.md new file mode 100644 index 0000000..e8f07f7 --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# clatd - CLAT and SIIT-DC Edge Relay for Linux + +**clatd** implements the CLAT component of the 464XLAT network architecture +specified in *RFC 6877*. It allows an IPv6-only host to have IPv4 connectivity +that is translated to IPv6 before being routed to an upstream PLAT (which is +typically a Stateful NAT64 operated by the ISP) and there translated back to +IPv4 before being routed to the IPv4 internet. This is especially useful when +local applications on the host requires actual IPv4 connectivity or cannot +make use of DNS64 (for example because they use legacy AF_INET socket calls, +or if they are simply not using DNS64). + +**clatd** may also be used to implement an SIIT-DC Edge Relay as described in +*RFC 7756*. In this scenario, the PLAT is in reality a SIIT-DC Border Relay +(see *RFC 7755*) instead of a Stateful NAT64 (see *RFC 6146*). When used as a +SIIT-DC Edge Relay, you will probably want to manually configure the settings +`clat-v4-addr`, `clat-v6-addr`, and `plat-prefix` to mirror the SIIT-DC +Border Relay's configuration. + +It relies either on the software package TAYGA by Nathan Lutchansky or on the +kernel module nat46 by Andrew Yourtchenko for the actual translation of packets +between IPv4 and IPv6 (*RFC 6145*) TAYGA may be downloaded from its home page +at , nat46 from its repository at +. + +## Installing + +clatd is available in the following distributions: + +- [Arch (AUR)](https://aur.archlinux.org/packages/clatd-git) +- [Debian (sid)](https://packages.debian.org/search?keywords=clatd) +- [Fedora](https://packages.fedoraproject.org/pkgs/clatd/) +- [Nix](https://search.nixos.org/packages?show=clatd&type=packages&query=clatd) +- [OpenSUSE](https://software.opensuse.org/package/clatd) + +Probably others also. If clatd is not available from your distribution or +you would like to test the bleeding-edge version of **clatd** from git use +the following commands: + + $ git clone https://github.com/toreanderson/clatd + $ sudo make -C clatd installdeps start + +This will install **clatd**, dependencies, systemd services, NetworkManager +dispatcher integration scripts on your system, enable and start the +clatd.service. Really only recommended for testing. + +Beware that TAYGA isn't available in all RPM-based distros (in particular +RHEL and its clones). It is however available in EPEL (see +). + + +## Using + +For extensive usage instruction please refer to the [clatd(8)](./clatd.pod) +manpage. + +## Bugs + +If you are experiencing any bugs or have any feature requests, head over to + and submit a new issue (if +someone else hasn't already done so). Please make sure to include logs with +full debugging output (using `-d -d` on the command line or `debug=2` in +the configuration file) when reporting a bug. + +## License + +Copyright (c) 2014-2025 Tore Anderson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.pod b/clatd.pod similarity index 92% rename from README.pod rename to clatd.pod index 321231e..7e58bd2 100644 --- a/README.pod +++ b/clatd.pod @@ -74,25 +74,6 @@ exit gracefully. See the I directory in the source distribution for some examples on how to invoke it it. -=head1 INSTALLATION - -The following commands will quickly download and install the latest version -of B and its dependencies: - -=over - -=item git clone https://github.com/toreanderson/clatd - -=item sudo make -C clatd install installdeps - -=back - -This will install B to /usr/sbin, plus install systemd, and/or -NetworkManager scripts if your distribution appears to be using them, and -install all the dependencies. Note that TAYGA isn't available in all RPM-based -distros (in particular RHEL and its clones). It is however available in EPEL -(see L). - =head1 CONFIGURATION B is designed to be able to run without any user-supplied configuration @@ -476,7 +457,7 @@ not carry a prefix length. B will not attempt to perform a connectivity check to a discovered PLAT prefix before setting up the CLAT, as I suggest it should. -=head1 BUGS +=head1 REPORTING BUGS If you are experiencing any bugs or have any feature requests, head over to L and submit a new issue (if @@ -484,27 +465,11 @@ someone else hasn't already done so). Please make sure to include logs with full debugging output (using I<-d -d> on the command line or B in the configuration file) when reporting a bug. -=head1 LICENCE +=head1 COPYRIGHT -Copyright (c) 2014-2025 Tore Anderson +Copyright (c) 2014-2025 Tore Anderson . -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SPDX-License-Identifier: MIT =head1 SEE ALSO