Category Archives: Linux & Software

Abilitare la funzione di Transparent Proxy in HAProxy

Nel precedente articolo abbiamo visto come installare HAProxy per mettere online un sistema in alta affidabilità. In questo nuovo articolo ci troveremo ad utilizzare una funzionalità molto utile nel mondo dei load balancer: il Transparent Proxy.

Vuoi dare un’occhiata alla mia guida sull’installazione di HAProxy su Debian? Clicca qui.

Il primo scoglio che ci troviamo ad affrontare è quello di non avere possibilità di tenere traccia dell’IP sorgente all’interno del nostro cluster, in quanto HAProxy effettua un routing delle connessioni. Avremo quindi, nei nostri server, solamente connessioni che arrivano dal bilanciatore di carico. Per ovviare a questo problema il Kernel Linux ha introdotto la capacità di rendere trasparenti le connessioni che passano attraverso le nostre Linux box. Questo rimane utile ad esempio nei cluster mail, dove c’è avremo messo delle liste DNSBL o qualunque altro controllo sull’hostname o IP sorgente.

Eccoti una panoramica sulle tecnologie utilizzate per l‘IP Reputation sui mail server

Come funziona TPROXY

La funzione TPROXY o transparent proxy è possibile grazie alla funzione DIVERT di IPTables. Tale funzionalità, ormai già presente out-of-the-box in praticamente tutte le distribuzioni Linux con Kernel recenti effettua un mark di tutti i pacchetti in arrivo e ne riscrive l’ip sorgente prima di mandarlo alle catene di INPUT.

Il Kernel, grazie al mark precedentemente impostato, avrà la possibilità di tener traccia delle connessioni in arrivo e ne sceglierà il routing in maniera appropriata, tenendo conto delle regole da noi impostate.

Configurazione di TPROXY con HAProxy

Per poter utilizzare questa funzionalità con HAProxy, dobbiamo prima abilitare la funzione DIVERT sul nostro bilanciatore di carico. Per fare questo inseriamo le seguenti regole:

iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 111
iptables -t mangle -A DIVERT -j ACCEPT

Queste regole attivano DIVERT e dicono a IPTables di markare i pacchetti in arrivo che sono destinate a dei socket locali. Una volta apposto il mark, il pacchetto viene accettato.

A questo punto dobbiamo creare una tabella di routing avanzata per poter consegnare i pacchetti marcati localmente:

ip rule add fwmark 111 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

A questo punto la trasparenza è stata attivata, dobbiamo infine configurare HAProxy per poterlo usare. Sarà sufficiente aggiungere nella sezione global o frontend la seguente direttiva:

source 0.0.0.0 usesrc clientip

Riavviamo HAProxy e controlliamo, nel backend di destinazione, che l’ip remoto venga correttamente loggato.

Conclusioni

Con questi semplici passi abbiamo configurato una funzione molto importante per il nostro bilanciatore di carico, che ci darà la possibilità di estendere funzionalità ai nostri backend.

Installazione di Haproxy su Debian 9

Il bilanciamento di carico è una soluzione molto utilizzata per la distribuzione di applicazioni Web orizzontalmente su più host, fornendo agli utenti un singolo punto di accesso al servizio HAProxy è uno dei più popolari software di bilanciamento del carico open source, che offre anche funzionalità di alta affidabilità e reverse proxy.

HAProxy mira a ottimizzare l’utilizzo delle risorse, massimizzare il throughput, minimizzare i tempi di risposta ed evitare il sovraccarico di ogni singola risorsa. A differenza di altri software per il bilanciamento di carico, come ad esempio LVSHAProxy lavora ad un layer del modello ISO/OSI più alto, rendendo di fatto possibile l’ispezione dei pacchetti in arrivo e il loro filtraggio. Questo può essere utile nel caso di bilanciamento di un sito internet, mentre lo è meno nel caso di altri servizi, come mail server o dns. Queste funzionalità aggiuntive però si traducono in una minore scalabilità rispetto a LVS e ad un utilizzo della CPU  più alto.

Il modello di bilanciamento di HAProxy

ha-cluster

Un modello di cluster in alta affidabilità

HAProxy è particolarmente adatto per siti Web con traffico molto elevato ed è quindi spesso utilizzato per migliorare l’affidabilità e le prestazioni del servizio Web per le configurazioni multi-server. Nell’immagine sopra possiamo vedere un setup standard in alta affidabilità per i server web che erogano un sito internet.

In questa guida vedremo come installare correttamente e configurare HAProxy su Debian come bilanciatore di carico, che poi indirizza il traffico verso i frontend.

Come pre-requisito per i migliori risultati, è necessario disporre di almeno due server Web e un server per il bilanciamento del carico. I server Web devono eseguire almeno il servizio Web di base come Apache2 o Nginx per testare il bilanciamento del carico tra di loro. Non è lo scopo di questa guida illustrarvi come installare correttamente un Web Server.

Installazione di HAProxy

come prima cosa ci colleghiamo via SSH  al nostro server bilanciatore e aggiorniamo la lista pacchetti:

apt-get update

Poi aggiorniamo il nostro server con gli ultimi pacchetti disponibili:

apt-get upgrade

infine installiamo HAProxy:

apt-get install haproxy

La configurazione di HAProxy per il bilanciamento del carico è un processo abbastanza semplice. Fondamentalmente, tutto quello che devi fare è dire a HAProxy su quale porta ascoltare e dove deve reindirizzare il traffico in arrivo.

Questo viene fatto creando un file di configurazione /etc/haproxy/haproxy.cfg. Puoi leggere le opzioni di configurazione nella pagina di documentazione HAProxy se desideri saperne di più.

Una configurazione standard può essere questa:

frontend http_front
   bind *:80
   stats uri /haproxy?stats
   default_backend http_back

backend http_back
   balance roundrobin
   server1 :80 check
   server2 :80 check

Con queste semplici regole, diciamo ad HAProxy che tutte le connessioni in arrivo sulla porta 80 devono essere reindirizzate a server1 e server2 utilizzando un algoritmo di round robin.

Diversi algoritmi di bilanciamento del carico

Gli algoritmi di bilanciamento sono utilizzati per decidere quale server sul back-end viene trasferito ogni connessione. Alcune delle opzioni utili includono quanto segue:

  • Roundrobin: ogni server viene utilizzato in turni in base al loro peso. Questo è l’algoritmo più fluido ed equo quando il tempo di elaborazione dei server rimane equamente distribuito e consente di regolare al volo i pesi del server.
  • Leastconn: viene scelto il server con il numero più basso di connessioni. Round robin viene eseguito tra server con lo stesso carico. L’utilizzo di questo algoritmo è consigliato con sessioni lunghe, come LDAP, SQL, TSE, ecc., Ma non è molto adatto per sessioni brevi come HTTP.
  • First: il primo server con gli slot di connessione disponibili riceve la connessione. I server vengono scelti dall’identificatore numerico più basso al più alto.  Quando il server raggiunge il valore maxconn, viene utilizzato il server successivo.
  • Origin: l’indirizzo IP di origine viene sottoposto a hash e diviso per il peso totale dei server in esecuzione per indicare quale server riceverà la richiesta. In questo modo lo stesso indirizzo IP del client raggiungerà sempre lo stesso server mentre i server rimangono gli stessi.

Come personalizzare il bilanciamento con HAProxy

Come abbiamo detto, HAProxy ha la possibilità di ispezionare il pacchetto e apporvi dei filtri, o decidere, in base a regole precedentemente configurate, a chi inoltrare la richiesta in arrivo. Questo ci può essere molto utile nel caso le parti della nostra applicazione web siano divise su differenti macchine. Ad esempio, abbiamo una parte backend e una parte frontend in 2 macchine separate e non sincronizzate.

Apriamo il file di configurazione di HAProxy:

vim /etc/haproxy/haproxy.cfg

Configuriamo quindi HAProxy come segue:

frontend http_front
   bind *:80
   stats uri /haproxy?stats
   acl url_admin path_beg /admin
   use_backend admin_back if url_admin
   default_backend http_back

backend http_back
   balance roundrobin
   server :80 check
   server :80 check

backend admin_back
  server :80 check

Il frontend dichiara una regola ACL denominata url_admin che si applica a tutte le connessioni con percorsi che iniziano con / admin. use_backend definisce che le connessioni che corrispondono alla condizione url_admin devono essere fornite dal back-end denominato admin_back, mentre tutte le altre richieste sono gestite dal back-end predefinito.

Sul lato backend, la configurazione imposta due gruppi di server, http_back come prima e il nuovo chiamato admin_back che i server specificamente collegano a example.com/admin.

Dopo aver fatto le modifiche richieste, riavviamo il servizio:

systemictl reload haproxy

Testare la configurazione

Grazie al parametro stats uri abbiamo detto ad HAProxy di servire le statistiche alla url

http://<IP pubblico bilanciatore>/haproxy?stats

Aprendo questo link di ritroveremo davanti una schermata così:

haproxy stats

haproxy statistics

Le statistiche contengono delle informazioni utili per il debug e il controllo dei nostri servizi in alta affidabilità.

Avere la pagina delle statistiche semplicemente aperta nel frontend, tuttavia, potrebbe non essere una buona idea. Possiamo quindi impostarle su una porta dedicata – magari protetta dal firwall – e accessibile dopo un’autenticazione.

Per fare questo dobbiamo modificare il nostro file di configurazione come segue:

listen stats
   bind *:8181
   stats enable
   stats uri /
   stats realm Haproxy\ Statistics
   stats auth username:password

ed eliminando la precedente istruzione sulle statistiche in porta 80.

Dopo aver riavviato, potete controllare che le statistiche siano servite in porta 8181 aprendo con il browser:

http: //<IP pubblico bilanciatore>:8181

Verifica che i tuoi server continuino a riportare tutto in verde quindi prova ad aprire la url di destinazione della tua webapp:

http: //<IP pubblico bilanciatore>/

Se i tuoi server di back-end hanno pagine di destinazione leggermente diverse, noterai che ogni volta che ricarichi la pagina ricevi la risposta da un altro host (questo per l’algoritmo roundrobin).

Puoi provare diversi algoritmi di bilanciamento nella sezione di configurazione o dare un’occhiata alla documentazione completa.

Conclusioni

Congratulazioni per aver configurato con successo HAProxy!

Con una configurazione di bilanciamento del carico di base, è possibile aumentare notevolmente le prestazioni e la disponibilità delle applicazioni Web. Questa guida è tuttavia solo un’introduzione al bilanciamento del carico con HAProxy, che è in grado di fare molto di più ed aiutarci nelle nostre configurazioni in alta affidabilità.

Si consiglia di sperimentare diverse configurazioni con l’aiuto dell’ampia documentazione disponibile per HAProxy e quindi iniziare a pianificare il bilanciamento del carico per l’ambiente di produzione.

Problemi di sicurezza per OpenSSL 1.1.0

Il giorno 10 novembre 2016 è stata trovata una falla di sicurezza nel pacchetto OpenSSL release 1.1.0.

La severity di questo bug è stata fissata ad “high” e, come si spiega nel security advisory riguarda la possibilità di poter effettuare attacchi DOS (Denial Of Service), ed arrivare all’effettivo crash di OpenSSL.

Fortunatamente però, la falla di sicurezza non permetterebbe l’accesso alla macchina da parte di hattacker.

Si consiglia quindi l’aggiornamento di OpenSSL alla versione 1.1.0a. Al momento una patch è già uscita, le principali distribuzioni renderanno disponibile l’aggiornamento in tempi brevi.

How-to: Installazione di Docker

Introduzione

Docker è un’applicazione che rende semplice la possibilità di utilizzare applicazioni all’interno di un container. I container sono simili alle macchine virtuali, però più portabili, e più dipendenti dalla macchina host, in quanto ne condividono le risorse hardware e il kernel.
In questo tutorial vi spiegherò come installare Docker su Ubuntu 16.04.

Prerequisiti

Per questo tutorial avrete bisogno di:

  • Installazione di Ubuntu 16.04 su macchina fisica a 64bit
  • Utente non root con i privilegi Sudo

Nota: Docker necessita di un’installazione fisica a 64 bit e una versione del kernel uguale o superiore a 3.10. Ubuntu soddisfa le seguenti richieste.

Tutti i comandi di questo tutorial dovrebbero essere lanciati da utenti NON root, se è richiesto l’accesso di root, il comando verrà preceduto da “sudo”.

Step 1: Installare Docker

Il pacchetto di installazione di Docker è presente nei repository ufficiali di Ubuntu 16.04, però potrebbe non essere aggiornato all’ultima versione, per questo è meglio utilizzare il repository ufficiale Docker, dove troveremo sempre le versioni più aggiornate.

Prima di tutto aggiorniamo il database dei pacchetti:

sudo apt-get update

Ora aggiungiamo la chiave GPG del repository di Docker nel portachiavi di sistema:

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Aggiungiamo poi il repository di Docker al nostro Ubuntu:

echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list

Aggiorniamo di nuovo la lista pacchetti:

sudo apt-get update

Sinceriamoci che la versione di Docker che andremo a installare provenga dal repository Docker e non da quello ufficiale Ubuntu:

apt-cache policy docker-engine

Dovreste ottenere un output di questo tipo:

docker-engine:
Installed: (none)
Candidate: 1.11.1-0~xenial
Version table:
1.11.1-0~xenial 500
500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
1.11.0-0~xenial 500
500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

Se tutto è andato come previsto, installiamo Docker:

sudo apt-get install -y docker-engine

A questo punto Docker dovrebbe essere stato installato, abilitato al boot e dovrebbe essere già attivo. Per conoscere lo stato di Docker digitiamo:

sudo systemctl status docker

Questo è l’output che dovremmo ricevere:

● docker.service – Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
Docs: https://docs.docker.com
Main PID: 749 (docker)

Installando Docker avrai accesso non solo al demone, ma anche all’utility docker indispensabile per poter configurare/utilizzare Docker.

Vediamo come utilizzare questo comando.

Step 2: Utilizzare Docker senza l’utilizzo di Sudo

Normalmente Docker è un comando che prevede i privilegi di Root, è per questo che dovete sempre usare sudo per poterlo usare. Tale comando però, può essere utilizzato anche dagli utenti che fanno parte del gruppo docker che è automaticamente creato in fase di installazione. Se provate quindi ad utilizzare docker con un utente differente, otterrete il seguente risultato:

docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See ‘docker run –help’.

Se volete utilizzare Docker con il vostro utente normale, dovrete aggiungervi al gruppo docker:

sudo usermod -aG docker $(whoami)

Dovrete effettuare il logout/login per rendere effettive le modifiche.

Il resto di questo tutorial assume che voi utilizziate Docker tramite un utente limitato appartenente al gruppo docker, pertanto da qui in poi sudo verrà omesso.

Step 3 — Usare il comando docker

Con Docker installato e funzionante, è l’ora di divenire familiare con la sua utility a riga di comando. Utilizzarla – come la maggior parte dei software GNU/Linux – consiste nel passargli una serie di opzioni seguite dai relativi argomenti. La sintassi ha questa forma:

docker [option] [command] [arguments]

Per vedere tutte le opzioni disponibili basterà digitare il comando:

docker

Avrete quindi un output di questo tipo:

attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container’s changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container’s filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container’s filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container or image
kill Kill a running container
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
network Manage Docker networks
pause Pause all processes within a container
port List port mappings or a specific mapping for the CONTAINER
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop a running container
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within a container
update Update configuration of one or more containers
version Show the Docker version information
volume Manage Docker volumes
wait Block until a container stops, then print its exit code

Per vedere tutte le sotto opzioni dovrete digitare:

docker docker-sottocomando --help

Per vedere le informazioni generali dovrete digitare:

docker info

Step 4: Lavorare con le immagini docker

I container Docker vengono sviluppati dalle immagini Docker. Normalmente si possono prendere delle immagini preconfigurate direttamente dal Docker Hub, un repository di immagini gestito dalla società che ha creato Docker. Molte volte troverete l’immagine che cercate direttamente nel Docker Hub.

Per controllare il corretto accesso al Docker Hub digitate:

docker run hello-world

L’output che dovreste ricevere è:

Hello from Docker.
This message shows that your installation appears to be working correctly.

Potete cercare le immagini Docker utilizzando il comando search:

docker search ubuntu

Lo script prenderà i dati dal Docker Hub e vi restituirà un output simile a questo:

NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s… 3808 [OK]
ubuntu-upstart Upstart is an event-based replacement for … 61 [OK]
torusware/speedus-ubuntu Always updated official Ubuntu docker imag… 25 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of… 24 [OK]
ubuntu-debootstrap debootstrap –variant=minbase –components… 23 [OK]
nickistre/ubuntu-lamp LAMP server on Ubuntu 6 [OK]
nickistre/ubuntu-lamp-wordpress LAMP on Ubuntu with wp-cli installed 5 [OK]
nuagebec/ubuntu Simple always updated Ubuntu docker images… 4 [OK]
nimmis/ubuntu This is a docker images different LTS vers… 4 [OK]
maxexcloo/ubuntu Docker base image built on Ubuntu with Sup… 2 [OK]
admiringworm/ubuntu Base ubuntu images based on the official u… 1 [OK]

Una volta che hai identificato l’immagine che ti interessa, la puoi scaricare tramite il comando pull:

docker pull ubuntu

Una volta che l’immagine è stata scaricata, potete utilizzarla utilizzando l’istruzione run

docker run ubuntu

Per avere una lista delle immagini scaricate, utilizzate l’istruzione images:

docker images

Dovreste ricevere un output simile a questo:

REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest c5f1cf30c96b 7 days ago 120.8 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B

Queste immagini potranno poi essere modificate per creare altre immagini Docker, ed essere inviate (pushed) al Docker Hub e ad altri registry Docker.

Step 5: Utilizzare un container Docker

Prendendo come esempio l’immagine di Ubuntu scaricata in precedenza, utilizzatela facendo il deploy di un nuovo container:

docker run -it ubuntu

le opzioni -i e -t vi forniranno una console interattiva collegata al container.

Il prompt dei comandi quindi dovrà cambiare, in questo modo si entrerà dentro il container:

root@d9b100f2f636:/#

Come vedete, potete lavorare all’interno del container con le credenziali di root.

A questo punto, potete lavorare dentro al container utilizzando le più comuni utility GNU/Linux. Ad esempio installiamo postfix:

apt-get install -y postfix

Step 6: Controllare i tuoi container

Dopo aver utilizzato Docker per un po’, avrete diversi container attivi o meno. Per vedere i container attivi digitate:

docker ps

Avrete un output simile a questo.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7c79cc556dd ubuntu “/bin/bash” 3 hours ago Up 3 hours silly_spence

Per vedere tutti i container, attivi e passivi digitate:

docker ps -a

Per vedere l’ultimo container creato digitate:

docker ps -l

Per fermare un container digitate:

docker stop container-id

Il container-id può essere trovato utilizzando il comando docker ps

Conclusione

Docker è uno strumento molto completo, e c’è molto da imparare per poterlo usare al meglio. Con questo tutorial però potrete già iniziare a usare Docker per i vostri progetti o per apprendimento.

Liberamente tratto da Digital Ocean

Installazione della Chiavetta Onda MDC655 su Linux

Mi sono trovato in mano una Chiavetta TIM Onda MDC655 – quella della Ducati per intendersi -. Vediamo come utilizzarla su Linux senza installare il programma fornito da TIM.

Non mi sono mai piaciuti i programmi per le chiavette 3g/4g forniti dagli operatori telefonici (per Linux sono anche molto rari). Li trovo poco estetici e malfunzionanti. Per questo sono un grande fan di usb_modeswitch, software per far funzionare gran parte di questi device su Linux nativamente con wvdial. La Onda Ducati non è presente nella lista dei device supportati da usb_modeswitch, però è possibile utilizzarla ugualmente.

Prima di tutto installiamo usb_modeswitch:

apt-get install usb_modeswitch

Una volta inserito il device nella porta USB del pc, facendo un listato delle periferiche USB attaccate avremo:

lsub


[...]
Bus 001 Device 005: ID 1ee8:004a
[...]

Controllando il log del kernel avremo qualcosa simile a:

[ 9.840656] scsi 2:0:0:0: CD-ROM ONDA Datacard CD-ROM 0001 PQ: 0 ANSI: 0
[ 9.848203] scsi 2:0:0:1: Direct-Access ONDA Mass Storage 0001 PQ: 0 ANSI: 0
[ 9.856191] sd 2:0:0:1: [sdb] Attached SCSI removable disk
[ 9.857775] usb-storage: device scan complete
[ 9.934764] sr0: scsi3-mmc drive: 0x/0x caddy
[ 9.937760] Uniform CD-ROM driver Revision: 3.20
[ 9.940994] sr 2:0:0:0: Attached scsi CD-ROM sr0

Per poter effettuare lo switch al modem, dovremo digitare:

usb_modeswitch --default-vendor 0x1ee8 --default-product 0x004a --message-content 555342431234567800000000000010ff000000000000000000000000000000

Controlliamo di nuovo la lista dei device attaccati, dovremmo avere qualcosa simile a:

lsusb


[...]
Bus 001 Device 005: ID 1ee8:0049
[...]

e se controlliamo di nuovo i log del kernel avremo:

[ 96.663358] cdc_acm 1-3:1.0: ttyACM0: USB ACM device
[ 96.665830] cdc_acm 1-3:1.2: ttyACM1: USB ACM device
[ 96.669966] usbcore: registered new interface driver cdc_acm
[ 96.671791] cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters
[ 96.699277] usb0: register 'cdc_ether' at usb-0000:00:1d.7-3, CDC Ethernet Device, 02:8b:78:ec:ce:09
[ 96.701702] usbcore: registered new interface driver cdc_ether

La nostra pennetta ha effettuato lo switch come modem. Andiamo ora a configurare wvdial, questa è la configurazione per TIM:

vim /etc/wvdial.conf


[Dialer Defaults]
Modem = /dev/ttyACM1
ISDN = off
Modem Type = Analog Modem
Baud = 921600
Init1 = ATZ
Init2 = AT+CGDCONT=1,"IP","ibox.tim.it"
Phone = *99#
Dial Command = ATDT
Dial Attempts = 1
Ask Password = off
Username = " "
Password = " "
Auto Reconnect = on
Abort on Busy = off
Carrier Check = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = on
Idle Seconds = 0
Auto DNS = on

Chiudiamo e proviamo a connetterci:

wvdial

Se ci viene restituito un errore, proviamo a cambiare

Modem = /dev/ttyACM1

con

Modem = /dev/ttyACM0